【Linux-LCD 驱动】

news2024/10/5 13:43:37

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 分钟熄屏的功能,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1704588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊高效广告打法及数据优化,亚马逊高阶广告打法课

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89342733 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 001.1-亚马逊的广告漏斗和A9算法的升级变化.mp4 002.2-流量入口解析和广告的曝光机制.mp4 003.3-标签理论 .mp4 004.4-不同广告类…

小程序内使用路由

一:使用组件 1)创建组件 2)在需要的页面的json/app.json可实现局部使用和全局使用 在局部的话,对象内第一层,window配置也是第一层,而在全局配置也是在第一层,window在window对象内.第二层.内部执行遍历不一样. 3)页面使用 上述所写可实现在页面内使用组件.效果是页面内可以将…

预热 618,编程好书推荐——提升你的代码力

文章目录 &#x1f4cb;前言&#x1f3af;编程好书推荐&#x1f4d8; Java领域的经典之作&#x1f40d; Python学习者的宝典&#x1f310; 前端开发者的权威指南&#x1f512; 并发编程的艺术&#x1f916; JVM的深入理解&#x1f3d7; 构建自己的编程语言&#x1f9e0; 编程智…

SolidWorks教育版 学生使用的优势

在工程技术领域的学习中&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;如SolidWorks已经成为学生掌握专业知识和技能的必要工具。SolidWorks教育版作为专为教育机构和学生设计的版本&#xff0c;不仅提供了与商业版相同的强大功能&#xff0c;还为学生带来了诸多独…

传输层安全性 (TLS)

传输层安全 (TLS) 旨在提供传输层的安全性。TLS 源自称为安全套接字层 (SSL)的安全协议。 TLS 确保任何第三方都无法窃听或篡改任何消息。 TLS 有几个好处&#xff1a; ● 加密&#xff1a; TLS/SSL 可以帮助使用加密来保护传输的数据。 ● 互操作性&#xff1a; TLS/S…

利用audacity和ffmpeg制作测试音频文件

最近要用SIPP测试一个场景&#xff0c;需要发送双声道/16K采样率/16bit量化的PCM流&#xff0c;但是下载的素材往往不能满足参数要求。那么就自己制作。 首先下载mp3文件&#xff0c;并用audacity打开。 接下来&#xff0c;点击菜单栏中轨道-重采样&#xff0c;将采样频率设为1…

备战秋招c++ 【持续更新】

T1 牛牛的快递 原题链接&#xff1a;牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目类型&#xff1a;模拟 审题&确定思路&#xff1a; 1、超过1kg和不足1kg有两种不同收费方案 ---- 起步价问题 2、超出部分不足1kg的按1kg计算 ----- 向上取整 3、向上取整的实现思路…

运维笔记.Docker镜像分层原理

运维专题 Docker镜像原理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/artic…

陈丽:人工智能赋能教育创新发展

5月20日&#xff0c;在顾明远先生莅临科大讯飞考察指导高端咨询会暨“人工智能与未来教育”的主题研讨会上&#xff0c;北京师范大学原副校长、中国教育技术协会副会长陈丽教授作了题为《人工智能赋能教育创新发展》的主旨报告。 &#xff08;以下内容根据陈丽教授在研讨会上的…

Python | Leetcode Python题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; class Solution:def connect(self, root: Node) -> Node:if not root:return root# 从根节点开始leftmost rootwhile leftmost.left:# 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next 指针head leftmostwhile head:#…

C++习题(1)

一、题目描述&#xff1a; 二、代码展示&#xff1a; #include <iostream> #include <iomanip> using namespace std; struct Student{char name[20];int id;int age;float score; }; int main() {int n;cin>>n;Student student[n];float sum0.0;for(int i0…

Ubuntu22.04之扩展并挂载4T硬盘(二百三十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 第18章-综合以上功能 18-按键和app按钮切换功能 根据上面介绍&#xff0c;我们的模式可…

ADS基础教程15 - 设计加密保护IP

设计加密保护IP 一、引言二、IP的生成与调用1.IP生成2.IP的调用 一、引言 介绍如何ADS中如何对设计好的原理图进行加密形成IP&#xff0c;然偶进行调用的过程。 二、IP的生成与调用 1.IP生成 (1)选择一个已经调试好的原理图&#xff0c;在菜单栏中选择Tools–>Encode De…

Aws CodeCommit代码仓储库

1 创建IAM用户 IAM创建admin用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…

从零学爬虫:使用比如说说解析网页结构

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、网页结构概述 示例&#xff1a;查看网页结构 三、使用比如说说解析网页 1.…

ThingsBoard网关在燃气泄漏监测中的应用

据不完全统计&#xff0c;全国城市燃气企业的供销差率大约在3%~4%&#xff0c;也就意味着越多的天然气销量就有越多的天然气损失。城市燃气企业计量管理已经接近最不利的状态&#xff0c;开展有效的计量管理势在必行。 智慧燃气综合管理系统 在燃气管网中部署智能传感器、数据采…

2024年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 在Python中,hex(2023)的功能是?( ) A:将十进制数2023转化成十六进制数 B:将十进制数2023转化成八进制数 C:将十六进制数2023转化成十进制数 D:将八进制数2023转化成十进制数 答案:A …

C语言 | Leetcode C语言题解之第116题填充每个节点的下一个右侧节点指针

题目&#xff1a; 题解&#xff1a; struct Node* connect(struct Node* root) {if (root NULL) {return root;}// 从根节点开始struct Node* leftmost root;while (leftmost->left ! NULL) {// 遍历这一层节点组织成的链表&#xff0c;为下一层的节点更新 next 指针stru…

【Linux-RTC】

Linux-RTC ■ rtc_device 结构体■ RTC 时间查看与设置■ 1、时间 RTC 查看■ 2、设置 RTC 时间 ■ rtc_device 结构体 Linux 内核将 RTC 设备抽象为 rtc_device 结构体 rtc_device 结构体&#xff0c;此结构体定义在 include/linux/rtc.h 文件中 ■ RTC 时间查看与设置 ■ 1…