【Linux驱动开发】LCD 驱动实验
一、简介
- Framebuffer 设备,Framebuffer(帧缓冲),简称 fb。
- LCD 对应的设备文件是 /dev/fbX(X=0~n)。
- 在 Linux 中应用程序也是通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息。
- 因为虚拟内存的存在,驱动程序设置的显存和应用程序访问的显存要是同一片物理内存。
裸机 LCD 驱动编写流程如下:
- ①初始化 I.MX6U 的 eLCDIF 控制器, LCD 屏幕宽(width)、高(height)、hspw、hbp、hfp、vspw、vbp、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
- ①申请 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_ctrl,RGB LCD 的 4 根控制线配置项,包括 CLK、ENABLE、VSYNC 和 HSYNC。
- 子节点 pinctrl_pwm1,LCD 背光 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~255,0: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
四、LCD 自动关闭解决方法(10分钟自动息屏)
方法一:
按键唤醒,参照以下文章设置:
【Linux驱动开发】Linux 自带按键驱动
方法二:
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 ..
五、编译与测试
使用新的 imx6ull-iot-emmc.dtb 和 zImage 启动开发板,屏幕左上角会有一个企鹅logo。
(2)以下目录查看LCD 背光亮度的,背光设备树节点设置了 8 个等级的背光调节。
/sys/devices/platform/backlight/backlight/backlight
brightness 表示当前亮度等级,max_bgigntness 表示最大亮度等级。
echo 7 > brightness
【Linux驱动开发】LCD 驱动实验相关推荐
- Linux嵌入式驱动开发02——驱动编译到内核
文章目录 全系列传送门 make menuconfig图形化配置界面 1. 怎么进入到make menuconfig图形化界面? 2. make menuconfig图形化界面的操作 3. 退出 4. ...
- 嵌入式Linux下彩色LCD驱动的设计与实现
嵌入式Linux下彩色LCD驱动的设计与实现 转载 摘要:本文介绍了如何在嵌入在开发彩色LCD显示驱动的方法,并对Linux中的显示驱动程序结构和框架作一介绍. 长期以来,在常见的掌上电脑(PDA)等 ...
- Linux驱动开发 -- touch驱动注册
Linux i2c驱动开发 – touch 驱动 文章目录 Linux i2c驱动开发 -- touch 驱动 前言 一.i2c 驱动框架 二.Linux的MODULE声明 1. MODULE相关声明 ...
- 解析Linux内核源码中数据同步问题丨C++后端开发丨Linux服务器开发丨Linux内核开发丨驱动开发丨嵌入式开发丨内核操作系统
剖析Linux内核源码数据同步 1.pdflush机制原理 2.超级块同步/inode同步 3.拥塞及强制回写技术 视频讲解如下,点击观看: 解析Linux内核源码中数据同步问题丨C++后端开发丨Li ...
- Linux驱动开发——串口设备驱动
Linux驱动开发--串口设备驱动 一.串口简介 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单.使用两条线即可实现双向通信,一条用于发送,一条用于 ...
- STM32MP157驱动开发——SPI驱动
STM32MP157驱动开发--SPI驱动 一.简介 1.SPI介绍 2.STM32MP1 SPI介绍 3. ICM-20608 简介 4.Linux下的SPI框架 二.驱动开发 1)IO 的 pin ...
- STM32MP157 Linux系统移植开发篇14:Linux内核RGB LCD驱动移植
本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...
- linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
摘要:媒介 Device Tree是一种用去描绘硬件的数据布局,类似板级描绘说话,发源于OpenFirmware(OF).正在现在遍及应用的kernel 2.6.x版本中,对分歧仄台.分歧硬件,往] ...
- Linux驱动之LCD驱动
显示设备例如LCD,在Linux中用Framebuffer来表征,在/dev目录下显示设备一般表示成这样:/dev/fbX,应用程序通过访问这个设备来访问LCD,实际上应用程序通过操作显存来操作显示设 ...
- Linux驱动之LCD驱动编写
在Linux驱动之内核自带的S3C2440的LCD驱动分析这篇博客中已经分析了编写LCD驱动的步骤,接下来就按照这个步骤来字尝试字节编写LCD驱动.用的LCD屏幕为tft屏,每个像素点为16bit.对 ...
最新文章
- 【Java】生成UUID
- 笔记-中项案例题-2019年下-信息系统安全管理
- Vue计算属性的使用
- Mango Teapot ② Teapot クラス
- “您的Microsoft Internet Explorer浏览器包含最新版本的内置Adobe Flash Player“解决
- python合并视频和音频_真没想到,Python 还能实现 5 毛特效
- java web ssh jar_java web 汽车美容管理系统 ssh 毕设作品
- Nutanix推出云基础架构远程管理IT解决方案
- avg最多用多少列 mysql_MySQL_MySQL中几种数据统计查询的基本使用教程,统计平均数
SELECT AVG() FROM 语 - phpStudy...
- 硬件之家 | 智能手环、手表是如何监测睡眠的
- [论文阅读] (19)英文论文Evaluation(实验数据集、指标和环境)如何描述及精句摘抄——以系统AI安全顶会为例
- mysql to double_double todouble
- HDU - 6769
- linux - 时间时区设置
- 0422-团队项目开发
- 让单个单元格显示两个数据
- excel两列交叉对比
- 蓝桥杯 算法提高 快乐司机
- call apply bind 的作用和区别
- (一) OBEX介绍
热门文章
- 设计必备----色彩标准卡
- python+selenium+unittest+ddt参数化实现自动化运行和脚本并生成报告
- 综合 | 分工,方法学可讨论的点
- openstack neutron介绍
- 在 Android 系统源码中自定义系统服务(Custom System Service in AOSP)
- 微擎开发小程序上应用市场(1)——头像框小程序
- FreeRTOS系列|FreeRTOS简介
- Oracle授权普通用户查看执行计划
- 511遇见易语言乐玩插件FindStr找字和FindStrFast快速找字
- LT8712X DP转HDMI VGA转换器与USBC TYPE-C芯片