lcd驱动移植的分析linux3.2内核,chipsee为例,液晶屏AT070TN92
2013-12-18 14:04
519 查看
Board-am335x.c的分析
1.添加了一行代码:
LCD控制器初始化,支持这个LCD屏,可以修改bpp,这里是16色
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/197c196304736dcd61e37c5233f87ec6)
这就限定了bpp的取值只能是16,上面的第二行的16表示, //@@max_bpp
第三行的16表示, //@@min_bpp
还有下面的内容,对其中的参数进行一系列的设置:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/51ef3c225ca5bd3d80730d2a9c90c0e0)
2.接下来,涉及到上面的这个新的结构体的一条信息如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/a64895b58ab81235f290c829288b9551)
现在对于INNOLUX_TN92_pdata、还有LSA40AT9001_pdata为什么这样命名不清楚,大致猜测的是和类型相关,并且和另外一个da8xx-fb.c有关联。
3.接下来的是lcdc_init里面的对应添加的一些信息,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/1e91a314bcc20b8a444168d0b9a7aacc)
4.接下来就分析这个lcdc_init函数是在哪里进行了调用,但是,查看代码就会发现,并没有直接的调用这个函数,首先做了如下的工作:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/12ecd6759168ca7a7e8d5b2f208c3ee1)
在一个static struct evm_dev_cfg 类型的结构体 evm_chipsee_som_dev_cfg[]里将lcdc_init 作为一个成员加载进去了,所以接下来的分析就是这个结构体在哪里被使用了,分析如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/3dfb25a39eb597a4434e081ae929e565)
这个结构体 evm_chipsee_som_dev_cfg在一个名为 setup_chipsee_som的函数里被调用了,用的是一个_configure_device(CHIPSEE_SOM, evm_chipsee_som_dev_cfg , PROFILE_NONE)
所以还是要分析一下,这个名为 setup_chipsee_som的函数又是在哪里被调用了,分析如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/70246f6ad8619d7ce37a3028b982fae8)
*****************************************************************************************************************************************************************************************
这里也只是列出了这个函数的很小一部分,上面的那个名为 setup_chipsee_som的函数是在am335x_evm_setup这个函数中被调用的,从而又会有一个疑问,那这个am335x_evm_setup函数又是在什么地方被使用了,分析如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/e8ca649e8241327dbc472ff2d32f9bdc)
也是间接的使用方式,这个am335x_evm_setup函数被作为一个函数指针传递给一个结构体成员,这个结构体类型是 static struct at24_platform_data,该结构体名为 am335x_baseboard_eeprom_info,所以接下来就要知道,这个结构体在哪里使用了,怎么使用的,分析如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/909ad084e960378fd37ff400b371eeb0)
上面的那个名为am335x_baseboard_eeprom_info的结构体又是作为另外一个名为am335x_i2c0_boardinfo[]的结构体数组的元素,也是属于间接调用的情况,这个结构体数组的类型是 static struct i2c_board_info ,所以说接下来还是要对am335x_i2c0_boardinfo[]这个结构体数组的调用情况进行分析,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/45c733f7d9ee60f21545e31b88416d3a)
am335x_i2c0_boardinfo[]这个结构体数组是在一个名为 am335x_evm_i2c_init的函数中进行的调用,用到的函数为 omap_register_i2c_bus(1, 100 , am335x_i2c0_boardinfo, ARRAY_SIZE(am335x_i2c0_boardinfo)),这个函数具体怎么实现先不去理会,下面还是分析一下,am335x_evm_i2c_init函数是在哪里被使用了,分析如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/d2459f42aaba3550e03eb973aa0575ea)
可以看出,是在am335x_evm_init函数里调用了am335x_evm_i2c_init这个函数,而同时,am335x_evm_init这个函数又恰好是这个board-am335x.c文件的核心函数,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/5d318a8d4bef5e2efa7a45f8defe3fd7)
5.在这篇文档的下面的标志出现之前:
****************************************************************************************************************************************************************************************
的那一部分的分析,是可以修改并且进行添加的,至于后面的那些信息(当然是指在这之前并且在上面的标志之后的那一部分分析),我比较了一下chipsee的内核包还有官方包,里面的对应部分是一样的。只是做一下提示。
****************************************************************************************************************************************************************************************
6.下面的这一部分就是我根据上面的理解做出的一些修改:
首先找到am335x_evm_setup这个函数,里面的一小部分信息如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/21f5ff7e964c9269327f963fd23559c4)
现在找到setup_beagleboneblack这个函数如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/d7bf2e5e9cbe079d31a82ca054ac33b4)
需要将beagleboneblack_dev_cfg这个结构体进行完善,主要是添加上只和LCD相关的那部分信息,这个还需要对比进行了解:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/25e1656cdc771f19295a1724cdeaf60d)
主要就是上面的那一部分用蓝色框标志出的一部分,对于lcdc_init的信息上面已经大致说明了一下, 因为要修改其中的一些东西,所以我就列一下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/73711af789057ab31421f1dc4de81c6e)
而下面这个是chipsee的内核包里的那个:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/112cee5a7acce79780c3aa4cefed02ea)
我改成了BEAGLE_BONE_BLACK是因为在setup_beagleboneblack这个函数里,有一个函数_configure_device()的首项是这个,这个和chipsee的那个类似,而对于INNOLUX_TN92_pdata在之前已经改过,这个也没有多大的依赖关系,可以不用改了。
是关于另外一个涉及到LCD的函数,chipsee_backlight_init这个函数,分析如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/d14928d7b13883ee1cfe893b3d58c56a)
大致就是将gpio3_17输出高电平,这样的话相当于是将LCD的背光电源使能,之所以是gpio3_17,主要还是因为原理图上的原因,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/e801cee283fbb0308d4b7d6797e0ce2c)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/3a8cbfda711ac76eddc84e7f962c9f85)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/2994f8efdc9526a9fc5d75cd77bb2399)
所以,如果说用到LCD背光,则LED+需要有电压,因此,就要求输出控制信号,就要相应的对gpio口进行操作。
里面涉及到了一个chipsee_backlight_mux,下面就来看一下这个是什么含义:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/f9a58b5916ccd5b43a61a266dd707eb4)
是一个结构体数组,可以将这个结构体数组还有上面的那个函数,移植到开发包里,这一部分就算没了,因为没有太多的依赖关系,下面还是接着分析,剩下的那些和LCD相关的信息:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/561db9ad33a5f6b6144b19609a85c9ad)
这个tsc_init是和触摸屏相关的东西,touch screen,里面涉及的那些信息,一一列举如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/358235afae77a8e7a45187f7999d8b17)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/8081760f90bd5518e80fd8593682de16)
这一部分信息可以直接添加进去,然后修改一下对应的部分就可以了。
注意:这一部分虽然现在看起来没啥大事,但是,到后来编译内核的时候就出现了问题,提示说找不到am33xx_register_tsc这个函数,后来在网上搜索也是没有得到一个满意的答案,最后,对于这一部分的修改,稍微的做了一些变化,至于是不是这样去改,还要进一步测试才可以:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/ca00cc8b149b1851b92ef5a15f00abbd)
这个并没有动,还是上面的那个,接下来的就不大一样了:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/588e48d0ae65a53c0b3001bf19fb3261)
接下来就分析类型为static struct mfd_tscadc_board 名为tscadc这个结构体在哪里被调用就可以了,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/385df0a6b927e8471ed5675c49adf6fa)
所以,实际上调用的就是am33xx_register_mfd_tscadc()这个函数,而不是之前的那个am33xx_register_tsc那个函数,当然,这也仅仅是我自己的理解,现在就要看看mfd_tscadc_init在哪里被使用了,具体如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/09c83292e6297002179014111ea72d27)
其实就是用这个mfd_tscadc_init替代了之前的那个tsc_init,至于这样做可不可以,目前还不清楚,这是对触摸屏的支持,相比之下,要多了一个adc的东西,反正,我理解的就是上面这些,然后这样改好之后,再重新进行编译就通过了,虽然也报了几个警告,但是,都是一些函数没有被使用的警告。
7.关于这个文件的操作大致就是上面这些了,这个文件是kernel/arch/arm/mach-omap2/board-am335x.c文件,主要就是这些介绍了,之后就可以保存一下,进行操作。
8.经过进一步的查证,发现,在这个文件里,都是platform_device_register()而不是platform_driver_register()函数,而在drivers/video/da8xx-fb.c里就有了对应的platform_driver_register()这个函数,这样,就大致清楚了这两个文件的关系了。
9.下面的内容是12.17日做的,是关于drivers/video/da8xx-fb.c和kernel/arch/arm/mach-omap2/board-am335x.c的关系,其实,整体来说就是这样,如果说lcd根本不显示,那么是后面的那个文件中初始化的时候没有加上液晶屏的初始化,如果初始化之后显示了,但是显示的不正确,就是对应的lcd控制器设置的有问题了,这时候就要考虑前面的那个文件,整体来讲就是这样了,后者不只是提供了lcd的背光支持,也有一部分的lcd控制器初始化的操作,这几点是参考了一些介绍,当然,具体是不是还需要实际的测试
10.下面就列出来参考的网站:
http://tuzhaoliang.blog.163.com/blog/static/210081126201210553252246/
http://blog.chinaunix.net/uid-28458801-id-3447011.html
/article/3506745.html
http://bbs.eeworld.com.cn/thread-354811-1-1.html
11.下面就是一些联系:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/85da4c36463225046dfcce98d0ce4e0c)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/274ba85eea71bb9929f56d6a660a370b)
12.上面的仅仅是一些猜想,我也不大确定,现在我将这些添加进去的时候,编译没有出错,我可以尝试删掉da8xx-fb.c的那个结构体,看看是否有错,如果有,说明二者之间确实存在着这种依赖关系,(但是,这样做之后并不影响编译的结果,究竟是何原因,那二者之间的联系在哪里?)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/032339129b685b5e9a9c42fe13c0d90d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201312/4bef27a15664b9f9865963b1ef654cd7)
13.上面的分析中少了关于触摸屏的信息,触摸屏也是涉及到另外一个文件,是drivers/input/touchscreen/ti_tsc.c或者是drivers/input/touchscreen/ti_tscadc.c,其中chipsee的是后面的那个,而官方包里的是前面的那个,里面少了一些设置的信息。
14.关于这一部分还有da8xx-fb.c的那一部分的分析,还是要进一步了解。
1.添加了一行代码:
LCD控制器初始化,支持这个LCD屏,可以修改bpp,这里是16色
这就限定了bpp的取值只能是16,上面的第二行的16表示, //@@max_bpp
第三行的16表示, //@@min_bpp
还有下面的内容,对其中的参数进行一系列的设置:
2.接下来,涉及到上面的这个新的结构体的一条信息如下:
现在对于INNOLUX_TN92_pdata、还有LSA40AT9001_pdata为什么这样命名不清楚,大致猜测的是和类型相关,并且和另外一个da8xx-fb.c有关联。
3.接下来的是lcdc_init里面的对应添加的一些信息,如下:
4.接下来就分析这个lcdc_init函数是在哪里进行了调用,但是,查看代码就会发现,并没有直接的调用这个函数,首先做了如下的工作:
在一个static struct evm_dev_cfg 类型的结构体 evm_chipsee_som_dev_cfg[]里将lcdc_init 作为一个成员加载进去了,所以接下来的分析就是这个结构体在哪里被使用了,分析如下:
这个结构体 evm_chipsee_som_dev_cfg在一个名为 setup_chipsee_som的函数里被调用了,用的是一个_configure_device(CHIPSEE_SOM, evm_chipsee_som_dev_cfg , PROFILE_NONE)
所以还是要分析一下,这个名为 setup_chipsee_som的函数又是在哪里被调用了,分析如下:
*****************************************************************************************************************************************************************************************
这里也只是列出了这个函数的很小一部分,上面的那个名为 setup_chipsee_som的函数是在am335x_evm_setup这个函数中被调用的,从而又会有一个疑问,那这个am335x_evm_setup函数又是在什么地方被使用了,分析如下:
也是间接的使用方式,这个am335x_evm_setup函数被作为一个函数指针传递给一个结构体成员,这个结构体类型是 static struct at24_platform_data,该结构体名为 am335x_baseboard_eeprom_info,所以接下来就要知道,这个结构体在哪里使用了,怎么使用的,分析如下:
上面的那个名为am335x_baseboard_eeprom_info的结构体又是作为另外一个名为am335x_i2c0_boardinfo[]的结构体数组的元素,也是属于间接调用的情况,这个结构体数组的类型是 static struct i2c_board_info ,所以说接下来还是要对am335x_i2c0_boardinfo[]这个结构体数组的调用情况进行分析,如下:
am335x_i2c0_boardinfo[]这个结构体数组是在一个名为 am335x_evm_i2c_init的函数中进行的调用,用到的函数为 omap_register_i2c_bus(1, 100 , am335x_i2c0_boardinfo, ARRAY_SIZE(am335x_i2c0_boardinfo)),这个函数具体怎么实现先不去理会,下面还是分析一下,am335x_evm_i2c_init函数是在哪里被使用了,分析如下:
可以看出,是在am335x_evm_init函数里调用了am335x_evm_i2c_init这个函数,而同时,am335x_evm_init这个函数又恰好是这个board-am335x.c文件的核心函数,如下:
5.在这篇文档的下面的标志出现之前:
****************************************************************************************************************************************************************************************
的那一部分的分析,是可以修改并且进行添加的,至于后面的那些信息(当然是指在这之前并且在上面的标志之后的那一部分分析),我比较了一下chipsee的内核包还有官方包,里面的对应部分是一样的。只是做一下提示。
****************************************************************************************************************************************************************************************
6.下面的这一部分就是我根据上面的理解做出的一些修改:
首先找到am335x_evm_setup这个函数,里面的一小部分信息如下:
现在找到setup_beagleboneblack这个函数如下:
需要将beagleboneblack_dev_cfg这个结构体进行完善,主要是添加上只和LCD相关的那部分信息,这个还需要对比进行了解:
主要就是上面的那一部分用蓝色框标志出的一部分,对于lcdc_init的信息上面已经大致说明了一下, 因为要修改其中的一些东西,所以我就列一下:
而下面这个是chipsee的内核包里的那个:
我改成了BEAGLE_BONE_BLACK是因为在setup_beagleboneblack这个函数里,有一个函数_configure_device()的首项是这个,这个和chipsee的那个类似,而对于INNOLUX_TN92_pdata在之前已经改过,这个也没有多大的依赖关系,可以不用改了。
是关于另外一个涉及到LCD的函数,chipsee_backlight_init这个函数,分析如下:
大致就是将gpio3_17输出高电平,这样的话相当于是将LCD的背光电源使能,之所以是gpio3_17,主要还是因为原理图上的原因,如下:
所以,如果说用到LCD背光,则LED+需要有电压,因此,就要求输出控制信号,就要相应的对gpio口进行操作。
里面涉及到了一个chipsee_backlight_mux,下面就来看一下这个是什么含义:
是一个结构体数组,可以将这个结构体数组还有上面的那个函数,移植到开发包里,这一部分就算没了,因为没有太多的依赖关系,下面还是接着分析,剩下的那些和LCD相关的信息:
这个tsc_init是和触摸屏相关的东西,touch screen,里面涉及的那些信息,一一列举如下:
这一部分信息可以直接添加进去,然后修改一下对应的部分就可以了。
注意:这一部分虽然现在看起来没啥大事,但是,到后来编译内核的时候就出现了问题,提示说找不到am33xx_register_tsc这个函数,后来在网上搜索也是没有得到一个满意的答案,最后,对于这一部分的修改,稍微的做了一些变化,至于是不是这样去改,还要进一步测试才可以:
这个并没有动,还是上面的那个,接下来的就不大一样了:
接下来就分析类型为static struct mfd_tscadc_board 名为tscadc这个结构体在哪里被调用就可以了,如下:
所以,实际上调用的就是am33xx_register_mfd_tscadc()这个函数,而不是之前的那个am33xx_register_tsc那个函数,当然,这也仅仅是我自己的理解,现在就要看看mfd_tscadc_init在哪里被使用了,具体如下:
其实就是用这个mfd_tscadc_init替代了之前的那个tsc_init,至于这样做可不可以,目前还不清楚,这是对触摸屏的支持,相比之下,要多了一个adc的东西,反正,我理解的就是上面这些,然后这样改好之后,再重新进行编译就通过了,虽然也报了几个警告,但是,都是一些函数没有被使用的警告。
7.关于这个文件的操作大致就是上面这些了,这个文件是kernel/arch/arm/mach-omap2/board-am335x.c文件,主要就是这些介绍了,之后就可以保存一下,进行操作。
8.经过进一步的查证,发现,在这个文件里,都是platform_device_register()而不是platform_driver_register()函数,而在drivers/video/da8xx-fb.c里就有了对应的platform_driver_register()这个函数,这样,就大致清楚了这两个文件的关系了。
9.下面的内容是12.17日做的,是关于drivers/video/da8xx-fb.c和kernel/arch/arm/mach-omap2/board-am335x.c的关系,其实,整体来说就是这样,如果说lcd根本不显示,那么是后面的那个文件中初始化的时候没有加上液晶屏的初始化,如果初始化之后显示了,但是显示的不正确,就是对应的lcd控制器设置的有问题了,这时候就要考虑前面的那个文件,整体来讲就是这样了,后者不只是提供了lcd的背光支持,也有一部分的lcd控制器初始化的操作,这几点是参考了一些介绍,当然,具体是不是还需要实际的测试
10.下面就列出来参考的网站:
http://tuzhaoliang.blog.163.com/blog/static/210081126201210553252246/
http://blog.chinaunix.net/uid-28458801-id-3447011.html
/article/3506745.html
http://bbs.eeworld.com.cn/thread-354811-1-1.html
11.下面就是一些联系:
12.上面的仅仅是一些猜想,我也不大确定,现在我将这些添加进去的时候,编译没有出错,我可以尝试删掉da8xx-fb.c的那个结构体,看看是否有错,如果有,说明二者之间确实存在着这种依赖关系,(但是,这样做之后并不影响编译的结果,究竟是何原因,那二者之间的联系在哪里?)
13.上面的分析中少了关于触摸屏的信息,触摸屏也是涉及到另外一个文件,是drivers/input/touchscreen/ti_tsc.c或者是drivers/input/touchscreen/ti_tscadc.c,其中chipsee的是后面的那个,而官方包里的是前面的那个,里面少了一些设置的信息。
14.关于这一部分还有da8xx-fb.c的那一部分的分析,还是要进一步了解。
相关文章推荐
- 基于ARM9处理器的linux-2.6.32.2操作系统内核移植手记part5.2(LCD驱动源码分析及移植之platform driver)
- Linux-4.9.2内核在mini2440上的移植(九)——LCD驱动移植
- linux-2.6.26.5内核的 lcd驱动移植 lcd 触摸屏移植 tslib-1.4移植
- Linux4.3.2内核自带LCD驱动移植
- [ARM-LINUX]移植2.6.31.12内核到立宇泰ARMSYS2440开发板之LCD驱动+触摸屏驱动
- Linux-2.6.32.2内核在mini2440上的移植(七)---LCD驱动移植
- ARM9开发板FL2440移植Linux-3.0内核————MMC和LCD驱动
- linux-2.6.26.5内核的 lcd驱动移植 lcd 触摸屏移植 tslib-1.4移植
- linux-2.6.32内核LCD驱动移植
- linux-2.6.26.5内核的 lcd驱动移植 lcd 触摸屏移植 tslib-1.4移植 (转)
- 基于tiny210v2的linux-3.9.6内核驱动移植3:LCD移植
- 移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动
- linux-2.6.26.5内核的 lcd驱动移植…
- 基于linux-2.6.38.8内核的SDIO/wifi驱动分析&&android 平台USB wifi驱动移植及使用 SDIOwifi
- linux-2.6.35内核移植—LCD驱动的添加
- Linux-2.6.32.67内核裁剪与移植之LCD驱动的移植(2)
- linux-2.6.26.5内核的 lcd驱动移植…
- Linux-2.6.32.2内核在mini2440上的移植----增加LCD背光驱动
- 【引用】Linux-2.6.32.2内核在mini2440上的移植(七)---LCD驱动移植
- 移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动