目录
1.NXP官方I.MX6ULL EVK开发板和ALIENTEK-ALPHA开发板LCD显示屏接口比对
1.1 NXP官方I.MX6ULL EVK开发板LCD显示屏接口
打开NXP官方I.MX6ULL EVK开发板底板(MCIMX6ULL_BB_
DESIGNFILES)原理图,查看LCD原理图,如下如所示:
打开NXP官方I.MX6ULL EVK开发板核心板(MCIMX6ULL_CM_
DESIGNFILES)原理图,查看NXP官方MX6ULL EVK开发板LCD显示屏与mx6ull芯片的硬件连接,如下如所示:
1.2 ALIENTEK-ALPHA开发板LCD显示屏接口
打开ALIENTEK-ALPHA开发板底板原理图(IMX6ULL_ALPHA_V2.1)原理图,查看LCD原理图,如下如所示:
打开ALIENTEK-ALPHA开发板核心板(IMX6ULL_CORE_V1.6)原理图,查看ALIENTEK-ALPHA开发板LCD显示屏与mx6ull芯片的硬件连接,如下如所示:
1.3 NXP官方I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏接口对照
I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏接口如下图所示:
由上图可知I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏复位控制引脚有所不同,其余控制引脚完全相同。
2. uboot中LCD设备树节点信息修改
设备树的修改,涉及下面三个方面:
(1)LCD所使用的IO配置
(2)LCD屏幕节点修改,修改相应的属性值,换成所使用的LCD屏幕参数
(3)LCD背光节点信息修改,根据实际使用的背光IO来修改相应的设备节点信息
2.1 LCD屏幕IO配置
1.打开arch/arm/dts目录下的imx6ul-alientek.dtsi文件,iomuxc节点中找到pinctrl_lcdif_dat节点,该节点描述了LCD数据引脚使用的引脚复用功能和电气属性,配置内容如下:
pinctrl_lcdif_dat: lcdifdatgrp {
fsl,pins = <
MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79
MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x79
MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x79
MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x79
MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x79
MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x79
MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x79
MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x79
MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x79
MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x79
MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x79
MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x79
MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x79
MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x79
MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x79
MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x79
MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x79
MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x79
MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x79
MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x79
MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x79
MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x79
MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x79
MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x79
>;
};
ALIENTEK-ALPHA开发板硬件设计时LCD接口使用了三个
SGM3157模拟开关,为了防止模拟开关影响到网络,需要将LCD相关引脚的电气属性都修改为0x49,降低LCD相关IO口的驱动能力,修改后的代码如下所示:
/*LCD显示屏RGB数据线引脚初始化LCD_DATA[23:0]*/
pinctrl_lcdif_dat: lcdifdatgrp {
fsl,pins = <
MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x49
MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x49
MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x49
MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x49
MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x49
MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x49
MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x49
MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x49
MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x49
MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x49
MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x49
MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x49
MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x49
MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x49
MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x49
MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x49
MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x49
MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x49
MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x49
MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x49
MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x49
MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x49
MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x49
MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x49
>;
};
2.打开arch/arm/dts目录下的imx6ul-alientek.dtsi文件,iomuxc节点中找到pinctrl_lcdif_ctrl节点,该节点描述了LCD控制引脚(LCD_PCLK、LCD_DE、LCD_HSYNC、LCD_VSYNC和LCD_RST)使用的引脚复用功能和电气属性,配置内容如下:
pinctrl_lcdif_ctrl: lcdifctrlgrp {
fsl,pins = <
MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x79
MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x79
MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x79
MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x79
/* used for lcd reset */
MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x79
>;
};
ALIENTEK-ALPHA开发板LCD显示屏复位引脚使用硬件电源复位因此屏蔽pinctrl_lcdif_ctrl节点中复位引脚配置,修改后代码如下所示:
/*LCD显示屏控制线引脚初始化LCD_PCLK、LCD_DE、LCD_HSYNC、LCD_VSYNC*/
pinctrl_lcdif_ctrl: lcdifctrlgrp {
fsl,pins = <
MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x79
MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x79
MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x79
MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x79
/*屏蔽LCD复位引脚初始化ALIENTEK-ALPHA没有使用IO口控制LCD显示屏复位*/
/*MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x79*/
>;
};
3.打开arch/arm/dts目录下的imx6ul-alientek.dtsi文件,iomuxc节点中找到pinctrl_pwm1节点,该节点描述了LCD背光控制引脚使用的引脚复用功能和电气属性,配置内容如下:
pinctrl_pwm1: pwm1grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0
>;
};
2.2 LCD屏幕参数节点信息修改
1.打开arch/arm/dts目录下的imx6ul-alientek.dtsi文件,找到lcdif节点,该节点描述了LCD显示屏参数信息,该节点的内容如下所示:
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl>;
display = <&display0>;
status = "okay";
display0: display@0 {
bits-per-pixel = <24>;
bus-width = <24>;
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <9200000>;
hactive = <480>;
vactive = <272>;
hfront-porch = <8>;
hback-porch = <4>;
hsync-len = <41>;
vback-porch = <2>;
vfront-porch = <4>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
pixelclk-active = <0>;
};
};
};
};
针对ALIENTEK-ALPHA开发板上使用的LCD屏对该节点信息进行修改(本文以ATK4384屏为例)修改后的内容如下:
/*修改LCD屏幕参数节点信息适配ALIENTEK-ALPHA开发板ATK4384屏*/
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat /*LCD屏数据线引脚初始化*/
&pinctrl_lcdif_ctrl>; /*LCD屏控制信号引脚初始化*/
display = <&display0>;
status = "okay";
/*ATK4384屏参数修改*/
display0: display@0 { /*LCD属性信息*/
bits-per-pixel = <24>; /*一个像素占用24bit*/
bus-width = <24>; /*总线宽度*/
display-timings { /*LCD屏时序信息*/
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <31000000>; /*LCD像素时钟,单位Hz*/
hactive = <800>; /*LCD X轴像素个数*/
vactive = <480>; /*LCD Y轴像素个数*/
hfront-porch = <40>; /*LCD hfp参数*/
hback-porch = <88>; /*LCD hbp参数*/
hsync-len = <48>; /*LCD hspw参数*/
vback-porch = <32>; /*LCD vbp参数*/
vfront-porch = <13>; /*LCD vfp参数*/
vsync-len = <3>; /*LCD vspw参数*/
hsync-active = <0>; /*hsync 数据线极性*/
vsync-active = <0>; /*vsync 数据线极性*/
de-active = <1>; /*de 数据线极性*/
pixelclk-active = <0>; /*clk 数据线极性*/
};
};
};
};
3. LCD初始化代码修改
打开board/freescale/mx6ull_alientek_emmc目录下的
mx6ull_alientek_emmc.c文件,找到setup_lcd()函数屏蔽此函数中LCD显示屏复位操作,修改后的代码如下所示:
static int setup_lcd(void)
{
enable_lcdif_clock(LCDIF1_BASE_ADDR, 1);
imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
/*屏蔽LCD显示屏的RESET复位引脚,ALIENTEK-ALPHA开发板LCD屏没有使用IO口控制LCD复位引脚
gpio_request(IMX_GPIO_NR(5, 9), "lcd reset");
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_request(IMX_GPIO_NR(1, 8), "backlight");
gpio_direction_output(IMX_GPIO_NR(1, 8) , 1);
return 0;
}
4. uboot启动信息修改
1.打开board/freescale/mx6ull_alientek_emmc目录下的
mx6ull_alientek_emmc.c文件,找到board_late_init()函数将板子名字修改为:ALIENTEK-ALPHA,修改后的代码如下图所示:
int board_late_init(void)
{
#ifdef CONFIG_CMD_BMODE
add_board_boot_modes(board_boot_modes);
#endif
env_set("tee", "no");
#ifdef CONFIG_IMX_OPTEE
env_set("tee", "yes");
#endif
#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
//env_set("board_name", "EVK");
env_set("board_name", "ALIENTEK-ALPHA"); /*设置ALIENTEK-ALPHA开发板名字*/
if (is_mx6ull_9x9_evk())
env_set("board_rev", "9X9");
else
env_set("board_rev", "14X14");
if (is_cpu_type(MXC_CPU_MX6ULZ)) {
env_set("board_name", "ULZ-EVK");
env_set("usb_net_cmd", "usb start");
}
#endif
setup_lcd();
#ifdef CONFIG_ENV_IS_IN_MMC
board_late_mmc_env_init();
#endif
set_wdog_reset((struct wdog_regs *)WDOG1_BASE_ADDR);
return 0;
}
2.打开board/freescale/mx6ull_alientek_emmc目录下的
mx6ull_alientek_emmc.c文件,找到checkboard()函数将Board变量改为:MX6ULL ALIENTEK EMMC,修改后的代码如下图所示:
int checkboard(void)
{
if (is_mx6ull_9x9_evk())
{
puts("Board: MX6ULL 9x9 EVK\n");
}
else if (is_mx6ull_alientek_emmc())
{
puts("Board: MX6ULL ALIENTEK EMMC\n");
}
else if (is_cpu_type(MXC_CPU_MX6ULZ))
{
puts("Board: MX6ULZ 14x14 EVK\n");
}
else
{
puts("Board: MX6ULL 14x14 EVK\n");
}
return 0;
}
3.打开include/configs目录下的mx6ull_
alientek_emmc.h文件,增加如下代码:
#define is_mx6ull_alientek_emmc() CONFIG_IS_ENABLED(TARGET_MX6ULL_ALIENTEK_EMMC)
5. uboot测试
1.将上述修改后的文件保存,重新编译uboot,编译过程如下图所示:
2.编译完成后,使用正点原子imxdownload软件将新编译的u-boot.bin文件烧录到SD卡中,烧录过程如下图所示:
3.将SD开插入ALIENTEK-ALPHA开发板,开发板拨码开关拨到SD卡启动,打开SecureCRT 软件,接收到uboot启动信息如下图所示:
4.使用mmc list查看ALIENTEK-ALPHA开发板mmc设备,如下图所示:
从上图中可以看出,MMC设备1为EMMC,容量为7.3GB,说明EMMC 驱动也成功,MMC设备0为SD卡,容量为7.4GB,说明SD卡和EMMC的驱动都没问题。
5.使用print命令打印uboot中环境变量,如下图所示:
6.LCD驱动检查
由上图可知 LCD显示正常,uboot中LCD驱动修改完成。