一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的,xxx 为板子名称,
比如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件。
一般修改 LCD 驱动重点注意以下几点:
①、 LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、 LCD 背光引脚 GPIO 的配置。
③、 LCD 配置参数是否正确。
I.MX6U-ALPHA 开发板 LCD 原理图和 NXP 官方 I.MX6ULL 开发板一致,也就是 LCD 的 IO 和背光 IO 都一样的,所以 IO 部分就不用修改了。需要修改的之后 LCD 参数,打开文件 mx6ull_alientek_emmc.c,找到如下所示内容:
这个是NXP官方的LCD配置,需要将参数进行修改为ALPHA开发板屏幕,定义了一个变量 displays,类型为 display_info_t,这个结构体是 LCD信息结构体,其中包括了 LCD 的分辨率,像素格式, LCD 的各个参数等。 display_info_t 定义在文件 arch/arm/include/asm/imx-common/video.h 中,定义如下:
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;
};
pixfmt是像素格式,也就是一个像素点是多少位,如果是RGB565的话就是16位,如果是888的话就是24位,一般使用RGB88。结构体display_info_t还有个mode成员变量,此成员变量也就是个结构体,为fb_videomode,定义在include/linux/fb.h中,定义如下:
struct fb_videomode {
2 const char *name; /* optional */
3 u32 refresh; /* optional */
4 u32 xres;
5 u32 yres;
6 u32 pixclock;
7 u32 left_margin;
8 u32 right_margin;
9 u32 upper_margin;
10 u32 lower_margin;
11 u32 hsync_len;
12 u32 vsync_len;
13 u32 sync;
14 u32 vmode;
15 u32 flag;
16 };
结构体fb_videomode里面的成员变量为LCD的参数,这些成员变量函数如下:
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,也就是不使用隔行扫描
笔者使用的是 7 寸 1024*600 分辨率的屏幕(ATK7016)为例,屏幕要求的像素时钟为 51.2MHz,因此:pixclock=(1/51200000)*10^12=19531,在根据其他的屏幕参数,可以得出 ATK7016 屏幕的配置参数如下
打开 mx6ull_alientek_emmc.h,找到所有如下语句:panel=TFT43AB 将其改为:
panel=TFT7016 也就是设置 panel 为 TFT7016, panel 的值要与结构体displays中的.name 成员变量的值一致。
修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动。
可以看到显示NXP的logo,1024x600适配成功,右上角显示的是u-boot编译的时间,可以对照一下是否与自己编译时间一致。
本次就是将NXP原厂的开发板中关于LCD的名字、LCD的GPIO、背光引脚、屏幕参数进行修改,至此,开发板屏幕适配结束。