在学习uboot时,对drivers文件夹里的这么多文件很困惑,比如/drivers/video文件夹,里面有特别多关于LCD的子文件驱动,那么uboot启动时是具体调用哪一个呢?
研究了两个小时后搞懂了,下面详细记录一下
我分析时是先从后往前分析。
首先在board/freescale文件夹里找到自己的板子,例如NXP官方是mx6ullevk(正点原子的板子是mx6ull_alientek_emmc)找到板子文件夹里的.c文件,我的是mx6ull_alientek_emmc.c 在这个文件里找到和lcd参数配置有关的代码,如下图
然后知道了关于配置的数组是displays。在搜索框全工程搜索dispalys这个数组名,看看是哪个函数调用了displays
可以看到在video.c文件中board_video_skip 函数有大量关于displays的调用,且video.c文件的目录是arch/arm/imx-common,一看就是arm架构下NXP公司写的通用文件,那一定和video.c有关了。打开这个文件。
可以很明显看出,上半部分判断LCD显示屏的名字是不是uboot环境变量中的名字,如果两者匹配,就说明OK,可以;如果不匹配,说明我程序中定义的lcd显示屏和实际用的显示屏名字不对应,那肯定没法驱动了。接下来再看这个函数的下半部分
调用了 mxs_lcd_panel_setup() 这个函数,这个函数很有讲究,我们稍后再看。
调用displays数组的函数是 board_video_skip 于是我们继续搜索 board_video_skip 这个函数,图片就不列出来了,找到是drv_video_init 这个函数调用了它
这个函数又调用了 video_init() 函数,同样,这个很重要,稍后再分析这个函数;先继续搜索是哪个函数调用了 drv_video_init
发现是 stdio_add_devices 函数调用了这个。OK 继续搜stdio_add_devices
发现是 board_r.c 文件中的 init_sequence_r[ ] 数组调用了这个函数,而这个数组又是由 board_init_r 函数调用,至此,这一连串的调用真相大白了。
现在还有两个函数没分析。 mxs_lcd_panel_setup 和 video_init 刚刚的分析只是知道了LCD的启动流程,具体是调用了哪个驱动文件,还是不知道。别急,看完这俩函数就明白了。
在video_init函数中调用了 video_hw_init 这个函数 这个函数是最重要的函数,负责了LCD的硬件初始化,全局搜索这个函数后,发现许多的driver/video中都有这个函数,这更说明了这是许多半导体芯片的配置LCD硬件初始化的函数
那么具体是哪一个文件呢??? 别忘了我们还有一个函数没分析 mxs_lcd_panel_setup 搜索一下看看,在mxsfb.c文件里
熟悉吧,这个函数里就是进一步使用了mx6ull_alientek_emmc.c中关于LCD的参数配置;特别的在同一目录下mxs_lcd_init 函数就是最终的MX6芯片配置关于LCD寄存器;同样在这个文件中也有 video_hw_init 函数 至此应该真相大白了。而video_hw_init函数包括了mxs_lcd_init 、mxs_lcd_get_panel等等等函数
所以最终的分析就是:(->符号是调用的意思)
board_init_r -> stdio_add_devices -> drv_video_init -> video_init -> video_hw_init -> mxs_lcd_init
-> board_video_skip -> mxs_lcd_panel_setup 和 displays
board_video_skip 为 video_hw_init 函数传递了LCD屏幕配置参数
好不容易看懂了,随手写一下博客,记录一下。同时https://blog.youkuaiyun.com/laohuang1122/article/details/7906480这个博客也写了有关LCD驱动的,但是他是2012年写的,有些函数和我分析的不太一样,不知道是不是因为我的uboot是2016年的缘故。这篇博客说的也有道理,也可以适当参考