一般修改 LCD 驱动重点注意以下几点:
①、LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确。
②、LCD 背光引脚 GPIO 的配置。
③、LCD 配置参数是否正确。
I.MX6U-ALPHA 开发板 LCD 原理图和 NXP 官方 I.MX6ULL 开发板一致,也就是 LCD 的 IO 和背光 IO 都一样的, 所以 IO 部分就不用修改了。 需要修改的之后 LCD 参数,打开文件mx6ull_mybsp_emmc.c,找到如下所示内容:
gedit board/freescale/mx6ull_mybsp_emmc/mx6ull_mybsp_emmc.c
关键字:display_info_t const displays
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 位,一般使用 RGB888。
fb_videomode,定义在文件 include/linux/fb.h 中,定义如下:
struct fb_videomode {
const char *name; /* LCD 名字,要和环境变量中的 panel 相等。 */
u32 refresh; /* */
u32 xres; /* LCD X 轴像素数量。 */
u32 yres; /* LCD Y 轴像素数量。 */
u32 pixclock; /* 像素时钟,每个像素时钟周期的长度,单位为皮秒。 */
u32 left_margin; /* HBP,水平同步后肩。 */
u32 right_margin; /* HFP,水平同步前肩。*/
u32 upper_margin; /* VBP,垂直同步后肩。*/
u32 lower_margin; /* VFP,垂直同步前肩。*/
u32 hsync_len; /* HSPW,行同步脉宽。 */
u32 vsync_len; /* VSPW,垂直同步脉宽。 */
u32 sync; /* */
u32 vmode; /* 大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。 */
u32 flag; /* */
};
唯一不同的像素时钟 pixclock 的含义不同,以 7 寸 1024*600 分辨率的屏幕(ATK7016)为例,屏幕要求的像素时钟为 51.2MHz,因此:
pixclock=(1/51200000)*10^12=19531
在根据其他的屏幕参数,可以得出 ATK7016 屏幕的配置参数如下:
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
} } };
终端输入:gedit include/configs/mx6ull_mybsp_emmc.h,打开 mx6ull_mybsp_emmc.h,找到所有如下语句(如果按我的步骤来,这里之前就已经修改好了):
panel=TFT43AB
将其改为:
./mx6ull_mybsp_emmc.sh
或
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_mybsp_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
chmod 777 imxdownload
//给予 imxdownload 可执行权限
./imxdownload u-boot.bin /dev/sdg
//烧写 u-boot.bin 到 SD 卡中
烧写完成以后将 SD 卡插入 I.MX6U-ALPHA 开发板的 TF 卡槽中,最后设置开发板从 SD卡启动。打开 SecureCRT,设置好开发板所使用的串口并打开,复位开发板,
在SecureCRT 中uboot 的命令模式下输入如下命令:
setenv panel TFT7016
saveenv
reset
此时 LCD 驱动就工作正常了。如果 LCD 还是没有正常工作的,那就要检查自己哪里有没有改错,或者还有哪里没有修改。