【Linux-LCD 驱动】

【Linux-LCD 驱动】

码农世界 2024-05-28 前端 72 次浏览 0个评论

Linux-LCD 驱动

  • ■ Framebuffer 简称 fb
  • ■ LCD 驱动程序编写
    • ■ 1、LCD 屏幕 IO 配置
    • ■ 2、LCD 屏幕参数节点信息修改
    • ■ 3、LCD 屏幕背光节点信息
    • ■ 4、使能 Linux logo 显示
    • ■ 设置 LCD 作为终端控制台
      • ■ 1、设置 uboot 中的 bootargs
      • ■ 2、修改/etc/inittab 文件
      • ■ LCD 背光调节
      • ■ LCD 自动关闭解决方法
        • ■ 1、按键盘唤醒
        • ■ 2、关闭 10 分钟熄屏功能

          ■ Framebuffer 简称 fb

          fb 是一种机制,将系统中所有跟显示有关的硬件以及软件集合起来,虚拟出一个 fb 设备,

          当我们编写好 LCD 驱动以后会生成一个名为/dev/fbX(X=0~n)的设备,应用程序通过访问/dev/fbX 这个设备就可以访问 LCD.

          因此我们是可以看到/dev/fb0 这样一个设备

          /dev/fb0 是个字符设备.因此肯定有file_operations 操作集

          Linux 内核将所有的 Framebuffer 抽象为一个叫做 fb_info 的结构体, fb_info 结构体包含了 Framebuffer 设备的完整属性和操作集合,

          fb_info 结构体定义在 include/linux/fb.h 文件里面

          fb_info 结构体的成员变量很多,我们重点关注 var、 fix、 fbops、 screen_base、 screen_size和 pseudo_palette。 mxsfb_probe 函数

          ■ LCD 驱动程序编写

          ■ 1、LCD 屏幕 IO 配置

          // 修改dts 文件      24 根数据线配置项。
          pinctrl_lcdif_dat: lcdifdatgrp {      
          	fsl,pins = <
          		MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79      电气属性都设置为 0X79        0X49 驱动能力改为 R0/1
          		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
          	>;
          }; 
          // 4 根控制线配置项,包括 CLK、ENABLE、 VSYNC 和 HSYNC
          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
          	>;
          };
          pinctrl_pwm1: pwm1grp {
          	fsl,pins = <
          		MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0
          	>;
          };
          

          ■ 2、LCD 屏幕参数节点信息修改

          &lcdif {
          	pinctrl-names = "default";
          	pinctrl-0 = <&pinctrl_lcdif_dat       /* 使用到的 IO */
          		         &pinctrl_lcdif_ctrl
          		       // &pinctrl_lcdif_reset>;	 删除掉原来的 pinctrl_lcdif_reset,因为没有用到屏幕复位 IO,
          	display = <&display0>;
          	status = "okay";
          	display0: display {    /* LCD 属性信息 */
          		bits-per-pixel = <24>;    /* 一个像素占用 24bit */
          		bus-width = <24>;     /* 总线宽度 */
          		display-timings {
          			native-mode = <&timing0>; /* 时序信息 */
          			timing0: timing0 {
          			clock-frequency = <9200000>;    /* LCD 像素时钟,单位 Hz */
          			hactive = <1024>;     /* LCD X 轴像素个数 */
          			vactive = <600>; 	 /* LCD Y 轴像素个数 */
          			hfront-porch = <160>;  /* LCD hfp 参数 */
          			hback-porch = <140>;   /* LCD hbp 参数 */
          			hsync-len = <20>;    /* LCD hspw 参数 */
          			vback-porch = <20>;   /* LCD vbp 参数*/
          			vfront-porch = <12>;  /* 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 屏幕背光节点信息

          LCD 接口背光控制 IO 连接到了 I.MX6U 的 GPIO1_IO08 引脚上, GPIO1_IO08 复用为 PWM1_OUT,通过 PWM 信号来控制 LCD 屏幕背光的亮度

          backlight {
          	compatible = "pwm-backlight";
          	pwms = <&pwm1 0 5000000>;      设置背光使用pwm1, PWM 频率为 200Hz。
          	brightness-levels = <0 4 8 16 32 64 128 255>;   设置背 8 级背光(0~7), 对应占空比为0%、 1.57%、 3.13%、 6.27%、 12.55%、 25.1%、 50.19%、 100%,
          	default-brightness-level = <6>; 设置默认背光等级为 6,也就是 50.19%的亮度
          	status = "okay";
          };
          	
          &pwm1 {
          	pinctrl-names = "default";
          	pinctrl-0 = <&pinctrl_pwm1>;
          	status = "okay";
          };
          在&iomuxc {
          	pinctrl-names = "default";
          	pinctrl-0 = <&pinctrl_hog_1>;
          	imx6ul-evk { 节点下面添加
          	
          		pinctrl_pwm1: pwm1grp {
          			fsl,pins = <
          				MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x110b0
          			>;
          		};
          		
          

          ■ 4、使能 Linux logo 显示

          Linux 内核一般都会默认,开启 小企鹅 logo 显示如何使能 Linux 小企鹅 logo 显示

          三个选项分别对应黑白、 16 位、 24 位色彩格式的 logo。

          ■ 设置 LCD 作为终端控制台

          ■ 1、设置 uboot 中的 bootargs

          	setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.250:
          /home/zuozhongkai/linux/nfs/rootfs ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off
          

          console=tty1 console=ttymxc0,115200

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

          相当于我们打开了两个 console,一个是 LCD,一个是串口,大家重启开发板就会发现 LCD 和串口都会显示 Linux 启动 log 信息。

          ■ 2、修改/etc/inittab 文件

          打开开发板根文件系统中的/etc/inittab 文件,在里面加入下面这一行:

          tty1::askfirst:-/bin/sh
          

          重启以后开发板 LCD 屏幕最后一行会显示下面一行语句:Please press Enter to activate this console 按下回车键使能当前终端

          我们可以通过下面这一行命令向LCD 屏幕输出“hello linux!”

          echo hello linux > /dev/tty1

          至此,我们就拥有了两套终端,一个是基于串口的 SecureCRT,一个就是我们开发板的 LCD屏幕,但是为了方便调试,我们以后还是以 SecureCRT 为主。

          ■ LCD 背光调节

          背光设备树节点设置了 8 个等级的背光调节,可以设置为 0~7,我们可以通过设置背光等级来实现 LCD 背光亮度的调节

          /sys/devices/platform/backlight/backlight/backlight

          brightness 表示当前亮度等级, max_bgigntness 表示最大亮度等级。

          比如设置屏幕亮度等级为 7,那么可以使用如下命令: echo 7 > brightness

          ■ LCD 自动关闭解决方法

          默认情况下 10 分钟以后 LCD 就会熄屏,这个并不是代码有问题,而是 Linux 内核设置的,就和我们用手机或者电脑一样,一段时间不操作的话屏幕就会熄灭,以节省电能。

          ■ 1、按键盘唤醒

          开发板上的 KEY按键注册为了回车键,因此按下开发板上的 KEY 按键即可唤醒屏幕。如果开发板上没有按键的话可以外接 USB 键盘,然后按下 USB 键盘上的回车键唤醒屏幕。

          ■ 2、关闭 10 分钟熄屏功能

          Linux 源码中找到 drivers/tty/vt/vt.c 这个文件,在此文件中找到 blankinterval 变量

          static int vesa_blank_mode;
          static int vesa_off_interval;
          static int blankinterval = 10*60;   
          

          blankinterval 变量控制着 LCD 关闭时间,默认是 10*60,也就是 10 分钟 将 blankinterval的值改为 0 即可关闭 10 分钟熄屏的功能,

转载请注明来自码农世界,本文标题:《【Linux-LCD 驱动】》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,72人围观)参与讨论

还没有评论,来说两句吧...

Top