【Linux-LCD 驱动】

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python前端streamlit模型部署

简单介绍使用前端streamlit框架快速部署本地模型&#xff1a; 1、模型训练&#xff1a; import pandas as pd # 流程整合 from sklearn.pipeline import make_pipeline, Pipeline # 数据处理 from sklearn.impute import SimpleImputer from sklearn.preprocessing import Min…

探索 Android Studio 中的 Gemini:加速 Android 开发的新助力

探索 Android Studio 中的 Gemini&#xff1a;加速 Android 开发的新助力 在 Gemini 时代的下一篇章中&#xff0c;Gemini融入了更多产品中&#xff0c;Android Studio 正在使用 Gemini 1.0 Pro 模型&#xff0c;使 Android 开发变得更快、更简单。 Studio Bot 现已更名为 And…

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…

C# WinForm —— 23 Timers.Timer 组件介绍与使用

1. 简介 System.Timers.Timer 计时器 轻量 每隔一段时间触发Elapsed事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也不会造成 UI 失去响应 如果要获取服务器的计时功能的话&#xff0c;可以使用System.Timers.Timer …

unity2020打包webGL时卡进程问题

我使用的2020.3.0f1c1&#xff0c;打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里&#xff0c;而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题&#xff0c;我尝试过一直卡在这里会如何&#xff0c;结果还真打包成功了。只是打包一个空场景需要20…

C++(入门基础版本)

1&#xff0c;什么是C C 是一种通用的、面向对象的编程语言&#xff0c;是 C 语言的一个超集&#xff0c;也就是说&#xff0c;任何有效的 C 程序都是有效的 C 程序。C 通过添加诸如类和对象、继承和多态等概念&#xff0c;扩展了 C 语言的功能&#xff0c;使其更适用于大型软…

CSS学习笔记目录

CSS学习笔记之基础教程&#xff08;一&#xff09; CSS学习笔记之基础教程&#xff08;二&#xff09; CSS学习笔记之中级教程&#xff08;一&#xff09; CSS学习笔记之中级教程&#xff08;二&#xff09; CSS学习笔记之中级教程&#xff08;三&#xff09; CSS学习笔记之高级…

国产身份域管架构图集合(信创政策AD域替换必看)

几类典型架构 双机架构 单点单机房 集群架构 多点单机房 两地三中心架构 多点多机房 多地分布式架构 多点多机房 全栈信创方案架构&#xff0c;欢迎探讨交流~

[数据集][目标检测]喝水检测数据集VOC+YOLO格式995张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;995 标注数量(xml文件个数)&#xff1a;995 标注数量(txt文件个数)&#xff1a;995 标注类别…

校园导航系统C++

制作一个简单的大学城导航系统&#xff0c;根据用户指定的起点和终点&#xff0c;求出最短路径长度以及具体路径。 项目要求&#xff1a; 1&#xff09;程序与数据相分离&#xff0c;地图中的所有数据都是从文件读入&#xff0c;而不是写在代码中 2&#xff09;最短路径算法…

抖音电商经验分享,揭秘做好抖店的七个关键细节,不容忽视

大家好&#xff0c;我是电商花花。 随着抖音电商和大量商家的不断入驻&#xff0c;大家对于电商的玩法也逐渐变多&#xff0c;拿到结果的商家也是越来越多&#xff0c;更多的做店玩法和步骤被更多人熟知。 现在想要做好抖店&#xff0c;其实也没有想象中那么复杂和困难。 新…

网络安全基础技术扫盲篇名词解释之“证书“

用通俗易懂的话说&#xff1a; 证书就好比是一张身份证&#xff08;类似&#xff0c;但不完全相同&#xff09;&#xff0c;用来证明一个网站的身份是否可信。就像你要确认一个陌生人的身份需要看他的身份证一样&#xff0c;电脑在连接一个网站时&#xff0c;也会查看网站的证…

停车场车位引导系统方案升级实施步骤流程是什么,有什么注意事项

停车场车位引导系统是一种现代化的停车管理系统&#xff0c;它通过实时监测车位占用情况&#xff0c;并向驾驶员提供准确的空闲车位导航信息&#xff0c;从而提高停车场的使用效率和用户体验。随着城市交通的快速发展和车辆数量的不断增加&#xff0c;停车场车位引导系统已成为…

树形结构-CRUD接口

先看一下效果&#xff1a;整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加载预训练模型参数对不齐和收到意外参数报错解决方案

使用mmdetection时遇到的问题比较多&#xff0c;首先要对自己要使用的预训练模型有一定的了解&#xff0c;并且懂得使用各种分类模型时不同的模型不同任务执行阶段需要参数上的对其。&#xff08;比如mask-rcnn和它的三个头之间的参数&#xff09;。 首先&#xff0c;谈谈torc…

一个案例告诉你,MySQL如何查询今天、昨天、近7天、近30天、本月、上个月、本季度、上季度、本年、上一年数据

参考博客 mysql查询当天/昨天/近7天/近30天/本月/上个月/本季度/上季度/本年/上一年 数据 正文内容 创建测试案例&#xff08;也可直接使用附录MySQL脚本生成数据&#xff09; 1、新建测试表 CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,date_column DATE,d…

深入Kafka消息分区机制:从原理到实践

深入Kafka消息分区机制&#xff1a;从原理到实践 在现代分布式系统中&#xff0c;如何高效地处理海量数据是一个至关重要的问题。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、实时分析等场景。为了保证数据的高效处理和系统的高可扩展性&am…

ChatGPT的逆袭历程:核心技术深度解析

在ChatGPT问世之前&#xff0c;已有许多大模型存在&#xff0c;但为何只有它成为了AI时代的“iPhone时刻”&#xff1f;这不仅得益于其技术优势&#xff0c;还在于其发展过程中所采用的一系列创新策略。本文将深度复盘ChatGPT的逆袭历程&#xff0c;分析其核心技术&#xff0c;…

数组中的第K个最大元素,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 题目地址&#xff1a; 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&a…

蚂蚁技术日首次开放,精彩看点分享

每年的 5 月 27 日&#xff0c;是蚂蚁的技术日&#xff0c;用来鼓励蚂蚁技术人保持敬畏和创新之心&#xff0c;到今天&#xff0c;第九届“527 蚂蚁技术日”已发展成为技术周&#xff0c;成为蚂蚁技术人的嘉年华。 2015 年 5 月 27 日&#xff0c;因为光纤被挖断&#xff0c;全…