IMX6ULL 添加新的RGB LCD

在Uboot和Kernel的源码中添加新的LCD配置参数的方法,以在imx6ull的uboot和kernel中添加NE070NB-04F-19为例。

一、Uboot添加LCD配置

1、添加屏幕配置

  首先在uboot源码的imx6ull的板级文件”board\freescale\mx6ullevk\mx6ullevk.c“中找到屏幕配置相关的结构体数组变量struct display_info_t const displays[],数组displays中默认已经初始化了一组名为“TFT43AB”屏参数。

结构体定义位于:“arch\arm\include\asm\imx-common\video.h”和“include\linux\fb.h”

struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,  /*使用的总线*/
	.addr = 0,  
	.pixfmt = 24,   /*每个像素的所占用的位数*/
	.detect = NULL, 
	.enable	= do_enable_parallel_lcd,
	.mode	= {
		.name			= "TFT43AB",    /*名字*/
		.xres           = 480,          /*每行像素个数*/
		.yres           = 272,          /*每列像素个数*/
		.pixclock       = 108695,       /*每个像素时钟周期的长度,单位是皮秒 计算方法((1/时钟频率)*10^12)*/
		.left_margin    = 8,            /*水平方向后肩像素个数*/
		.right_margin   = 4,        /*水平方向,前肩像素个数*/
		.upper_margin   = 2,        /*垂直方向后肩像素个数*/
		.lower_margin   = 4,        /*垂直方向前肩像素个数*/
		.hsync_len      = 41,       /*行同步脉宽*/
		.vsync_len      = 10,   /*垂直同步脉宽*/
		.sync           = 0,    /*同步极性设置*/
		.vmode          = FB_VMODE_NONINTERLACED    /*刷新模式*/
} } };

pixclock计算方法:

#时钟频率
DOTCLK = fframe × (X + HBP + HFP+HSPW) × (Y + VBP + VFP+VSPW)  (单位:Hz)
#每个像素时钟周期的长度
pixclock = 10^12*(1/DOTCLK) (单位:皮秒)

fframe表示帧数,一般刷新频率设置为60帧每秒
以上方480x272lcd为例,计算pixclock
DOTCLK = 60*(480+8+4+41)*(272+2+4+10)=9210240
pixclock = 10^12 / 9210240  108574

需要在数组displays中加入一组新屏NE070NB-04F-19的参数。查看屏模组的规格书,规格书内容如下所示:

attachments-2020-03-Pt68u45O5e832ce6ea0ac.pngattachments-2020-03-IHhsAAST5e832cf84be39.png

attachments-2020-03-KCZ7Yn6V5e833996e8aa3.png

attachments-2020-03-naAz6Ka15e8339af8e9ae.png

根据以上信息,在displays数组中添加的参数内容如下:

{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable	= do_enable_parallel_lcd,
.mode	= {
	.name			= "TFT70AB-800x480",
	.xres           = 800,
	.yres           = 480,
	.pixclock       = 10119,
	.left_margin    = 40,
	.right_margin   = 210,
	.upper_margin   = 20,
	.lower_margin   = 22,
	.hsync_len      = 6,
	.vsync_len      = 3,
	.sync           = 0,
	.vmode          = FB_VMODE_NONINTERLACED
} 
}

2、设置uboot启动的panel参数

  uboot源码加载屏幕数据的函数位于“arch\arm\imx-common\video.c”文件的“board_video_skip”函数中,分析函数可知,uboot在启动时通过获取环境变量“panel”的值来匹配加载displays数组中的哪一组参数。而环境变量“panel”的定义位于“configs\mx6ullevk.h”头文件中,所以需要把mx6ullevk.h中的环境变量“panel”的值修改为“TFT70AB-800x480”

"panel=TFT70AB-800x480\0" \

3、添加控制LCD复位/使能/背光的代码

  根据自己开发板的LCD电路,一般需要在屏初始化前对屏执行复位操作,然后拉高屏幕使能引脚,最后点亮屏的背光。要修改的内容位于文件“board\freescale\mx6ullevk\mx6ullevk.c”的do_enable_parallel_lcd函数中。

GPIO电平控制方法如下所示:

#设置GPIO1_IO08为低电平
gpio_direction_output(IMX_GPIO_NR(1, 8) , 0);

4、启动验证

  添加完上面的内容,编译uboot,将新的uboot烧录到设备上,如果开发板的LCD屏幕能够正常显示芯片的logo,则说明新配置已经可以正确。

二、kernel

1、修改dts文件,添加LCD配置

  dts文件的修改比uboot的配置多了 hsync-active\vsync-active\de-active\pixelclk-active四个属性,它们分别对应hsync、vsync、de、dclk 的极性控制。分析时钟时序图可以知道hsync和vsync低电平有效故而设置为0,DEN高电平有效所以设置为1,dclk为下降沿有效所以设置为0。

&lcdif {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_lcdif_dat
		     &pinctrl_lcdif_ctrl
		     &pinctrl_lcdif_reset>;
	display = <&display0>; //可支持同时配置多个屏参数,在驱动“drivers\video\fbdev\mxsfb.c”中选择
	status = "okay";

	display0: display {
		bits-per-pixel = <24>;  //RGB888
		bus-width = <24>;       //24根数据线
		
		display-timings {
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <35000000>;
			hactive = <800>;
			vactive = <480>;
			hfront-porch = <210>;
			hback-porch = <40>;
			hsync-len = <6>;
			vback-porch = <20>;
			vfront-porch = <22>;
			vsync-len = <3>;

			hsync-active = <0>;
			vsync-active = <0>;
			de-active = <1>;
			pixelclk-active = <1>;
			};
		};
	};
};

pinctrl_lcdif_dat: lcdifdatgrp {
	fsl,pins = <
		MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79
		MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79
		MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79
		MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79
		MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79
		MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79
		MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79
		MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79
		MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79
		MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79
		MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79
		MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79
		MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79
		MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79
		MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79
		MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79
		MX6UL_PAD_LCD_DATA16__LCDIF_DATA16  0x79
		MX6UL_PAD_LCD_DATA17__LCDIF_DATA17  0x79
		MX6UL_PAD_LCD_DATA18__LCDIF_DATA18  0x79
		MX6UL_PAD_LCD_DATA19__LCDIF_DATA19  0x79
		MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79
		MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79
		MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79
		MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79
	>;
};

pinctrl_lcdif_ctrl: lcdifctrlgrp {
	fsl,pins = <
		MX6UL_PAD_LCD_CLK__LCDIF_CLK	    0x79
		MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79
		MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79
		MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79
	>;
};

pinctrl_lcdif_reset: lcdifresetgrp {
        fsl,pins = <
			/* used for lcd reset */
            MX6UL_PAD_LCD_RESET__GPIO3_IO04  0x1f0b0
        >;
};		

参考文章

1、LCD的DE模式和HV模式,以及DITHB抖动功能
2LCD极性参数的分析
3、LCD驱动中pixclock的计算

  • 发表于 2020-03-31 20:46
  • 阅读 ( 250 )
  • 分类:nxp imx6

0 条评论

请先 登录 后评论
FU
FU

6 篇文章

作家榜 »

  1. ronnie 11 文章
  2. FU 6 文章
  3. toca 4 文章
  4. 大飞 3 文章
  5. Vivek 3 文章
  6. BBelephant 2 文章
  7. jack-fang 2 文章
  8. Bin 1 文章