TN92不能正常显示的原因:
使用正点原子的U-boot源码配合TN92 LCD显示屏进行实验,发现显示屏花屏,不能正常使用。在对比TN92显示屏的原理图和正点原子7寸LCD显示屏的原理图后发现,正点原子的原理图上有三个电阻,用来判断显示屏的尺寸和分辨率。而TN92的原理图上并没有电阻,所以在上电后,程序默认初始化为480*272的LCD。
改进措施:
- 硬件上的改进
根据LCD的分辨率,在R7、G7和B7信号线上使用10K电阻进行上下拉,使程序初始化为相应的分辨率。 - 软件上的改进
改进方法1: 将arch/board/freescale/mx6ullevk/
里的mx6ullevk.c
进行改进。mx6ullevk.c
里面有个struct display_info_t const displays[]
函数,将函数中的分辨率按照LCD数据手册中的数据进行改进即可。
struct display_info_t const displays[] = {
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-LCD-10.1-1280x800",
.xres = 1280,
.yres = 800,
.pixclock = 27123,
.left_margin = 70,
.right_margin = 80,
.upper_margin = 10,
.lower_margin = 10,
.hsync_len = 10,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
},
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-LCD-7-1024x600",
.xres = 1024,
.yres = 600,
.pixclock = 19531,
.left_margin = 100,
.right_margin = 88,
.upper_margin = 39,
.lower_margin = 21,
.hsync_len = 48,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
},
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-LCD-4.3-480x272",
.xres = 480,
.yres = 272,
.pixclock = 108695,
.left_margin = 8,
.right_margin = 4,
.upper_margin = 2,
.lower_margin = 4,
.hsync_len = 41,
.vsync_len = 10,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
},
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-LCD-4.3-800x480",
.xres = 800,
.yres = 480,
.pixclock = 10119,
.left_margin = 210,
.right_margin = 46,
.upper_margin = 22,
.lower_margin = 23,
.hsync_len = 20,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
},
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-LCD-7-800x480",
.xres = 800,
.yres = 480,
.pixclock = 27902,
.left_margin = 46,
.right_margin = 210,
.upper_margin = 23,
.lower_margin = 22,
.hsync_len = 40,
.vsync_len = 20,
.sync = 1,
.vmode = FB_VMODE_NONINTERLACED
}
},
/* VGA display default is disabled.
* ALPHA or MINI board HDMI display does not support in uboot
*/
#if 0
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "ATK-VGA-DISPLAY",
.xres = 1366,
.yres = 768,
.pixclock = 11500,/* 84.270MHz */
.left_margin = 213,
.right_margin = 70,
.upper_margin = 24,
.lower_margin = 3,
.hsync_len = 143,
.vsync_len = 3,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
}
#endif
};
改进方法2: 将arch/board/freescale/mx6ullevk/
里的mx6ullevk.c
进行改进。mx6ullevk.c
里面有个宏定义用来选择分辨率,将宏定义进行改进即可。改进时注意自己的开发板是NAND、SD还是EMMC。
#ifdef CONFIG_ENV_IS_IN_NAND
case CONFIG_ATKVGA_DISPLAY: /* 7 */
setenv("fdt_offset","0x5e0000");
setenv("panel","ATK-VGA-DISPLAY");
break;
case CONFIG_ATKHDMI_DISPLAY: /* 6 */
setenv("fdt_offset","0x5c0000");
setenv("panel","ATK-HDMI-DISPLAY");
break;
case CONFIG_ATKLCD_10_1_1280x800: /* 5 */
setenv("fdt_offset","0x5a0000");
setenv("panel","ATK-LCD-10.1-1280x800");
break;
case CONFIG_ATKLCD_7_1024x600: /* 2 */
setenv("fdt_offset","0x580000");
setenv("panel","ATK-LCD-7-1024x600");
break;
case CONFIG_ATKLCD_7_800x480: /* 4 */
setenv("fdt_offset","0x560000");
setenv("panel","ATK-LCD-7-800x480");
break;
case CONFIG_ATKLCD_4_3_800x480: /* 1 */
setenv("fdt_offset","0x540000");
setenv("panel","ATK-LCD-4.3-800x480");
break;
case CONFIG_ATKLCD_4_3_480x272: /* 0 */
setenv("fdt_offset","0x520000");
setenv("panel","ATK-LCD-4.3-480x272");
break;
default:
printf("*** This LCD id does not exist! Use the default LCD. ***\n");
setenv("fdt_offset","0x560000");
setenv("panel","ATK-LCD-7-800x480");
break;
#elif CONFIG_SYS_BOOT_SD
case CONFIG_ATKVGA_DISPLAY: /* 7 */
setenv("fdt_file","imx6ull-14x14-nand-vga.dtb");
setenv("panel","ATK-VGA-DISPLAY");
break;
case CONFIG_ATKHDMI_DISPLAY: /* 6 */
setenv("fdt_file","imx6ull-14x14-nand-hdmi.dtb");
setenv("panel","ATK-HDMI-DISPLAY");
break;
case CONFIG_ATKLCD_10_1_1280x800: /* 5 */
setenv("fdt_file","imx6ull-14x14-nand-10.1-1280x800-c.dtb");
setenv("panel","ATK-LCD-10.1-1280x800");
break;
case CONFIG_ATKLCD_7_1024x600: /* 2 */
setenv("fdt_file","imx6ull-14x14-nand-7-1024x600-c.dtb");
setenv("panel","ATK-LCD-7-1024x600");
break;
case CONFIG_ATKLCD_7_800x480: /* 4 */
setenv("fdt_file","imx6ull-14x14-nand-7-800x480-c.dtb");
setenv("panel","ATK-LCD-7-800x480");
break;
case CONFIG_ATKLCD_4_3_800x480: /* 1 */
setenv("fdt_file","imx6ull-14x14-nand-4.3-800x480-c.dtb");
setenv("panel","ATK-LCD-4.3-800x480");
break;
case CONFIG_ATKLCD_4_3_480x272: /* 0 */
setenv("fdt_file","imx6ull-14x14-nand-4.3-480x272-c.dtb");
setenv("panel","ATK-LCD-4.3-480x272");
break;
default:
printf("*** This LCD id does not exist! Use the default LCD. ***\n");
setenv("fdt_file","imx6ull-14x14-nand-7-800x480-c.dtb");
setenv("panel","ATK-LCD-7-800x480");
break;
#else
case CONFIG_ATKVGA_DISPLAY: /* 7 */
setenv("fdt_file","imx6ull-14x14-emmc-vga.dtb");
setenv("panel","ATK-VGA-DISPLAY");
break;
case CONFIG_ATKHDMI_DISPLAY: /* 6 */
setenv("fdt_file","imx6ull-14x14-emmc-hdmi.dtb");
setenv("panel","ATK-HDMI-DISPLAY");
break;
case CONFIG_ATKLCD_10_1_1280x800: /* 5 */
setenv("fdt_file","imx6ull-14x14-emmc-10.1-1280x800-c.dtb");
setenv("panel","ATK-LCD-10.1-1280x800");
break;
case CONFIG_ATKLCD_7_1024x600: /* 2 */
setenv("fdt_file","imx6ull-14x14-emmc-7-1024x600-c.dtb");
setenv("panel","ATK-LCD-7-1024x600");
break;
case CONFIG_ATKLCD_7_800x480: /* 4 */
setenv("fdt_file","imx6ull-14x14-emmc-7-800x480-c.dtb");
setenv("panel","ATK-LCD-7-800x480");
break;
case CONFIG_ATKLCD_4_3_800x480: /* 1 */
setenv("fdt_file","imx6ull-14x14-emmc-4.3-800x480-c.dtb");
setenv("panel","ATK-LCD-4.3-800x480");
break;
case CONFIG_ATKLCD_4_3_480x272: /* 0 */
setenv("fdt_file","imx6ull-14x14-emmc-4.3-480x272-c.dtb");
setenv("panel","ATK-LCD-4.3-480x272");
break;
default:
printf("*** This LCD id does not exist! Use the default LCD. ***\n");
setenv("fdt_file","imx6ull-14x14-emmc-7-800x480-c.dtb");
setenv("panel","ATK-LCD-7-800x480");
break;
#endif
}
}
改进方法3: 将include/configs/
里的mx6_common.h
进行改进。mx6_common.h
里面有个ALIENTEK DISPLAY configuration number
宏定义,将宏定义进行改进即可。
/* ALIENTEK DISPLAY configuration number */
#define CONFIG_ATKVGA_DISPLAY 7
#define CONFIG_ATKHDMI_DISPLAY 6
#define CONFIG_ATKLCD_10_1_1280x800 5
#define CONFIG_ATKLCD_4_3_480x272 4
#define CONFIG_ATKLCD_7_1024x600 2
#define CONFIG_ATKLCD_4_3_800x480 1
#define CONFIG_ATKLCD_7_800x480 0