移植Linux内核到阿尔法开发板(四)适配LCD显示屏

本文详细介绍了如何在NXP官方I.MX6ULLEVK开发板与ALIENTEK-ALPHA开发板上配置LCD显示屏,包括接口对照、设备树LCD驱动的修改,特别是针对LCD屏幕IO、参数节点和背光节点的配置,以及编译和基本性能测试步骤。
摘要由CSDN通过智能技术生成

1. NXP官方I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏接口对照

I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏接口如下图所示:
在这里插入图片描述
由上图可知I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏复位控制引脚有所不同,其余控制引脚完全相同。

2. 修改设备树LCD驱动

  MX6ULL的eLCDIF的接口驱动程序NXP官方已经编写好了,因此LCD的驱动部分不需要用户去修改。用户需要做的就是按照自己所使用的LCD修改设备树文件,设备树文件的修改涉及以下三个方面:
(1)LCD所使用的IO配置
(2)LCD屏幕节点修改,修改相应的属性值,换成所使用的LCD屏幕参数
(3)LCD背光节点信息修改,根据实际使用的背光IO来修改相应的设备节点信息

2.1 LCD屏幕IO配置

1.LCD显示屏数据总线IO口配置
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,在iomuxc节点中找到pinctrl_lcdif_dat节点,该节点描述了LCD数据总线使用的引脚复用功能和电气属性,配置内容如下所示:

在这里插入图片描述
  由上图可知LCD显示屏数据总线引脚电气属性设置为0x79,ALIENTEK-ALPHA开发板上的LCD接口使用了三个SGM3157模拟开关,为了防止模拟开关影响到网络需要降低LCD数据线的驱动能力,也就是将LCD相关IO的驱动能力改为 R0/1,因此将0x79改为哦0x49。修改后的节点信息如下所示:

/**************LCD显示屏数据线引脚配置项LCD_DATA[23:0] 20230323*******************/
    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.LCD显示屏控制引脚IO口配置
  打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,在iomuxc
节点中找到pinctrl_lcdif_ctrl节点,该节点描述了LCD控制引脚(LCD_PCLK、LCD_DE、LCD_HSYNC、LCD_VSYNC)使用的引脚复用功能和电气属性,配置内容如下图所示:

在这里插入图片描述
将上图中LCD显示屏控制引脚IO的电气属性设置为0x49,修改完成后的代码如下所示:

/*********LCD显示屏控制引脚配置项LCD_PCLK、LCD_DE、LCD_HSYNC、LCD_VSYNC********/
    pinctrl_lcdif_ctrl: lcdifctrlgrp {
        fsl,pins = <
            MX6UL_PAD_LCD_CLK__LCDIF_CLK        0x49
            MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x49
            MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x49
            MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x49
        >;
    };

3.LCD显示屏背光引脚IO口配置
  打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,在iomuxc
节点中找到pinctrl_pwm1节点,该节点描述了LCD背光PWM引脚复用功能和电气属性,配置内容如下图所示:

在这里插入图片描述
ALIENTEK-ALPHA开发板LCD背光控制引脚和NXP官方I.MX6ULL EVK开发板显示屏背光控制引脚相同因此此引脚配置不做修改。

2.2 LCD屏幕参数节点信息修改

打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,找到lcdif节点,节点内容如下所示:

&lcdif {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_lcdif_dat
                  &pinctrl_lcdif_ctrl
                  &pinctrl_lcdif_reset>;
    display = <&display0>;
    status = "okay";

    display0: display {
        bits-per-pixel = <16>;
        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>;
            };
        };
    };
};

  pinctrl-0属性,LCD所使用的IO口配置项信息,NXP官方I.MX6ULL开发板LCD显示屏用到了数据总线(pinctrl_lcdif_dat)、LCD控制总线(pinctrl_lcdif_ctrl)和LCD复位引脚(pinctrl_lcdif_reset)三个IO相关的节点,ALIENTEK-ALPHA开发板没有使用复位IO口因此需要将
pinctrl_lcdif_reset
节点信息删除。
  display 属性,指定 LCD 属性信息所在的子节点,这里为 display0,下面就是 display0
子节点内容。
  display0子节点,描述 LCD 的参数信息,bits-per-pixel属性用于指明一个像素占用的 bit 数,默认为 16bit。bus-width属性用于设置数据线宽度。关于bits-per-pixel
bus-width
属性的值可以参照Documentation/devicetree/bindings/fb目录下mxsfb.txt文件,这个文件中有关于这两个属性设置值的描述,如下如所示:

在这里插入图片描述
  由上图可知LCD配置为RGB888模式时bits-per-pixel的值应设置为32同时LCD配置为RGB888模式因此bus-width属性应设置为24
  紧着这下面这几行用于配置LCD时序参数信息,关于LCD显示屏时序参数信息可以参见Documentation/
devicetree/bindings/video
目录下display-timing.txt文件,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  根据上面的描述我们对ALIENTEK-ALPHA开发板所使用的LCD屏幕参数节点信息进行修改(本文以ATK4384屏为例),ATK4384的信息如下图所示:
在这里插入图片描述
修改后的LCD节点信息如下所示:

/*修改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 {                 /*LCD属性信息*/
        bits-per-pixel = <32>;          /*一个像素占用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 数据线极性*/
            };
        };
    };
};

2.3 LCD 屏幕背光节点信息

  ALIENTEK-ALPHA开发板LCD显示屏背光接口控制IO连接到了I.MX6U的GPIO1_IO08引脚上,GPIO1_IO08复用为PWM1_OUT,通过PWM信号来控制LCD显示屏背光的亮度,ALIENTEK-ALPHA和NXP官方I.MX6ULL EVK开发板的LCD背光引脚使用同一个引脚,因此背光的设备树节点不需要修改,打开arch/arm/boot/dts目录下的
imx6ull-alientek.dts
文件,找到pinctrl_pwm1节点,节点内容如下所示:

/***************LCD显示屏背光引脚配置项 20230323***********************/
        pinctrl_pwm1: pwm1grp {
            fsl,pins = <
                MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x110b0
            >;
        };

  pinctrl_pwm1节点就是GPIO1_IO08的配置节点,从第 3 行可以看出,设置 GPIO1_IO08 这个 IO 复用为 PWM1_OUT,并且设置电气属性值为 0x110b0。 LCD背光要用到 PWM1,因此也要设置PWM1节点,打开arch/arm/boot/dts目录下的imx6ull.dtsi文件,找到pwm1节点,节点信息如下所示:

pwm1: pwm@02080000 {
                compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
                reg = <0x02080000 0x4000>;
                interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clks IMX6UL_CLK_PWM1>,
                         <&clks IMX6UL_CLK_PWM1>;
                clock-names = "ipg", "per";
                #pwm-cells = <2>;
            };

  imx6ull.dtsi文件中的pwm1节点信息尽量不要修改,如果修改pwm1节点内容在imx6ull-alientek.dts文件中修改。在Linux源码文件中搜索compatible属性的这两个值即可找到imx6ull的pwm驱动文件,imx6ull的pwm驱动文件为drivers/pwm/pwm-imx.c如下图所示:
在这里插入图片描述
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,找到pwm1节点,如下所示:

&pwm1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_pwm1>;
    status = "okay";
};

第3行,设置pwm1所使用的IO为pinctrl_pwm1,也就是GPIO1_IO08这个引脚。
第4行,将status状态设置为okay。
  如果背光用的其他pwm通道,比如pwm2,那么就需要按照上述的代码在imx6ull-alientek.dts文件中增加pwm2节点相应的内容。pwm和相关的IO口已经设置完成,Linux系统怎么使用PWM1_OUT控制LCD背光,就需要一个桥梁将LCD背光和PWM1_OUT连接起来。这个节点就是backlight,backlinght
节点描述可以参考Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt这个文档,打开此文档如下图所示:

在这里插入图片描述
在这里插入图片描述
上图描述了backlight节点信息,backlight节点包含以下信息
(1)、节点名称要为“backlight”。
(2)、节点的compatible属性值为“pwm-backlight”可以在Linux内核中搜索“pwm-backlight”来查找PWM背光控制驱动程序,驱动程序文件为drivers/video/backlight/pwm_bl.c
如下图所示:

在这里插入图片描述
(3)、pwms属性用于描述LCD背光所使用的PWM以及PWM频率,比如pwm-backlight.txt文档中例子使用的pwm且pwm频率设置为200Hz。
(4)、brightness-levels属性描述亮度级别,范围0~255,0表示PWM占空比为0%亮度最低,255表示占空比为100%亮度最高。
(5)、default-brightness-level 属性为默认亮度级别。
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,找到backlight节点,如下所示:

backlight {
        compatible = "pwm-backlight";
        pwms = <&pwm1 0 5000000>;
        brightness-levels = <0 4 8 16 32 64 128 255>;
        default-brightness-level = <6>;
        status = "okay";
    };

第3行,设置LCD背光使用pwm1且PWM频率为200Hz。
第4行,设置LCD背光级别(0~7)分别为0、4、8、16、32、64、128和255对应占空比为0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%。
第5行,设置LCD显示屏默认背光等级为6即50.19%的亮度。

3. 编译测试

3.1 LCD显示屏基本性能测试

1.编译修改完成的Linux内核源码并使能Linux logo显示如下图所示:
在这里插入图片描述
Linux内核启动的时候可以选择显示小企鹅logo,启动ALIENTEK-ALPHA开发板后只要这个小企鹅logo显示正常表明LCD没有问题。Linux内核启动logo显示需要配置,输入命令make menuconfig打开Linux图形化配置界面,按照以下路径找到显示小企鹅logo的配置项,路径如下所示:
-> Device Drivers
-> Graphics support
-> Bootup logo (LOGO [=y])
-> Standard black and white Linux logo
-> Standard 16-color Linux logo
-> Standard 224-color Linux logo

在这里插入图片描述
  上图中Bootup logo选项下的三个选项分别对应黑白、16位色和24位色彩格式的logo,将这三个选项都选中编译进Linux内核里面。设置完成后保存退出图形化配置界面,重新编译Linux内核,编译完成后将编译的设备树文件imx6ull-alientek-emmc.dtb和Linux镜像文件zImage文件拷贝到Ubuntu主机tftpboot目录下,如下图所示:
在这里插入图片描述
在这里插入图片描述
2.测试LCD显示屏驱动
  将ALIENTEK-ALPHA开发板ENET2网口连接到路由上,开发板上电后uboot启动完成后将会从Ubuntu主机tftpboot目录下下载设备树文件(imx6ull-alientek-emmc.dtb)和Linux镜像文件(zImage)并启动Linux内核,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.2LCD背光测试
  上面的章节提及LCD显示屏背光设备树节点设置了8个等级的背光调节,可以设置位0~7级,通过设置背光等级调节LCD背光亮度,进入目录/sys/devices/platform/backlight/backlight/backlight查看此目录下的文件如图所示:

在这里插入图片描述
上图中的 brightness 表示当前亮度等级,max_bgigntness 表示最大亮度等级。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 将Linux内核移植开发板需要进行以下步骤: 1. 了解开发板的硬件架构和规格,包括处理器类型、内存大小、存储设备等。 2. 下载适合开发板Linux内核源代码,并根据开发板的硬件架构进行配置。 3. 编译内核源代码,生成内核镜像文件。 4. 将内核镜像文件烧录到开发板的存储设备中。 5. 配置开发板的启动选项,使其能够启动Linux内核。 6. 测试Linux内核开发板上的运行情况,包括网络、存储、输入输出等功能。 需要注意的是,不同的开发板内核版本可能存在差异,需要根据具体情况进行调整和配置。 ### 回答2: Linux内核移植开发板是一项重要的任务,在嵌入式系统开发中扮演着至关重要的角色。随着Linux在嵌入式领域的应用,内核移植开发板的需求也越来越多。下面是关于如何移植Linux内核开发板的简要介绍。 第一步,下载开发板的开发工具链。在选择开发工具链时,需要根据开发板的处理器选择相应的工具链,也要根据开发环境是否在Windows、Linux或MacOS下而选择相应的版本。开发工具链的安装和配置是移植内核的一个很重要的步骤。 第二步,下载Linux内核源码。可以从内核官网下载最新的内核源码,也可以从开发板厂商提供的SDK中获得。获取到内核源码后,需要进行解压。 第三步,配置内核内核的配置是一个非常重要的步骤。可以通过make menuconfig命令进入内核配置界面进行配置。在配置中,需要设置硬件架构信息、设备驱动程序、文件系统等相关内容。通过配置内核,可以保证内核与硬件相容,保证系统稳定性和可靠性。 第步,编译内核。在进行编译内核之前,需要进行交叉编译器的配置。具体的编译过程是先进行内核的编译,再进行模块的编译,最后进行根文件系统的制作。 第五步,烧写内核。在编译完内核后,需要将内核烧写进开发板中。可以通过JTAG或SD卡等方式将内核烧写到开发板中。烧写完成后,可以通过终端窗口连接到开发板内核中进行调试和测试。 总之,移植Linux内核开发板需要认真、细致地进行,具有一定的技术难度。但只有经过内核移植的嵌入式系统才能实现最优的嵌入式产品性能和功耗优化。 ### 回答3: 将Linux内核移植开发板是一项复杂而又重要的任务。Linux内核是一个庞大的系统,包含着许多不同的组件和模块,因此在进行内核移植时需要有一定的技术和经验。本文将简要介绍内核移植的过程。 首先要准备的是正确的开发工具和环境。通常,内核移植需要使用到交叉编译工具链和调试器,同时需要准备开发板的硬件和软件环境。通过正确的配置和安装,可以保证内核移植过程中所需要的工具和环境具有正确的版本和配置。 其次,需要对内核的源代码进行修改和编译。在进行内核移植时,需要对源代码进行一系列的修改,以适应开发板的硬件和软件环境。这些修改包括修改内核配置选项,编写硬件驱动程序,调整内存映射和中断控制等等。同时,对于不同的开发板内核源代码的修改也会有所不同。完成修改后,需要使用交叉编译工具链编译内核源代码,生成可执行程序。 最后,将编译后的内核程序烧录到开发板中。烧录内核程序通常需要使用到一些特定的工具和操作,例如使用串口或特定的 flash 工具。通过正确的操作,可以将编译后的内核程序烧录到开发板中,并启动内核系统。在启动过程中,可以通过串口或其他接口进行调试和查看输出信息,以确保内核系统的正常启动。 总之,内核移植是一项需要耗费时间和精力的工作,需要具备丰富的经验和技术。通过正确的准备和操作,可以成功将 Linux 内核移植开发板上,为嵌入式系统的开发和应用提供强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值