首先在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帧每秒 以上方480x272的lcd为例,计算pixclock DOTCLK = 60*(480+8+4+41)*(272+2+4+10)=9210240 pixclock = 10^12 / 9210240 ≈ 108574
需要在数组displays中加入一组新屏NE070NB-04F-19的参数。查看屏模组的规格书,规格书内容如下所示:
根据以上信息,在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 } }
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" \
根据自己开发板的LCD电路,一般需要在屏初始化前对屏执行复位操作,然后拉高屏幕使能引脚,最后点亮屏的背光。要修改的内容位于文件“board\freescale\mx6ullevk\mx6ullevk.c”的do_enable_parallel_lcd函数中。
GPIO电平控制方法如下所示:
#设置GPIO1_IO08为低电平 gpio_direction_output(IMX_GPIO_NR(1, 8) , 0);
添加完上面的内容,编译uboot,将新的uboot烧录到设备上,如果开发板的LCD屏幕能够正常显示芯片的logo,则说明新配置已经可以正确。
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 >; };
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!