使用正点原子的U-boot驱动TN92

TN92不能正常显示的原因:

使用正点原子的U-boot源码配合TN92 LCD显示屏进行实验,发现显示屏花屏,不能正常使用。在对比TN92显示屏的原理图和正点原子7寸LCD显示屏的原理图后发现,正点原子的原理图上有三个电阻,用来判断显示屏的尺寸和分辨率。而TN92的原理图上并没有电阻,所以在上电后,程序默认初始化为480*272的LCD。
在这里插入图片描述

改进措施:

  1. 硬件上的改进
    根据LCD的分辨率,在R7、G7和B7信号线上使用10K电阻进行上下拉,使程序初始化为相应的分辨率。
  2. 软件上的改进
    改进方法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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值