飞凌imx6dl linux4.1.15 uboot2016 lvds闪屏问题记录
最近在用飞凌的imx6dl 开发板做一个医疗项目,屏幕用的时lvds接口
平台: imx6dl
bsp: linux4.1.15, uboot2016, X11, qt5.6.2
问题1:屏幕不亮
开发板手册里只告诉如何连接,我连接好之后背光都不亮,这不是纯纯坑我吗。
原因:
万用表测量发现背光的 LCD_POWER_EN pin一直是低电平,软件上拉高后,背光点亮,屏幕可以显示了
具体改动如下:(需要先设置pinmux, 如何设置请查参照芯片手册)
diff --git a/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c b/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c
old mode 100644
new mode 100755
index cf840902e..863b6c33a
--- a/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c
+++ b/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c
@@ -90,6 +90,8 @@ DECLARE_GLOBAL_DATA_PTR;
#define MIPI_PWR_EN IMX_GPIO_NR(6, 10)
+#define LCD_POWER_EN IMX_GPIO_NR(3, 0)
+
Binary files /dev/null and b/linux-4.1.15/sound/soc/fsl/imx-wm8960.mod differ
diff --git a/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c b/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c
old mode 100644
new mode 100755
index cf840902e..863b6c33a
--- a/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c
+++ b/uboot-2016/board/freescale/mx6sabresd/mx6sabresd.c
@@ -90,6 +90,8 @@ DECLARE_GLOBAL_DATA_PTR;
#define MIPI_PWR_EN IMX_GPIO_NR(6, 10)
+#define LCD_POWER_EN IMX_GPIO_NR(3, 0)
+
void generate_mac_by_uuid(void)
{
u32 inbuf[2];
@@ -121,12 +123,16 @@ int dram_init(void)
static iomux_v3_cfg_t const lvds_pads[] = {
MX6_PAD_NANDF_CS2__GPIO6_IO15 | MUX_PAD_CTRL(NO_PAD_CTRL),
MX6_PAD_SD1_DAT1__GPIO1_IO17 | MUX_PAD_CTRL(PAD_CTL_PUS_100K_DOWN | PAD_CTL_PUE | PAD_CTL_PKE | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm),
+ /* Bruce Su 20210719, add LCD_POWER_EN pinmux, set it as a gpio*/
+ MX6_PAD_EIM_DA0__GPIO3_IO00 | MUX_PAD_CTRL(PAD_CTL_PUS_100K_DOWN | PAD_CTL_PUE | PAD_CTL_PKE | PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm),
};
static void enable_lvds_pwr(void)
{
imx_iomux_v3_setup_multiple_pads(lvds_pads, ARRAY_SIZE(lvds_pads));
gpio_direction_output(LVDS_PWR_EN, 1);
+ /* Bruce Su 20210719, enable lcd power*/
+ gpio_direction_output(LCD_POWER_EN,1);
}
static iomux_v3_cfg_t const uart1_pads[] = {
问题2: 闪屏
在启动过程中,有两次闪屏uboot 到kernel 一次,kenrel 进文件系统闪一次
uboot到内核的闪屏
跟踪发现, boot启动kernel 前夕故意拉低了 上图中的PWM3,导致背光熄灭,进了kernel 又开启引起的闪烁。 实测这里不拉低pwm3, 也就是背光常亮会出现另一个问题,短暂的花屏。(如果有解决的大佬,还请告知一下)
具体代码位置:uboot-2016\arch\arm\cpu\armv7\cpu.c
int cleanup_before_linux(void)
{
#if 1
/* close LCD blacklight */
gpio_direction_output(IMX_GPIO_NR(1, 21), 0);
gpio_direction_output(IMX_GPIO_NR(1, 17), 0); // 不知道是飞凌干的还是nxp干的
内核进文件系统的闪屏
我用的bsp 是 x11, qt5.6.2的版本,在进入文件系统后会初始化xorg, 跟踪xorg 代码发现,
tmp\work\cortexa9hf-neon-mx6qdl-poky-linux-gnueabi\xf86-video-imxfb-vivante\3_5.0.11.p8.6-r0\xserver-xorg-video-imx-viv-5.0.11.p8.6\EXA\src\vivante_fbdev\imx_display.c
imx_display.c 中有多次 进行了 FB_BLANK_UNBLANK ./ FB_BLANK_NORMAL 的操作,导致闪屏
// Turn on frame buffer blanking to setup sys node mode
if (0 != ioctl(fd, FBIOBLANK, FB_BLANK_UNBLANK))
{
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"unable to blank frame buffer device '%s':%s \n",
fPtr->fbDeviceName, strerror(errno));
}
我们可以选择,修改xorg的代码移除 blank的操作。
或者直接修改内核,blank操作只做一次,避免没必要的闪屏,内核修改如下:(仅供参考)
linux-4.1.15/drivers/video/fbdev/core/fbmem.c
@@ -1149,13 +1149,19 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
return ret;
}
EXPORT_SYMBOL(fb_set_var);
-
+static int blank_flag = 0;
int
fb_blank(struct fb_info *info, int blank)
-{
+{
struct fb_event event;
int ret = -EINVAL, early_ret;
+ /* Bruce Su 20210831 do not blank during Xorg init*/
+
+ if(blank_flag) return 0;
+
+ blank_flag = 1;
+
if (blank > FB_BLANK_POWERDOWN)
blank = FB_BLANK_POWERDOWN;