AM335x(TQ335x)学习笔记——LCD驱动移植
TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示。下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路。
(1)初步分析
由于TQ335x使用的芯片是AM335x,故仍然可以参考am335x-evm.dts。当然,am335x-evmsk.dts、am335x-beagbone.dts都可以。本文以am335x-evm.dts为例。大体上浏览下DTS文件,可以发现两个醒目的节点:一个是panel,一个是backlight。接下来我们逐个分析。
(2)panel节点信息分析及配置
从panel节点可以获得如下信息:
- 1. 匹配内核驱动的关键词是:"ti,tilcdc,panel",可以通过这个关键字找到相应的驱动。
- 2. 管脚配置在节点lcd_pins_s0内
- 3. panel-info中可以配置LCD的硬件信息,如LCD的分辨率等
- 4. display-times中记录了LCD刷屏的相关时序。
其中,panel-info和display-times需要去LCD手册中查找,管脚配置需要根据AM335x的芯片手册、数据手册及TQ335x的原理图确定,驱动则需要去内核的driver目录下查找。下面,我一一解决上述几个问题:
首先是设置panel-info和display-times。我的TQ335x是用的我调试TQ210时使用的触摸屏,型号是TN92,这个屏是800*480的分辨率,因此,panel-info与evm开发板的配置是相同的,可以不做任何修改。但是,不同屏幕的display-times一般是不相同的,因此,需要查阅触摸屏的手册来确认display-times。
TN92的水平扫描时序如下表:
垂直扫描时序如下图:
但是,如果对LCD各参数不怎么熟悉的话,很难建立这两个表与DTS中display-times的关系,这时应该去查阅一下linux内核的文档和芯片手册。在内核文档:”Documentation/devicetree/bindings/video/display-timing.txt"有相关的记载,该文件中有形象的描述,具体如下:
- +----------+-------------------------------------+----------+-------+
- | | ↑ | | |
- | | |vback_porch | | |
- | | ↓ | | |
- +----------#######################################----------+-------+
- | # ↑ # | |
- | # | # | |
- | hback # | # hfront | hsync |
- | porch # | hactive # porch | len |
- |<-------->#<-------+--------------------------->#<-------->|<----->|
- | # | # | |
- | # |vactive # | |
- | # | # | |
- | # ↓ # | |
- +----------#######################################----------+-------+
- | | ↑ | | |
- | | |vfront_porch | | |
- | | ↓ | | |
- +----------+-------------------------------------+----------+-------+
- | | ↑ | | |
- | | |vsync_len | | |
- | | ↓ | | |
- +----------+-------------------------------------+----------+-------+
AM335x的技术参考手册中可以找到相关的寄存器解释,如下:
综合这三份资料,很容易确定下LCD的屏的时序参数的范围(需要强调的是,上述参数不一定精确,还需要使用图片实机测下效果),经过多次实验,最终确定下了LCD的时序参数,详情如下:
- panel {
- compatible = "ti,tilcdc,panel";
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&lcd_pins_s0>;
- panel-info {
- ac-bias = <255>;
- ac-bias-intrpt = <0>;
- dma-burst-sz = <16>;
- bpp = <32>;
- fdd = <0x80>;
- sync-edge = <0>;
- sync-ctrl = <1>;
- raster-order = <0>;
- fifo-th = <0>;
- };
- display-timings {
- 800x480p62 {
- clock-frequency = <30000000>;
- hactive = <800>;
- vactive = <480>;
- hfront-porch = <214>;
- hback-porch = <40>;
- hsync-len = <4>;
- vback-porch = <20>;
- vfront-porch = <23>;
- vsync-len = <4>;
- hsync-active = <0>;
- vsync-active = <0>;
- };
- };
- };
时序确定下来之后需要关注的就是管脚配置,由于am335x集成了LCD控制,该控制器与LCD的连接方式是通过GPIO管脚复用实现的,而evm开发板与TQ335x的LCD都接在了同一个LCD控制器上,因此,直接使用原有的管脚配置即可。这一点也可以通过阅读TQ335x的原理图确认,这里我就不再分析了。
(3)backlight节点分析及配置
从backlight节点中可以获得如下信息:
- 1. 匹配内核驱动的关键词是"pwm-backlight"。
- 2. 使用的ECAP0进行PWM输出。
- 3. 有8个亮度等级。
- 4. 默认的亮度等级是8,也就是最亮。
了解以上信息后需要查阅TQ335x手册,弄清楚backlight控制管脚是如何连接的。通过分析TQ335x的原理图可知,TQ335x的背光控制也是使用PWM方式控制,且该引脚接到AM335x的ECAP2_IN_PWM2_OUT管脚上,而evm开发板是接在ECAP0_IN_PWM0_OUT管脚上的,因此,需要修改DTS配置才能正常使用TQ335x的背光功能。思路是将DTS中的背光配置由EACP0改为EACP2,下面是修改的步骤:
- Step1. 将backlight节点中&eacp0改为&eacp2。
- Step2. 将&epwmss0改为&epwmss2,并将该节点内的ecap0: ecap@48304100改成ecap0:ecap@48304100,然后将该节点中的&ecap0_pins改成&ecap2_pins。
- Step3. 将ecap0_pins节点改名为ecap2_pins,然后将pinctrl-single,pins内的内容改为:0x19c MUX_MODE4。
最后修改后的DTS相关部分如下:
- backlight {
- compatible = "pwm-backlight";
- pwms = <&ecap2 0 50000 0>;
- brightness-levels = <0 51 53 56 62 75 101 152 255>;
- default-brightness-level = <8>;
- };
- &epwmss2 {
- status = "okay";
- ecap2: ecap@48304100 {
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&ecap2_pins>;
- };
- };
- ecap2_pins: backlight_pins {
- pinctrl-single,pins = <
- 0x19c MUX_MODE4 /* MCASP0_AHCLKR.eCAP2_in_PWM2_out MODE4 */
- >;
- };
这样就完成了背光功能的DTS配置。
- make ARCH=arm menuconfig
Step2. 开启通用pwm-backlight驱动和基于TI LCD控制器的通用panel驱动,配置内容如下:
- Graphics support --->
- [*] Pulse-Width Modulation (PWM) Support --->
- <*> ECAP PWM support
- <*> EHRPWM PWM support
- -*- Backlight & LCD device support --->
- <*> Generic PWM based Backlight Driver
- Graphics support --->
- Direct Rendering Manager --->
- <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
- <*> DRM Support for TI LCDC Display Controller
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tq335x.dtb
执行内核编译指令:
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
(6)用新内核启动开发板
将新编译好的tq335x.dtb和zImage拷贝到SD卡的boot目录下,然后用SD启动开发板到u-boot命令行模式,通过u-boot指令启动内核(每次都这样启动会比较麻烦,可以通过设置u-boot的bootcmd环境变量并保存来简化此动作),启动内核的指令与前一篇文章的命令是相同的:
- load mmc 0 0x88000000 /boot/tq335x.dtb
- load mmc 0 0x82000000 /boot/zImage
- load mmc 0 0x88080000 /boot/ramdisk.img
- bootz 0x82000000 0x88080000 0x88000000
这时,可以看到开发板正常启动并且能看到熟悉的Linux小企鹅Logo,至此,就完成了am335x的LCD驱动移植,实际上是不需要我们写代码的,但需要了解内核的组织方式和DTS配置的方法。
(7)pinmux配置参数的确定方法
相信有些人看完这几篇文章之后有个疑问,就是配置pinmux的时候offset是如何确定的。配置GPIO管脚复用功能时经常用到pinctrl-single,pins = <offset, function>属性,内核解析该属性后根据offset和function配置对应的寄存器,是GPIO管脚配置为指定的复用功能。
讲offset的确定方法之前需要指出的是,TI的GPIO控制与三星的芯片不同,三星的芯片管脚复用功能是放在GPIO寄存器中的,而TI的芯片则有个专门的控制模块叫Control Module,该模块可以控制所有的GPIO管脚功能复用;另外,与三星芯片的另外一个不同是TI的芯片分为技术参考手册和数据手册,技术参考手册非常详细的讲述同family的芯片功能及使用方法,数据手册则用来讲述同family中不同芯片特有的属性。因此,调试TI芯片时需要结合技术参考手册和数据手册,而配置GPIO则需要阅读技术手册的GPIO、Control Module两章和数据手册中相关的部分。
从am33xx.dtsi中可以看到pinmux的基地址是0x44e10800,我们先来看这个地址是怎么来的。从技术参考手册的内存映射表可以确定该地址位于L4_WKUP段内,如下图:
点击L4_WKUP超链接,可以切换到L4_WKUP的地址映射表,从该表中可以确定,该地址位于Control Module,如下图:
点击Control Module的超链接,可以切换到Control Module的地址映射表,从该表中可以找到0x44e10800地址,实际上就是conf_gpmc_ad0控制寄存器的地址,也就是说,pinmux配置时的offset都基于这个地址的。
(8)效果展示
到这里LCD的移植工作就算完成了,下面是TQ335x驱动LCD后的效果图:
(9)总结
使用DTB方式配置内核驱动一般需要以下几个步骤:
- Step1. 设置pinmux,配置的GPIO为相应的功能。
- Step2. 设置相应的节点,关联对应的驱动。
- Step3. 检查内核配置项,确保开启对应的驱动选项。
AM335x(TQ335x)学习笔记——LCD驱动移植的更多相关文章
- AM335x(TQ335x)学习笔记——USB驱动移植
对于AM335x来讲,TI维护的USB驱动已经非常完善了,本文称之为移植,实际上仅仅是配置内核选项使能USB HOST/OTG功能.废话少说,直接动手开启AM335x的USB驱动配置项. Step1. ...
- AM335x(TQ335x)学习笔记——触摸屏驱动编写
前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...
- AM335x(TQ335x)学习笔记——u-boot-2014.10移植
根据最近移植u-boot-2014.10至TQ335x,基于这样的假设am335x evm移植.不是很多地方需要改变. 因为TI的am335x evm开发了使用eeprom船上保存配置信息.它使用不同 ...
- AM335x(TQ335x)学习笔记——GPIO关键驱动移植
或按照S5PV210学习秩序.我们首先解决的关键问题.TQ335x有六个用户按钮,每个上.下.剩下.对.Enter和ESC. 我想开始学习S5PV210当同一,写输入子系统驱动器的关键问题要解决,但浏 ...
- AM335x(TQ335x)学习笔记——GPIO按键驱动移植
还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题 ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- AM335x(TQ335x)学习笔记——WM8960声卡驱动移植
经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两 ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完毕声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- AM335x(TQ335x)学习笔记——挂载Ramdisk
上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramd ...
随机推荐
- ng-show,ng-if区别
在使用bootstrap中,我们会经常用到按钮组,也就是btn-group,如果仔细观察的话,会发现一个按钮组的第一个和最后一个按钮分别是有圆角的,如下图: 但是中间的按钮是没有圆角的,这样显得比较美 ...
- vsftp实现只能上传不能下载、删除权限配置
vsftpd可以对每个用户特别限制.只要给那个用户建立一个设置文件,然后在文件里设置 在vsftpd.conf里加user_config_dir=/etc/vsftpd/vsftpd_user_con ...
- iOS-沙盒目录
///沙盒路径 + (NSString *)pathDocument{ NSFileManager *fileManager = [[NSFileManager alloc]init]; NSStri ...
- CentOS7 Nvidia Docker环境
最近在搞tensorflow的一些东西,话说这东西是真的皮,搞不懂.但是环境还是磕磕碰碰的搭起来了 其实本来是没想到用docker的,但是就一台配置较好电的服务器,还要运行公司的其他环境,vmware ...
- NOIP 2017 day -1 杂记
我几乎要崩溃了. 写任何板子都是第一遍一定写不对,后来发现是傻逼性错误. 好奇怪的,这些东西明明我都会,为什么现在我都忘了? 很烦.现在心里特别乱,写什么都写不下去. 可能我是真的无法放心这次的比赛. ...
- BZOJ 1299: [LLH邀请赛]巧克力棒 [组合游戏]
每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度. Nim游戏多了一个决策:拿出一些石堆 显然只要给对方构造异或和为0的子集就行了 暴枚子集... #include &l ...
- BZOJ 3265: 志愿者招募加强版 [单纯形法]
传送门 一个人多段区间,一样.... 不过国家队论文上说这道题好像不能保证整数解.... #include <iostream> #include <cstdio> #incl ...
- BZOJ 3884: 上帝与集合的正确用法 [欧拉降幂]
PoPoQQQ大爷太神了 只要用欧拉定理递归下去就好了.... 然而还是有些细节没考虑好: $(P,2) \neq 1$时分解$P=2^k*q$的形式,然后变成$2^k(2^{(2^{2^{...}} ...
- C#写鞍点问题
题目: 编写程序,找一找一个二维数组中的鞍点(即该位置上的元素值在行中最大,在列上最小.有可能数组没有鞍点). 要求 * 二维数组的大小.数组元素的值在运行时输入: * 程序有友好的提示信息 usin ...
- Java的一些良好习惯及细节------持续更新中...
1.在做条件判断时,不要将变量放在判断符的左边,这样做可以防止出现空指针异常,以字符串比较为例: String name = "Tom"; //这种方式不推荐,如果变量name为空 ...
