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: [email protected]改成ecap0:[email protected],然后将该节点中的&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: [email protected] {
        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配置。

(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指令:

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

(5)编译DTB和内核

执行DTB编译指令:

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:1 0x88000000 /boot/tq335x.dtb
load mmc 0:1 0x82000000 /boot/zImage
load mmc 0:1 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都基于这个地址的。

以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>的原因。

(8)效果展示

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

(9)总结

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

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

本文作者:girlkoo

本文链接:http://blog.csdn.net/girlkoo/article/details/41382663

时间: 2024-10-06 21:23:04

AM335x(TQ335x)学习笔记——LCD驱动移植的相关文章

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

对于AM335x来讲,TI维护的USB驱动已经非常完善了,本文称之为移植,实际上仅仅是配置内核选项使能USB HOST/OTG功能.废话少说,直接动手开启AM335x的USB驱动配置项. Step1. 配置内核支持USB 默认的配置项没有配置USB相关的选项,但是DTS已经配置好了,我们不需要对DTS作任何修改,详细的内核配置项如下: Device Drivers ---> [*] USB support ---> [*] OTG support <*> EHCI HCD (USB

AM335x(TQ335x)学习笔记——触摸屏驱动编写

前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱动源码,单纯的配置DTS是无法完成TQ335x的触摸驱动移植工作的,因此,本文参考内核中原有的pixcir_i2c_ts驱动编写TQ335x的触摸屏(TN92)驱动. 在之前移植TQ210时,我已经编写过TQ210的触摸屏驱动,我的TQ335x还是使用的TQ210的屏,因此,难度不是很大.这里需要说

AM335x(TQ335x)学习笔记——u-boot-2014.10移植

最近移植了下u-boot-2014.10到TQ335x,如果基于am335x evm进行移植,需要修改的地方并不多. 由于TI的am335x evm开发使用了一个eeprom保存了板载配置信息,用来区分不同板子的型号的,而TQ335x没有这个eeprom,因此,需要修改eeprom相关的部分,使u-boot适应TQ335x开发板. 使用source insight查看代码,很容易发现,所有获取板载配置的部分都是通过读取eeprom获得的,因此,首选修改read_eeprom(board/ti/a

AM335x(TQ335x)学习笔记——Nand&amp;&amp;网卡驱动移植

移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前先感慨一下:TI的维护的内核真的很健壮,DTS真的很强大. 1. Nand驱动移植 阅读TQ335x的原理图可知,TQ335x的Nand连接到了GPMC上,且都是使用的相应引脚的MODE0复用功能,AM335x上上电复位后这些引脚的默认状态就处于MODE0模式,故无需进行pinmux设置,原始的DT

AM335x(TQ335x)学习笔记——Nand&amp;amp;&amp;amp;网卡驱动移植

移植完毕声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前先感慨一下:TI的维护的内核真的非常健壮,DTS真的非常强大. 1. Nand驱动移植 阅读TQ335x的原理图可知,TQ335x的Nand连接到了GPMC上,且与DTS中默认的配置吻合,此处不做不论什么改动,详情例如以下: nandflash_pins_s0: nandflash_pins_s0

AM335x(TQ335x)学习笔记——WM8960声卡驱动移植

经过一段时间的调试,终于调好了TQ335x的声卡驱动.TQ335x采用的Codec是WM8960,本文来总结下WM8960驱动在AM335x平台上的移植方法.Linux声卡驱动架构有OSS和ALSA两种架构,目前最常用的架构是ALSA,本文也使用ALSA架构对WM8960驱动进行移植. ASoC是对ALSA驱动架构的进一步封装.ASoC将ALSA驱动中的各模块抽象为三部分:Platform.Codec和Machine.Platform主要是平台硬件驱动,包括SoC的IIS模块.DMA等,在本文中

AM335x(TQ335x)学习笔记——挂载Ramdisk

上篇文章中我们已经可以通过u-boot启动内核了.可是没有可以启动成功,从内核的log中可以看出.内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramdisk供u-boot启动内核使用. (1)制作根文件系统 使用busybox构建根文件系统的步骤能够參考本博客的另外一篇文章.该文章链接例如以下: S5PV210(TQ210)学习笔记--内核移植与文件系统构建 须要补充的是,文章"S5PV210(TQ210)学习笔记--内核移植与文件系统构建&qu

AM335x(TQ335x)学习笔记——GPIO按键

还是按照S5PV210的学习顺序来,我们首先解决按键问题.TQ335x有六个用户按键,分别是上.下.左.右.Enter和ESC.开始我想到的是跟学习S5PV210时一样,编写输入子系统驱动解决按键问题,但是浏览driver/input/keyboard目录时意外的发现了gpio-keys.c,大体上看下该驱动程序,其功能是实现了通用的gpio按键.再去看了下DTS,发现DTS中有对gpio-keys的引用,于是猜到,新的内核不需要自己编写输入子系统驱动,可以通过配置DTS直接解决按键问题.本人最

AM335x(TQ335x)学习笔记——启动内核

老式的u-boot使用ATAGS的方式启动linux内核,本文使用新式的dtb方式启动内核. 我使用的内核是linux-3.17.2版本,下面开始编译内核. (1) 解压内核 tar jxf linux-3.17.2.tar.bz2 (2)配置linux内核,由于am335x在内核中都归为omap2系列,故可以使用如下命令: make ARCH=arm omap2plus_defconfig (3)编译内核: make ARCH=arm CROSS_COMPILE=arm-linux-gnuea