AM335x(TQ335x)学习笔记——LCD驱动移植

发布者:InspiredDreamer最新更新时间:2015-08-19 来源: eefocus关键字: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. 1. 匹配内核驱动的关键词是:"ti,tilcdc,panel",可以通过这个关键字找到相应的驱动。  
  2. 2. 管脚配置在节点lcd_pins_s0内  
  3. 3. panel-info中可以配置LCD的硬件信息,如LCD的分辨率等  
  4. 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"有相关的记载,该文件中有形象的描述,具体如下:

  1. +----------+-------------------------------------+----------+-------+  
  2. |          |        ↑                            |          |       |  
  3. |          |        |vback_porch                 |          |       |  
  4. |          |        ↓                            |          |       |  
  5. +----------#######################################----------+-------+  
  6. |          #        ↑                            #          |       |  
  7. |          #        |                            #          |       |  
  8. |  hback   #        |                            #  hfront  | hsync |  
  9. |   porch  #        |       hactive              #  porch   |  len  |  
  10. |<-------->#<-------+--------------------------->#<-------->|<----->|  
  11. |          #        |                            #          |       |  
  12. |          #        |vactive                     #          |       |  
  13. |          #        |                            #          |       |  
  14. |          #        ↓                            #          |       |  
  15. +----------#######################################----------+-------+  
  16. |          |        ↑                            |          |       |  
  17. |          |        |vfront_porch                |          |       |  
  18. |          |        ↓                            |          |       |  
  19. +----------+-------------------------------------+----------+-------+  
  20. |          |        ↑                            |          |       |  
  21. |          |        |vsync_len                   |          |       |  
  22. |          |        ↓                            |          |       |  
  23. +----------+-------------------------------------+----------+-------+  
AM335x的技术参考手册中可以找到相关的寄存器解释,如下:

 

综合这三份资料,很容易确定下LCD的屏的时序参数的范围(需要强调的是,上述参数不一定精确,还需要使用图片实机测下效果),经过多次实验,最终确定下了LCD的时序参数,详情如下:

  1. panel {  
  2.     compatible = "ti,tilcdc,panel";  
  3.     status = "okay";  
  4.     pinctrl-names = "default";  
  5.     pinctrl-0 = <&lcd_pins_s0>;  
  6.     panel-info {  
  7.         ac-bias           = <255>;  
  8.         ac-bias-intrpt    = <0>;  
  9.         dma-burst-sz      = <16>;  
  10.         bpp               = <32>;  
  11.         fdd               = <0x80>;  
  12.         sync-edge         = <0>;  
  13.         sync-ctrl         = <1>;  
  14.         raster-order      = <0>;  
  15.         fifo-th           = <0>;  
  16.     };  
  17.   
  18.     display-timings {  
  19.         800x480p62 {  
  20.             clock-frequency = <30000000>;  
  21.             hactive = <800>;  
  22.             vactive = <480>;  
  23.             hfront-porch = <214>;  
  24.             hback-porch = <40>;  
  25.             hsync-len = <4>;  
  26.             vback-porch = <20>;  
  27.             vfront-porch = <23>;  
  28.             vsync-len = <4>;  
  29.             hsync-active = <0>;  
  30.             vsync-active = <0>;  
  31.         };  
  32.     };  
  33. };  
时序确定下来之后需要关注的就是管脚配置,由于am335x集成了LCD控制,该控制器与LCD的连接方式是通过GPIO管脚复用实现的,而evm开发板与TQ335x的LCD都接在了同一个LCD控制器上,因此,直接使用原有的管脚配置即可。这一点也可以通过阅读TQ335x的原理图确认,这里我就不再分析了。[page]

(3)backlight节点分析及配置

从backlight节点中可以获得如下信息:

  1. 1. 匹配内核驱动的关键词是"pwm-backlight"。  
  2. 2. 使用的ECAP0进行PWM输出。  
  3. 3. 有8个亮度等级。  
  4. 4. 默认的亮度等级是8,也就是最亮。  
了解以上信息后需要查阅TQ335x手册,弄清楚backlight控制管脚是如何连接的。通过分析TQ335x的原理图可知,TQ335x的背光控制也是使用PWM方式控制,且该引脚接到AM335x的ECAP2_IN_PWM2_OUT管脚上,而evm开发板是接在ECAP0_IN_PWM0_OUT管脚上的,因此,需要修改DTS配置才能正常使用TQ335x的背光功能。思路是将DTS中的背光配置由EACP0改为EACP2,下面是修改的步骤:
  1. Step1. 将backlight节点中&eacp0改为&eacp2。  
  2. Step2. 将&epwmss0改为&epwmss2,并将该节点内的ecap0: ecap@48304100改成ecap0:ecap@48304100,然后将该节点中的&ecap0_pins改成&ecap2_pins。  
  3. Step3. 将ecap0_pins节点改名为ecap2_pins,然后将pinctrl-single,pins内的内容改为:0x19c MUX_MODE4。  
最后修改后的DTS相关部分如下:
  1. backlight {  
  2.     compatible = "pwm-backlight";  
  3.     pwms = <&ecap2 0 50000 0>;  
  4.     brightness-levels = <0 51 53 56 62 75 101 152 255>;  
  5.     default-brightness-level = <8>;  
  6. };  
  7.   
  8. &epwmss2 {  
  9.     status = "okay";  
  10.   
  11.     ecap2: ecap@48304100 {  
  12.         status = "okay";  
  13.         pinctrl-names = "default";  
  14.         pinctrl-0 = <&ecap2_pins>;  
  15.     };  
  16. };  
  17.   
  18. ecap2_pins: backlight_pins {  
  19.     pinctrl-single,pins = <  
  20.         0x19c MUX_MODE4 /* MCASP0_AHCLKR.eCAP2_in_PWM2_out MODE4 */  
  21.     >;  
  22. };  
这样就完成了背光功能的DTS配置。
 
(4)配置内核驱动
由于evm开发板的代码是使用ATAGS方式启动的,没有配置pwm-backlight和基于TI LCD控制器的通用panel驱动,需要通过menuconfig开启相应的配置项。通过DTS中的compatible属性可以找到pwm-backlight驱动是在drivers/video/backlight/pwm-bl.c中实现的,而panel驱动则是在drivers/gpu/drm/tilcdc/tilcdc_panel.c中实现的,阅读相应目录下的Makefile和Kconfig就可以确定出如何配置menuconfig。Makefile和Kconfig的分析过程很简单,我就不多写了,下面是通过menuconfig开启相应功能的步骤。
Step1. 执行menuconfig指令:
  1. make ARCH=arm menuconfig  
Step2. 开启通用pwm-backlight驱动和基于TI LCD控制器的通用panel驱动,配置内容如下:
  1. Graphics support  --->  
  2.     [*] Pulse-Width Modulation (PWM) Support  --->  
  3.         <*>   ECAP PWM support  
  4.         <*>   EHRPWM PWM support  
  5.     -*- Backlight & LCD device support  --->  
  6.         <*>     Generic PWM based Backlight Driver  
  7. Graphics support  --->         
  8.     Direct Rendering Manager  --->  
  9.         <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)  --->  
  10.         <*> DRM Support for TI LCDC Display Controller  
(5)编译DTB和内核
执行DTB编译指令:
  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- tq335x.dtb  
执行内核编译指令:
  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8  
 
(6)用新内核启动开发板
将新编译好的tq335x.dtb和zImage拷贝到SD卡的boot目录下,然后用SD启动开发板到u-boot命令行模式,通过u-boot指令启动内核(每次都这样启动会比较麻烦,可以通过设置u-boot的bootcmd环境变量并保存来简化此动作),启动内核的指令与前一篇文章的命令是相同的:
  1. load mmc 0 0x88000000 /boot/tq335x.dtb  
  2. load mmc 0 0x82000000 /boot/zImage  
  3. load mmc 0 0x88080000 /boot/ramdisk.img  
  4. bootz 0x82000000 0x88080000 0x88000000  
这时,可以看到开发板正常启动并且能看到熟悉的Linux小企鹅Logo,至此,就完成了am335x的LCD驱动移植,实际上是不需要我们写代码的,但需要了解内核的组织方式和DTS配置的方法。

(7)pinmux配置参数的确定方法

相信有些人看完这几篇文章之后有个疑问,就是配置pinmux的时候offset是如何确定的。配置GPIO管脚复用功能时经常用到pinctrl-single,pins = 属性,内核解析该属性后根据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都基于这个地址的。

 

以PWM背光控制为例。该功能引脚是接在ECAP2_IN_PWM_OUT上的,实际上就是AM335x的MCASP0_AHCLKR管脚,该管脚的地址也可以在Control Module的地址映射表中找到,该管脚的地址是0x44e1099c(表中是基于Control Module的offset,这个值是计算之后的),因此,在pinmux中配置该引脚时使用的offset应该是0x19c,这样就确定出了offset。
pinctrl-single,pins的第二项是function,用来指定GPIO管脚是输入还是输出,当前处于哪种模式。输入输出很容易配置,但是AM335x技术参考手册中只提到每个管脚有8中模式,即MODE0~MODE7,其中,MODE0是主模式,但是没有具体讲每个引脚的每个MODE是什么功能,这时,就需要查阅AM335x数据手册了。在AM335x数据手册MCASP0_AHCLKR的八种模式的含义,如下图:
由于我们使用的是eCAP2_in_PWM2_out功能,故使用MUX_MODE4。这就是backlight的pinmux配置时使用pinctrl-single,pins = <0x19c MUX_MODE4>的原因。[page]

 

(8)效果展示

到这里LCD的移植工作就算完成了,下面是TQ335x驱动LCD后的效果图:


(9)总结

使用DTB方式配置内核驱动一般需要以下几个步骤:

  1. Step1. 设置pinmux,配置的GPIO为相应的功能。  
  2. Step2. 设置相应的节点,关联对应的驱动。  
  3. Step3. 检查内核配置项,确保开启对应的驱动选项。  

关键字:AM335x  TQ335x  LCD  驱动移植 引用地址:AM335x(TQ335x)学习笔记——LCD驱动移植

上一篇:AM335x(TQ335x)学习笔记——触摸屏驱动编写
下一篇:AM335x(TQ335x)学习笔记——GPIO按键驱动移植

推荐阅读最新更新时间:2024-03-16 14:29

苹果也救不了JDI,或将LCD工厂卖给鸿海?
正进行营运重建的日本中小尺寸液晶面板大厂 JDI 考虑将旗下生产 iPhone 用液晶面板的白山工厂卖给鸿海转投资的夏普,双方已展开相关协商,出售额预估为 800-900 亿日圆、且 JDI 目标在 2020 年 3 月底前完成出售。 据悉,苹果的液晶面板供应商以 JDI、夏普和 LGD 为主,其中 LGD 已开始供应 OLED 面板给今秋开卖的 iPhone 使用,而苹果开始向 LGD 采购 OLED 面板的同时、预估会缩减对 LGD 的液晶面板订单,且之后可能计划追加向白山工厂、夏普的龟山工厂采购 iPhone、iPad 所需的液晶面板。 白山工厂出售案一旦成真,除了可改善 JDI 的营运之外、也可能让夏普增加订单,而
[嵌入式]
苹果也救不了JDI,或将<font color='red'>LCD</font>工厂卖给鸿海?
OLED崛起挤压中小尺寸LCD产能 出货量将逐年下滑
由于 AMOLED 技术崛起,,2015 年起,韩厂 Samsung Display、LG Display 及日厂 Japan Display 都大幅缩减中小尺寸 TFT LCD 产能,转向扩增 OLED 产能,加上平板计算机应用逐渐转向 9~13 吋,自去年起,全球中小尺寸 TFT LCD 出货量将逐年下滑,DIGITIMES Research 估计,至 2022 年将降至 18 亿片,相较 2018 年 24 亿片,年复合成长率 (CAGR)-6.9%。 DIGITIMES Research 分析师杨仁杰指出,手机应用受 AMOLED 影响最大,随着功能手机需求持续下滑,智能型手机需求成长幅度也将趋缓,整体手机用面板出货量将由
[手机便携]
STM32控制TFTLCD显示
一、用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1、色彩深度,这是一个与TFTLCD显存对应的概念;所谓色彩深度就是每个像素点需要多少位的RGB 数据表示该点的颜色信息。注意,不同的TFTLCD显示器的RGB的对应关系不一样,这个可以在LCD 控制芯片手册中找到答案。 例: 某LCD显示支持8、16、24位RGB,这些位数是指该像素点颜色由8、16、24位RGB构成,但是 R\G\B三种颜色各占的位数可以查看数据手册。 2、TFTLCD的操作分为两种: A、对控制寄存器的读写操作(即程序员将要操作LCD显存寄存器的地址设置成可读或者可写)。 B、对
[单片机]
s3c2440裸机-LCD编程(四、实现显示功能)
1.让LCD显示满屏红色 我们想要在LCD上显示出数据,所需步骤如下: a. 初始化LCD b. 使能LCD c. 获取LCD参数: fb_base, xres, yres, bpp d. 往framebuffer中写数据 1.初始化LCD工作我们在前面一节框架准备和LCD初始化已经详细介绍了。 2.使能LCD void lcd_enable() { lcd_controller_enalbe(); //会间接调用s3c2440_lcd_controller_enalbe } 3.获取LCD参数 void get_lcd_params(unsigned int *fb_base, int *xres, int
[单片机]
PIC单片机lcd显示时钟演示程序
include p16f877.inc ;*---- ; 定义 LCD 数据& 控制I/O口 LCD_DATA equ PORTB LCD_CNTL1 equ PORTB LCD_CNTL2 equ PORTA ; 定义 LCD控制相应的I/O引脚 RS equ 1 E equ 5 ; LCD 模块命令 DISP_ON EQU 0x00C ; 开显示 DISP_ON_C EQU 0x00E ; 开显示, 开指针 DISP_ON_B EQU 0x00F ; 开显示, 开指针,开闪烁 DISP_OFF EQU 0x008 ; 关显示 CLR_DISP EQU 0x001 ; 清显示的操作数 ENTRY_INC EQU 0x00
[单片机]
基于51单片机的液晶显示屏LCD1602简单计算器程序
/* S16 S12 S8 S4分别是123+ S15 S11 S7 S3分别是456- S14 S10 S6 S2分别是789* S13 S9 S5 S1分别是0 CE =/ */ /* 实现两个数的运算,每个数的位数至少可以八位 (在液晶显示屏LCD1602上显示) */ #include reg52.h typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit rs=P2^6; sbit e=P2^7; uint8 key=0,num=0; uint8 fuhao=0; //定义具体的那个符号,是加减
[单片机]
ARM9(S3C2440)的LCD显示——理论知识
今天和大家一起讨论一下S3C2440的LCD显示的问题,希望大家能够多多指教,我说的不对的地方希望大家及时帮我改正,以使我可以增长知识,才能不至于给别人的学习带来不便,呵呵 下面先看一下我从别人那转过来的一篇文章,我觉得很有用,看完之后我再说一下自己对这一块的了解,也可以先看看我的理解(下面红字标出)再看开始的这篇文章,因为我说的更通俗,O( _ )O哈哈~。 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多
[单片机]
ARM9(S3C2440)的<font color='red'>LCD</font>显示——理论知识
iSuppli:LCD TV未来四年将翻一番
   LCD TV 的出货量预计在未来四年将翻一番,主要是由于价格下降和消费需求,市场研究公司周二表示。    LCD TV的 全球出货量将以67%的年复合增长率从2008年的1.001亿美元上升到2012年的1.939亿美元,iSuppli预计。   “消费者不再需要体积庞大、沉重的且拥有较差分辨率的CRT电视,”iSuppli分析师Riddhi Patel在一份声明中说。相反,他们买更加轻薄的 LCD TV ,目前,42英寸 LCD TV 的价格不到1000美元。而在2006年第一季度,这样的 LCD TV 价格还是2000美元甚至更多。   刺激 LCD TV 蓬勃发展的另外一个因素是积极的促销,Patel说。这使得了
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved