最近淘到一块东山派7号开发板,基于STM32MP157DAC,因为便宜,买过来玩。
但是韦东山的资料真的有一说一,板子出的挺多,除了卖的最好的板子,其他的资料非常非常少。。(韦老师您看到了别生气,至少因为资料少引发问题我解决了也算收获经验了。。。)
我说的是实话,因为正点原子作为国内销量最高的学习板研发制造零售一体的公司,你即使去某鱼淘一块几年前的老版本开发板,你依然能在他的官网找到对应的教程资料。像东山刚出一年的Dongshanpi PicoW,自带的sigmastar家的sdk很多bug,sdk构建rootfs、burning的过程都很模糊,官网的奶牛快传也失效好久了。。。虽然定位是最少利润的,面向高端玩家的板子,但是跟荒漠寻泉一样的开发体验真的很让人劝退你们家的产品。
但是最后还是要说一句,本人在解决问题的过程学到了很多 学习过程一切顺利的开发板 上学不到的东西。喜欢不喜欢这种感受因人而异。能接受,东山的板子又便宜性能又好(100块钱的mp157,白菜价),如果不能接受买正点的板子去。
正片开始
我按照https://github.com/DongshanPI/buildroot-external-dongshanpiseven的方法编译fs、uboot、kernel,成功boot起来
问题1:uboot屏幕不亮
出现的第一个问题,买了一块韦东山板子通用的LCD,装上之后在内核阶段成功light up,但是在uboot阶段无法点亮,包括背光。
解决过程
内核和uboot都是有对应driver的,既然buildroot主线已经适配了st官方的mp157 evaluation board,很复杂的寄存器定义和boot初始化就不需要我们动了,uboot阶段,无显示那问题肯定是uboot的设备树适配问题。
内核的设备树适配在东山的仓库里面已经做好了,所以内核阶段的lcd是正常工作的,那么接下来我们就修改uboot的dts
很轻松,我们就找到了我们想要的东西,stm32mp157c-100ask-512d-v1.dts
,就修改它
不懂怎么修改和移植?很简单,上面说到正点原子的资料很全,他们家也有mp157的板子,直接看他们的资料!
下载后打开【正点原子】STM32MP157开发板(A盘)-基础资料\09、文档教程(非常重要)\【正点原子】STM32MP1嵌入式Linux驱动开发指南V2.1.pdf
430页,可以看到如下内容
按照文章写的来操作,其中有几个地方不同
正点原子的背光引脚和韦东山的不一样,一个是PD13,一个是PE11
韦东山:
所以要改成以下:
还有这几个中断和gpio,我当初根本不懂具体连接的是啥,但是很重要,我最开始就是没加,背光亮了但是面板死活点不亮,把uboot的debug打开后重新编译,启动会输出两分钟的log才boot。。。
但是我也发现了与gpio未找到相关的错误:
simple_panel_ofdata_to_platdata : Warning: cannot get enable GPIO: ret=-5
直接在uboot源码里搜索这个函数,找到
就怀疑设备树pinctrl没设置导致的,加上就好了。应该是ltdc外设与rgb lcd控制的很重要的引脚
具体的内容是内核的设备树复制来的
在正点原子手册可以看到,这两个pinctrl设置的是设备具体的PINMUX,但是正点原子是ltdc_pins_xb,韦东山是ltdc_pins_xa
为什么是simple-panel?因为uboot里有这个通用的lcd驱动,位置在drivers/video/simple_panel.c
可以看到compatible字串的数值就是simple-panel,驱动会按照这个去设备树内寻找适配的设备,所以设备树里的名字一定不能错
再按照正点原子的文档加上时序信息即可
此时直接编译会提示找不到ltdc_ep0_out,就从linux源码的arch/arm/boot/dts/stm32mp157c-100ask-512d-lcd-v1.dts
摘抄一段ltdc的节点写到设备树的dts内
再在menuconfig里配置相关开启lcd支持的选项,加上自定义logo的bmp,具体的上网搜搜吧我就不赘述了
编译烧录直接点亮
问题2:内核启动阶段,console不显示启动信息
我一直觉得启动过程中显示一大堆文字很帅(),所以使用每款板子都会把console的log打开
相关的教程在正点原子的手册里可以看到
我设置了,没用!!!!
要是有用我就不会在这写东西了。。。
解决过程
我又折腾了两天,才找到原来正点原子里手册写的
Uboot会在内核启动的时候把bootargs传递给内核
是不一定的!!比如我这种情况
请看下面:我确实设置了console=tty1,但是就是不在lcd上显示
我很确信我的lcd是正常的,因为执行echo hello linux! > /dev/tty1
可以在lcd上输出字符串,编译内核的时候打开了BootUp Logo,还能看到linux的小企鹅logo
那为什么不会显示?是内核配置的问题吗?我替换了正点原子出厂镜像的内核到我的板子上,因为设置不同导致启动到后面会panic,但是依然没显示console log。
那肯定就是uboot的问题,我在imx6ull上改动bootargs,内核立马做出对应反应,在tty1开启与关闭log
那应该就是uboot没把我写的bootargs传递给内核
我在东山板子上使用命令dmesg | grep console
,找到了一句
就可以看到在Kernel刚上电的时候显示了一句[ 0.000000] Kernel command line:
(现在我改好了,当初这一句是没有console=tty1的)
这就是bootargs传递给内核的参数,但是我明明设置的不是这个!!!我的tty1呢,我也没有写过什么root=/dev/mmcblk1p4 rootwait rw c
肯定有东西在背后捣鬼
在buildroot源码和韦东山的buildroot配置两个仓库的位置使用万能的grep:
stm32mp157c-100ask-512d-v1_extlinux.conf
这是什么文件???是韦东山团队适配七号开发板时候编写的!原来是这个文件里面的东西覆盖了我的bootargs
可以看到在uboot上电的时候,解析了这个文件,把字串传递给了内核,怪不得不受我控制
在里面加入我想要的console=tty1
,重新编译buildroot,启动画面就成功输出打印信息了