跳转至

16.LCD驱动

Linux 内核将所有的 Framebuffer 抽象为一个叫做 fb_info 的结构体,fb_info 结构体包含了 Framebuffer 设备的完整属性和操作集合,因此每一个 Framebuffer 设备都必须有一个 fb_info。换言之就是,LCD 的驱动就是构建 fb_info,并且向系统注册 fb_info的过程。

主要是修改设备树内容

下面是正点原子800X400的修改

&lcdif {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_lcdif_dat         /* 使用到的 IO*/
             &pinctrl_lcdif_ctrl>;
    display = <&display0>;
    status = "okay";

        display0: display {
                bits-per-pixel = <16>;     /* 一个像素占用 16bit */
                bus-width = <24>;         /* 总线宽度 */

                display-timings {
                        native-mode = <&timing0>;  /* 时序信息 */
                        timing0: timing0 {
                        clock-frequency = <35500000>; ;/* LCD 像素时钟,单位 Hz */
                        hactive = <800>;               /* LCD X 轴像素个数 */
                        vactive = <480>;               /* LCD Y 轴像素个数 */  
                        hfront-porch = <210>;          /* LCD hfp 参数 */
                        hback-porch = <46>;            /* LCD hbp 参数 */
                        hsync-len = <20>;              /* LCD hspw 参数 */
                        vback-porch = <23>;            /* LCD vbp 参数 */
                        vfront-porch = <22>;           /* LCD vfp 参数 */ 
                        vsync-len = <3>;               /* LCD vspw 参数 */

                        hsync-active = <0>;            /* hsync 数据线极性 */
                        vsync-active = <0>;            /* vsync 数据线极性 */
                        de-active = <1>;               /* de 数据线极性 */
            /* rgb to hdmi: pixelclk-ative should be set to 1 */
                        pixelclk-active = <0>;        /* clk 数据线先极性 */
                        };
                };
        };
};

我是使用的的480x272的,暂时使用默认值,未修改

&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>;
            };
        };
    };
};
-> Device Drivers
    -> Graphics support
        -> Bootup logo (LOGO [=y])
            -> Standard black and white Linux logo
            -> Standard 16-color Linux logo
            -> Standard 224-color Linux logo

全部选上,编译到linux内核

设置 LCD 作为终端控制台

setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/lqh/linux/nfs/rootfs,proto=tcp rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off'

这里我们设置了两遍 console,第一次设置 console=tty1,也就是设置 LCD 屏幕为控制台,第二遍又设置 console=ttymxc0,115200,也就是设置串口也作为控制台。