Uboot版本: u-boot.2016.03
上一篇文章已经讲述了如何添加自定义板卡
本文讲述如何修改uboot中的LCD驱动
修改LCD驱动参数
进入board/freescale/mx6ull_jzy_emmc/mx6ull_jzy_emmc.c文件, 找到
static iomux_v3_cfg_t const lcd_pads[] 数组定义
这个数组是uboot对LCD引脚的定义
根据自身开发板修改引脚.
找到struct display_info_t const displays[] 结构体定义, 这个结构体定义LCD的具体参数, 修改成自身手头上LCD模块的参数
struct display_info_t {
int bus;
int addr;
int pixfmt;
int (*detect)(struct display_info_t const *dev);
void (*enable)(struct display_info_t const *dev);
struct fb_videomode mode;
};
struct fb_videomode {
const char *name; /* optional */
u32 refresh; /* optional */
u32 xres;
u32 yres;
u32 pixclock;
u32 left_margin;
u32 right_margin;
u32 upper_margin;
u32 lower_margin;
u32 hsync_len;
u32 vsync_len;
u32 sync;
u32 vmode;
u32 flag;
};
pixfmt是像素格式,也就是一个像素点是多少位,如果是 RGB565的话就是 16位,如果
是 888的话就是 24位,一般使用 RGB888
name:LCD名字,要和环境变量中的 panel相等。
xres、yres:LCD X轴和 Y轴像素数量。
pixclock:像素时钟,每个像素时钟周期的长度,单位为皮秒。
left_margin:HBP,水平同步后肩。
right_margin:HFP,水平同步前肩。
upper_margin:VBP,垂直同步后肩。
lower_margin:VFP,垂直同步前肩。
hsync_len:HSPW,行同步脉宽。
vsync_len:VSPW,垂直同步脉宽。
vmode:大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。
修改以后
struct display_info_t const displays[] = {{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "TFT7016",
.xres = 1024,
.yres = 600,
.pixclock = 19531,
.left_margin = 140,
.right_margin = 160,
.upper_margin = 20,
.lower_margin = 12,
.hsync_len = 20,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
} } };
修改LCD名字:
打开 mx6ull_alientek_emmc.h,找到所有如下语句:
panel=TFT43AB
将其改为:
panel=TFT7016
panel的值要与示例代码 33.2.6.4中的.name成员变量的值一致
重新编译烧写uboot即可
启动uboot之后修改emmc中的环境变量
setenv panel TFT7016
saveenv
补充:
在board/freescale/mx6ull_jzy_emmc/mx6ull_jzy_emmc.c中
有
void do_enable_parallel_lcd(struct display_info_t const *dev)
{
enable_lcdif_clock(dev->bus);
imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
/* Reset the LCD */
gpio_direction_output(IMX_GPIO_NR(5, 9) , 0);
udelay(500);
gpio_direction_output(IMX_GPIO_NR(5, 9) , 1);
/* Set Brightness to high */
gpio_direction_output(IMX_GPIO_NR(1, 8) , 1);
}
这个是LCD的使能过程.
其中gpio_direction_output(IMX_GPIO_NR(1, 8) , 1); 的第二个参数修改为0,即可关闭LCD背光.