东山派七号STM32MP157-适配U-Boot LCD驱动 内核启动LCD打印启动信息

最近淘到一块东山派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,启动画面就成功输出打印信息了

posted @ 2024-11-08 03:26  月舞纱雨日  阅读(34)  评论(1编辑  收藏  举报