Linux学习第35天:Linux LCD 驱动实验(二):星星之火可以燎原

Linux版本号4.1.15   芯片I.MX6ULL                                    大叔学Linux    品人间百味  思文短情长 


三、LCD驱动程序编写

        需要注意的地方:

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


1、LCD屏幕IO配置

        NXP已经给写好了。

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

pinctrl-0 = <&pinctrl_lcdif_dat /* 使用到的 IO */
&pinctrl_lcdif_ctrl
&pinctrl_lcdif_reset>;

        pinctrl-0 属性,LCD 所使用的 IO 信息,这里用到了 pinctrl_lcdif_dat、pinctrl_lcdif_ctrl
和 pinctrl_lcdif_reset 这三个 IO 相关的节点,pinctrl_lcdif_reset 是 LCD 复位 IO 信息节点,正点原子的 I.MX6U-ALPHA 开发板的 LCD 没有用到复位 IO,因此 pinctrl_lcdif_reset 可以删除掉。

display = <&display0>;

        display 属性,指定 LCD 属性信息所在的子节点,这里为 display0。

9 display0: display { /* LCD 属性信息 */
10 bits-per-pixel = <16>; /* 一个像素占用几个 bit */
11 bus-width = <24>; /* 总线宽度 */
12
13 display-timings {
14 native-mode = <&timing0>; /* 时序信息 */
15 timing0: timing0 {
16 clock-frequency = <9200000>; /* LCD 像素时钟,单位 Hz */
17 hactive = <480>; /* LCD X 轴像素个数 */
18 vactive = <272>; /* LCD Y 轴像素个数 */
19 hfront-porch = <8>; /* LCD hfp 参数 */
20 hback-porch = <4>; /* LCD hbp 参数 */
21 hsync-len = <41>; /* LCD hspw 参数 */
22 vback-porch = <2>; /* LCD vbp 参数 */
23 vfront-porch = <4>; /* LCD vfp 参数 */
24 vsync-len = <10>; /* LCD vspw 参数 */
25
26 hsync-active = <0>; /* hsync 数据线极性 */
27 vsync-active = <0>; /* vsync 数据线极性 */
28 de-active = <1>; /* de 数据线极性 */
29 pixelclk-active = <0>; /* clk 数据线先极性 */
30 };
31 };
32 };

        display0 子节点,描述 LCD 的参数信息, 第 10 行的 bits-per-pixel 属性用于指明一个像素占用的 bit 数,默认为 16bit将 LCD 配置为 RGB888 模式,因此一个像素点占用 24bit, bits-per-pixel 属性要改为 24。第 11 行的 bus-width 属性用于设置数据线宽度,因为要配置为 RGB888 模式,因此 bus-width 也要设置为 24。

        第 13~30 行,这几行非常重要!因为这几行设置了 LCD 的时序参数信息, NXP 官方的 EVK
开发板使用了一个 4.3 寸的 480*272 屏幕,因此这里默认是按照 NXP 官方的那个屏幕参数设置
的。

pinctrl-0 = <&pinctrl_lcdif_dat /* 使用到的 IO */
&pinctrl_lcdif_ctrl>;

        设置 LCD 屏幕所使用的 IO,删除掉原来的 pinctrl_lcdif_reset,因为没有用到屏
幕复位 IO,其他的 IO 不变。

bits-per-pixel = <24>; /* 一个像素占用 24bit */

        使用 RGB888 模式,所以一个像素点是 24bit。

15 clock-frequency = <51200000>;/* LCD 像素时钟,单位 Hz */
16 hactive = <1024>; /* LCD X 轴像素个数 */
17 vactive = <600>; /* LCD Y 轴像素个数 */
18 hfront-porch = <160>; /* LCD hfp 参数 */
19 hback-porch = <140>; /* LCD hbp 参数 */
20 hsync-len = <20>; /* LCD hspw 参数 */
21 vback-porch = <20>; /* LCD vbp 参数 */
22 vfront-porch = <12>; /* LCD vfp 参数 */
23 vsync-len = <3>; /* LCD vspw 参数 */

ATK7016 屏幕时序参数,根据自己所使用的屏幕修改即可。


3、屏幕背光节点信息

        GPIO1_IO08 这个 IO 的配置:

1 pinctrl_pwm1: pwm1grp {
2 fsl,pins = <
3 MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0
4 >;
5 };

        pinctrl_pwm1 节点就是 GPIO1_IO08 的配置节点,从第 3 行可以看出,设置 GPIO1_IO08
这个 IO 复用为 PWM1_OUT,并且设置电气属性值为 0x110b0。

        设置 PWM1 节点:

1 pwm1: pwm@02080000 {
2 compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
3 reg = <0x02080000 0x4000>;
4 interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
5 clocks = <&clks IMX6UL_CLK_PWM1>,
6 <&clks IMX6UL_CLK_PWM1>;
7 clock-names = "ipg", "per";
8 #pwm-cells = <2>;
9 };
1 &pwm1 {
2 pinctrl-names = "default";
3 pinctrl-0 = <&pinctrl_pwm1>;
4 status = "okay";
5 };

        设置 pwm1 所使用的 IO 为 pinctrl_pwm1

        将 status 设置为 okay。

        backlight节点的创建:

①、节点名称要为“ backlight”。
②、节点的 compatible 属性值要为“ pwm-backlight”。
③、pwms属性用于描述背光所使用的 PWM以及 PWM频率,比如本章我们要使用的 pwm1,
pwm 频率设置为 5KHz(NXP 官方推荐设置)。
④、 brightness-levels 属性描述亮度级别,范围为 0~255, 0 表示 PWM 占空比为 0%,也就
是亮度最低, 255 表示 100%占空比,也就是亮度最高。
⑤、 default-brightness-level 属性为默认亮度级别。

1 backlight {
2 compatible = "pwm-backlight";
3 pwms = <&pwm1 0 5000000>;//PWM 频率为 5KHz。
4 brightness-levels = <0 4 8 16 32 64 128 255>;//设置背 8 级背光(0~7)
5 default-brightness-level = <6>;//设置默认背光等级为 6
6 status = "okay";
7 };

四、运行测试

1、LCD屏幕基本测试

1)、编译新的设备树

make dtbs

        等待编译生成新的 imx6ull-alientek-emmc.dtb 设备树文件。

2)、使能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

2、设置LCD作为终端控制台

1)、设置uboot中的bootargs

2)、修改/etc/inittab文件

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

        修改完成以后保存/etc/inittab 并退出,然后重启开发板,重启以后开发板 LCD 屏幕最后一
行会显示下面一行语句:Please press Enter to activate this console.

        可以通过下面这一行命令向LCD 屏幕输出“ hello linux!”
        echo hello linux > /dev/tty1

3、LCD背光调节

        设置背光等级来实现 LCD 背光亮度的调节:

进入目录/sys/devices/platform/backlight/backlight/backlight

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

        如果要修改屏幕亮度,只需要向 brightness 写入需要设置的屏幕亮度等级即可。比如设置屏幕亮度等级为 7,那么可以使用如下命令:
echo 7 > brightness
        输入上述命令以后就会发现屏幕亮度增大了,如果设置 brightness 为 0 的话就会关闭 LCD
背光,屏幕就会熄灭。

4、LCD自动关闭解决方法

1)、按键盘唤醒

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

static int blankinterval = 10*60;

3)、编写APP关闭熄屏功能

1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <sys/ioctl.h>
4
5
6 int main(int argc, char *argv[])
7 {
8 int fd;
9 fd = open("/dev/tty1", O_RDWR);
10 write(fd, "\033[9;0]", 8);
11 close(fd);
12 return 0;
13 }

        使用如下命令编译 lcd_always_on.c 这个文件:
arm-linux-gnueabihf-gcc lcd_always_on.c -o lcd_always_on
        编译生成 lcd_always_on 以后将此可执行文件拷贝到开发板根文件系统的/usr/bin 目录中,
然后给予可执行权限。设置 lcd_always_on 这个软件为开机自启动,打开/etc/init.d/rcS,在此文
件最后面加入如下内容:
 

1 cd /usr/bin
2 ./lcd_always_on
3 cd ..

        修改完成以后保存/etc/init.d/rcS 文件,然后重启开发板即可。

五、总结

        本节笔记主要学习Linux LCD驱动试验,主要内容包括LCD驱动简析、硬件原理图分析、驱动程序编写及运行测试。其中驱动程序的编写以及运行测试作为本节的重点内容。


本文为参考正点原子开发板配套教程整理而得,仅用于学习交流使用,不得用于商业用途。

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

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

相关文章

JavaScript爬虫程序爬取游戏平台数据

这次我用一个JavaScript爬虫程序&#xff0c;来爬取游戏平台采集数据和分析的内容。爬虫使用了爬虫IP信息&#xff0c;爬虫IP主机为duoip&#xff0c;爬虫IP端口为8000。以下是每行代码和步骤的解释&#xff1a; // 导入所需的库 const axios require(axios); const cheerio …

京东数据分析:2023年9月京东打印机行业品牌销售排行榜

鲸参谋监测的京东平台9月份打印机市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;今年9月&#xff0c;京东平台打印机的销量为60万&#xff0c;环比增长约32%&#xff0c;同比下滑约25%&#xff1b;销售额为5亿&#xff0c;环比增长约35%&#xff0c;同比下滑约29%…

Python中的上下文管理器和with语句

在Python编程中,资源管理是一个核心概念,涉及文件处理、网络连接、数据库会话等。这些资源需要正确的管理,以确保它们在使用后被适当地关闭或释放,避免资源泄漏。Python通过上下文管理器(Context Managers)和with语句提供了一种优雅的资源管理机制。在本篇博客中,我们将…

jpa Repository的常用写法总结

一、前言 之前项目在xml中写sql&#xff0c;感觉标签有很多&#xff0c;比较灵活&#xff1b; 最近在写新项目&#xff0c;使用了jpa&#xff0c;只能在java中写sql了&#xff0c;感觉不太灵活&#xff0c;但是也得凑付用。 以下总结下常用入参出参写法。 二、Repository代…

Notepad++中删除连续的任意n行

使用Notepad里的行标记功能&#xff0c;可以删除指定的任意n行。 案例1&#xff0c;删除sample2.dat里的第201行到第10000行。方法如下&#xff1a; (1) 用户NotePad打开sample2.dat&#xff0c;右击201行 —》“开始/结束”/开始 图(1) 选择行的起点&#xff1a;201 (2) 接…

JS的内存泄漏详解

介绍&#xff1a; js中的内存垃圾回收机制&#xff1a;垃圾回收器会定期扫描内存&#xff0c;当某个内存中的值被引用为零时就会将其回收。当前变量已经使用完毕但依然被引用&#xff0c;导致垃圾回收器无法回收这就造成了内存泄漏。传统页面每次跳转都会释放内存&#xff0c;…

做什么数据表格啊,要做就做数据可视化

是一堆数字更易懂&#xff0c;还是图表更易懂&#xff1f;很明显是图表&#xff0c;特别是数据可视化图表。数据可视化是一种将大量数据转化为视觉形式的过程&#xff0c;通过图形、图表、图像等方式呈现数据&#xff0c;以便更直观地理解和分析。 数据可视化更加生动、形象地…

Linux内核分析(八)--用户/内核缓冲区及磁盘高速缓存

目录 一、引言 二、缓冲区 ------>2.1、缓冲区介绍 ------>2.2、缓冲区类型 ------------>2.2.1、行缓冲 ------------>2.2.2、全缓冲 ------------>2.2.3、无缓冲 ------>2.3、内核缓冲区 ------------>2.3.1、数据预读(cache) ------------&g…

蓝桥杯每日一题203.11.7

题目描述 题目分析 使用dp思维&#xff0c;当前位置是否可行是有上一位置推来&#xff0c;计算出最大的可行位置即可 #include <stdio.h> #include <string.h>#define N 256 int f(const char* s1, const char* s2) {int a[N][N];int len1 strlen(s1);int len2 …

kafka笔记要点和集群安装、消息分组、消费者分组以及与storm的整合机制

kafka笔记 1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端&#xff0c;一类叫producer&#xff08;消息生产者&#xff09;&#xff0c;一类叫做consumer&#xff08;消息消费者&#xff09;&#xff0c;客户端和broker服务器之间…

【分布式事务】初步探索分布式事务的概率和理论,初识分布式事的解决方案 Seata,TC 服务的部署以及微服务集成 Seata

文章目录 一、分布式服务案例1.1 分布式服务 demo1.2 演示分布式事务问题 二、分布式事务的概念和理论2.1 什么是分布式事务2.2 CAP 定理2.3 BASE 理论2.4 分布式事务模型 三、分布式事务解决方案 —— Seata3.1 什么是 Seata3.2 Seata 的架构3.3 Seata 的四种分布式事务解决方…

AIGPT重大升级,界面重新设计,功能更加饱满,用户体验升级

AIGPT AIGPT是一款功能强大的人工智能技术处理软件&#xff0c;不但拥有其他模型处理文本认知的能力还有AI绘画模型、拥有自身的插件库。 我们都知道使用ChatGPT是需要账号以及使用魔法的&#xff0c;实现其中的某一项对我们一般的初学者来说都是一次巨大的挑战&#xff0c;但…

Fourier分析导论——第4章——Fourier级数的一些应用(E.M. Stein R. Shakarchi)

第 4 章 傅里叶级数的一些应用 Fourier series and analogous expansions intervene very naturally in the general theory of curves and surfaces. In effect, this theory, conceived from the point of view of analysis, deals obviously with the study of arbitra…

三款软件录制电脑屏幕视频

在这个视频信息快速发展的新时代&#xff0c;寻找好用的可以录制电脑屏幕视频的软件变得极其重要&#xff0c;因为制作视频已成为我们生活工作中不可或缺的一部分。 这些好用的录屏软件允许你录制摄像头、特定窗口、部分区域或整个桌面&#xff0c;同时还可对录制中的视频进行…

前沿技术:人工智能的未来之路

&#x1f38a;专栏【人工智能】 &#x1f33a;每日一句&#xff1a;天空黑暗到一定程度&#xff0c;星辰就会熠熠生辉&#xff01; ⭐欢迎并且感谢大家指出我的问题 文章目录 一、引言 二、人工智能的未来发展 三、人工智能发展面临的挑战 四、结论 一、引言 随着科技的不…

lvgl加载资源JPG image,播放动画

load jpg image to memory lvgl加载图片资源解码时间比较长&#xff0c;可以预先缓存到缓存中。 本方案时候lvgl&#xff0d;&#xff17;&#xff0c;下面是参考 Images — LVGL documentation 实施&#xff1a; lv_img_cache_set_size(cachecount);  //设置缓存的图片…

算法通关村第七关|黄金挑战|迭代实现二叉树的前、中、后序遍历

1.迭代实现前序遍历 public List<Integer> preOrderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>();if (root null) {return res;}Deque<TreeNode> stack new LinkedList<TreeNode>();TreeNode node root;while (!…

开源项目管理工具Helper的安装及汉化

什么是 Helper &#xff1f; Helper 是基于 Laravel 和 Filament 的开源项目管理工具。 官方提供了在线演示&#xff1a;https://project-helper.net 安装 在群晖上以 Docker 方式安装。 数据库理论上是可以使用群晖自带的 MariaDB 的&#xff0c;但老苏为了省事&#xff0c…

数据结构与算法:队列栈BFSDFS

诸神缄默不语-个人CSDN博文目录 我和ChatGPT一起制作了一个框架&#xff0c;现在只填充了一部分&#xff0c;具体的在补了。 在复杂数据结构的学习路线图中&#xff0c;队列和栈是两种基础且重要的数据结构&#xff0c;它们是广度优先搜索&#xff08;BFS&#xff09;和深度优…

GIT 遇到问题

GIT 遇到问题 > git pull --tags From https://gitee.com/gdgmzwx/react-project-demo* [new branch] master -> origin/master There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(…