【Linux驱动开发】LCD 驱动实验

news/2025/1/12 6:13:26/

一、简介

  • Framebuffer 设备,Framebuffer(帧缓冲),简称 fb。
  •  LCD 对应的设备文件是 /dev/fbX(X=0~n)
  • Linux 中应用程序也是通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息。
  • 因为虚拟内存的存在,驱动程序设置的显存和应用程序访问的显存要是同一片物理内存。

裸机 LCD 驱动编写流程如下:

  • ①初始化 I.MX6U eLCDIF 控制器, LCD 屏幕宽(width)、高(height)hspw、hbp、hfpvspwvbp、vfp 等信息。
  • ②初始化 LCD 像素时钟。
  • ③设置 RGBLCD 显存。
  • ④应用程序直接通过操作显存来操作 LCD,实现在 LCD 上显示字符、图片等信息。

 

二、LCD 驱动程序编写

  • drivers/video/fbdev/mxsfb.c 是 I.MX6ULL LCD 驱动文件。
  • lcdif 节点的 compatible 属性值为“fsl,imx6ul-lcdif”和“fsl,imx28-lcdi”。
  • Linux 内核将所有的 Framebuffer 抽象为 fb_info 的结构体,fb_info 结构体包含了 Framebuffer 设备的完整属性和操作集合。
  • LCD 的驱动就是构建 fb_info,并且向系统注册 fb_info 的过程。
  • fb_info 结构体定义在 include/linux/fb.h 文件。
  • imx6ull PWM 驱动文件为 drivers/pwm/pwm-imx.c
mxsfb_probe 函数的主要工作内容为:
  • ①申请 fb_info
  • ②初始化 fb_info 结构体中的各个成员变量。
  • ③初始化 eLCDIF 控制器。
  • ④使用 register_framebuffer 函数向 Linux 内核注册初始化好的 fb_info
注册  fb_info
int register_framebuffer (struct fb_info *fb_info)
fb_info :需要上报的 fb_info
返回值: 0 ,成功;负值,失败。

 

1、修改设备树主要步骤

LCD 所使用的 IO 配置。
LCD 屏幕节点修改,修改相应的属性值,换成我们所使用的 LCD 屏幕参数。
LCD 背光节点信息修改,要根据实际所使用的背光 IO 来修改相应的设备节点信息。

2、修改 LCD 屏幕 IO 配置

  • 子节点 pinctrl_lcdif_dat,为 RGB LCD 24 根数据线配置项。
  • 子节点 pinctrl_lcdif_ctrlRGB LCD 4 根控制线配置项,包括 CLK、ENABLE、VSYNC HSYNC
  • 子节点 pinctrl_pwm1LCD 背光 PWM 引脚配置项。
pinctrl_lcdif_dat: lcdifdatgrp {fsl,pins = <MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79MX6UL_PAD_LCD_DATA16__LCDIF_DATA16  0x79MX6UL_PAD_LCD_DATA17__LCDIF_DATA17  0x79MX6UL_PAD_LCD_DATA18__LCDIF_DATA18  0x79MX6UL_PAD_LCD_DATA19__LCDIF_DATA19  0x79MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79>;
};pinctrl_lcdif_ctrl: lcdifctrlgrp {fsl,pins = <MX6UL_PAD_LCD_CLK__LCDIF_CLK	    0x79MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79>;
};pinctrl_pwm1: pwm1grp {fsl,pins = <MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x110b0>;
};

pwm1 节点:

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

 

3、修改 lcdif 节点:

  • 1、设置 LCD 屏幕所使用的 IO,删除掉原来的 pinctrl_lcdif_reset,因为没有用到屏 幕复位 IO,其他的 IO 不变。
  • 2、使用 RGB888 模式,所以一个像素点是 24bit
  • 3、ATK7016 (7 1024*600)屏幕时序参数,根据屏幕参数修改。
&lcdif {pinctrl-names = "default";pinctrl-0 = <&pinctrl_lcdif_dat			/* 使用到的 IO */&pinctrl_lcdif_ctrl>;display = <&display0>;status = "okay";display0: display {                              /* LCD 属性信息 */bits-per-pixel = <24>;                   /* 一个像素占用 24bit */bus-width = <24>;                        /* 总线宽度 */display-timings {native-mode = <&timing0>;        /* 时序信息 */timing0: timing0 {clock-frequency = <51200000>;	/* 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 = <02>;             /* LCD vbp 参数 */vfront-porch = <12>;            /* LCD vfp 参数 */vsync-len = <3>;                /* LCD vfp 参数 */hsync-active = <0>;            /* hsync 数据线极性 */vsync-active = <0>;            /* hsync 数据线极性 */de-active = <1>;               /* de 数据线极性 */pixelclk-active = <0>;         /* clk 数据线先极性 */};};};
};

 

4、修改LCD 背光 backlight 节点信息

  • backlight 节点描述可以参考 Documentation/devicetree/indings/video/backlight/pwm-backlight.txt 
  • 节点名称要为“backlight”。
  • compatible 属性值要为“pwm-backlight”。PWM 背光控制驱动程序文件 drivers/video/backlight/pwm_bl.c。
  • pwms属性用于描述背光所使用的PWM以及PWM频率。
  • brightness-levels 属性描述亮度级别。范围为 0~2550:0%占空比,亮度最低;255:100%占空比,亮度最高。
  • default-brightness-level 属性为默认亮度级别。
	backlight {compatible = "pwm-backlight";pwms = <&pwm1 0 5000000>;                    /*使用pwm1,pwm 频率设置为 5KHz(NXP 官方推荐设置)*/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";};

 

三、使能 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

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

四、LCD 自动关闭解决方法(10分钟自动息屏)

方法一:

按键唤醒,参照以下文章设置:

【Linux驱动开发】Linux 自带按键驱动

方法二:

Linux 源码  drivers/tty/vt/vt.c 文件,179行,  blankinterval 变量,默认10分钟,改为 0 即可关闭 10 分钟熄屏。重新编译内核。
static int vesa_blank_mode;
static int vesa_off_interval;
static int blankinterval = 10*60;

方法三:

(1)新建 lcd_always_on.c

#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h> int main(int argc, char *argv[])
{ int fd; fd = open("/dev/tty1", O_RDWR);write(fd, "\033[9;0]", 8);close(fd);return 0;
}

(2)编译成可执行文件

arm-linux-gnueabihf-gcc lcd_always_on.c -o lcd_always_on

(3)可执行文件拷贝到开发板根文件系统的/usr/bin 目录中,然后给予可执行权限。

chmod 777 lcd_always_on

(4)设置 lcd_always_on 这个软件为开机自启动。

/etc/init.d/rcS 文件最后面加入以下内容,重启开发板。

cd /usr/bin
./lcd_always_on
cd ..

五、编译与测试

(1)make dtbs 编译设备树,生成新的 imx6ull-iot-emmc.dtb 设备树文件。

使用新的 imx6ull-iot-emmc.dtb 和 zImage 启动开发板,屏幕左上角会有一个企鹅logo。

(2)以下目录查看LCD 背光亮度的,背光设备树节点设置了 8 个等级的背光调节。

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

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

(3)设置屏幕亮度等级为 7:
echo 7 > brightness

http://www.ppmy.cn/news/768157.html

相关文章

正点原子imx6ull 4.3寸RGBLCD 800*480 ATK-4384触摸屏驱动芯片GT1511或GT9147问题

以前原子的触摸屏的触摸芯片是gt9147的&#xff0c;教程里的也是gt9147的驱动&#xff0c;后来&#xff0c;大概在2021年5月份前后&#xff0c;原子的4.3寸屏换了触摸芯片了&#xff0c;触摸芯片型号是gt1151的。所以&#xff0c;后期买屏幕的小伙伴可能拿到屏幕的芯片不是gt91…

STM32MP157A驱动开发 | 04 - Linux DRM显示驱动框架

Linux中主流的显示框架有两种&#xff1a;DRM框架和FB框架。 DRM框架&#xff1a;Direct Rendering Module&#xff0c;可以统一管理GPU显示FB框架&#xff1a;Frame Buffer&#xff0c;不能处理基于3D加速的GPU显卡 一、DRM框架简介 1. 整体架构 DRM框架包含两部分&#x…

STM32MP157驱动开发——字符设备驱动

一、简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节 流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI&#xff0c; LCD 等等都是字符设备&#xff0c;这些设备…

使用正点原子的U-boot驱动TN92

目录 TN92不能正常显示的原因&#xff1a;改进措施&#xff1a; TN92不能正常显示的原因&#xff1a; 使用正点原子的U-boot源码配合TN92 LCD显示屏进行实验&#xff0c;发现显示屏花屏&#xff0c;不能正常使用。在对比TN92显示屏的原理图和正点原子7寸LCD显示屏的原理图后发…

linux 字符设备驱动实战

文章目录 字符设备1、加载卸载模块2、字符设备相关结构体2.1、file_operations 结构体2.2、cdev 结构体2.3、cdev 系列函数常使用模板如下 3、注册设备号常使用模板如下 4、自动创建节点4.1、首先要创建一个 class 类4.2、创建一个设备device_create常使用模板如下 5、私有数据…

驱动开发了解下

目录 前提环境说明网络环境网络环境1网络环境2 启动开发板&#xff0c;tftp下载内核和驱动&#xff0c;nfs挂载文件系统开发流程1编写驱动程序修改Makefile编译创建拷贝加载驱动modprobe加载驱动depmod查看当前系统中存在的模块查看系统所有的设备创建设备节点文件APP测试chrde…

【正点原子STM32连载】第三章 开发环境搭建 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1&#xff09;实验平台&#xff1a;正点原子MiniPro H750开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id677017430560 3&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/thread-336836-1-1.html 4&#xff…

atk-paj7620手势传感器驱动

ATK-PAJ7620是一款高性能手势识别传感器模块。该模块采用原相科技&#xff08;Pixart&#xff09;公司的 PAJ7620U2 芯片&#xff0c;芯片内部集成了光学数组式传感器&#xff0c;以使复杂的手势和光标模式输出&#xff0c;自带九种手势 识别&#xff0c;支持上、下、左、右、前…