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

2023-11-06 22:52

本文主要是介绍Linux学习第34天:Linux LCD 驱动实验(一):星星之火可以燎原,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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


       LCD显示屏是由一个一个的像素点构成的。当你能控制一个像素点的亮暗及颜色变化的时候,你就能让LCD显示瓶显示五颜六色的整幅图案。甚至可以让LCD屏幕显示一个动态的视频。这正如你点燃了一颗火柴,整个草原都能很快被点亮。

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

一、Linux下LCD驱动简析

1、Framebuffer设备

        Linux中应用程序最终也是通过操作RGB LCD的显存在LCD上显示字符、图片的。驱动程序设置的显存和应用程序访问的显存要是同一片物理内存。

        将系统中所有跟显示有关的硬件以及软件集合起来,虚拟出一个 fb 设备。

        编写好 LCD 驱动以后会生成一个名为/dev/fbX(X=0~n)的设备,应用程序通过访问/dev/fbX 这个设备就可以访问 LCD。

        /dev/fb0 是个字符设备,因此肯定有file_operations 操作集,

2、LCD驱动简析

        不同分辨率的 LCD 屏幕其 eLCDIF 控制器驱动代码都是一样的,只需要修改好对应的屏
幕参数即可。

        Linux 下Framebuffer 驱动的编写流程:

        LCD 的驱动就是构建 fb_info,并且向系统注册 fb_info结构体(属性、操作集合)的过程。

        mxsfb_probe 函数的主要工作内容为:
①、申请 fb_info。
②、初始化 fb_info 结构体中的各个成员变量。
③、初始化 eLCDIF 控制器。
④、使用 register_framebuffer 函数向 Linux 内核注册初始化好的 fb_info。

int register_framebuffer(struct fb_info *fb_info)
struct mxsfb_info *host;

        host 结构体指针变量,表示 I.MX6ULL 的 LCD 的主控接口, mxsfb_info 结构
体是 NXP 定义的针对 I.MX 系列 SOC 的 Framebuffer 设备结构体。

res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

        从设备树中获取 eLCDIF 接口控制器的寄存器首地址,设备树中 lcdif 节点已经设置了 eLCDIF 寄存器首地址为 0X021C8000,因此 res=0X021C8000。

host = devm_kzalloc(&pdev->dev, sizeof(struct mxsfb_info),
GFP_KERNEL);

        给 host 申请内存, host 为 mxsfb_info 类型结构体指针。

fb_info = framebuffer_alloc(sizeof(struct fb_info), &pdev->dev);

        给 fb_info 申请内存,也就是申请 fb_info。        

host->fb_info = fb_info;
fb_info->par = host;

        设置 host 的 fb_info 成员变量为 fb_info,设置 fb_info 的 par 成员变量为host。通过这一步就将前面申请的 host 和 fb_info 联系在了一起。

ret = devm_request_irq(&pdev->dev, irq, mxsfb_irq_handler, 0,
dev_name(&pdev->dev), host);

        申请中断,中断服务函数为 mxsfb_irq_handler

host->base = devm_ioremap_resource(&pdev->dev, res);

        对从设备树中获取到的寄存器首地址(res)进行内存映射,得到虚拟地址,并保存到 host 的 base 成员变量。因此通过访问 host 的 base 成员即可访问 I.MX6ULL 的整个 eLCDIF寄存器。
 

fb_info->pseudo_palette = devm_kzalloc(&pdev->dev, sizeof(u32) *16, GFP_KERNEL);

        给 fb_info 中的 pseudo_palette申请内存。

ret = mxsfb_init_fbinfo(host);

        调用 mxsfb_init_fbinfo 函数初始化 fb_info,重点是 fb_info 的 var、 fix、 fbops,creen_base 和 screen_size。其中 fbops 是 Framebuffer 设备的操作集。

        mxsfb_init_fbinfo 函数通过调用 mxsfb_init_fbinfo_dt 函数从设备树中获取到 LCD 的各个参数信息。最后, mxsfb_init_fbinfo函数会调用 mxsfb_map_videomem 函数申请 LCD 的帧缓冲内存(也就是显存)。

mxsfb_set_par(fb_info);
mxsfb_enable_controller(fb_info);

        设置 eLCDIF 控制器的相应寄存器。

ret = register_framebuffer(fb_info);

        调用 register_framebuffer 函数向 Linux 内核注册 fb_info。

二、硬件原理图分析

        三个 SGM3157 的目的是在未使用 RGBLCD 的时候将 LCD_DATA7、LCD_DATA15 和 LCD_DATA23 这三个线隔离开来,因为 ALIENTEK 的屏幕的 LCD_R7/G7/B7这几个线用来设置 LCD 的 ID,所以这几根线上有上拉/下拉电阻。但是 I.MX6U 的 BOOT 设置也用到了LCD_DATA7、 LCD_DATA15 和 LCD_DATA23 这三个引脚,所以接上屏幕以后屏幕上的 ID 电阻就会影响到 BOOT 设置,会导致代码无法运行,所以先将其隔离开来,如果要使用 RGB LCD 屏幕的时候再通过 LCD_DE 将其“连接”起来。我们需要 40P 的 FPC 线将 ATK7016屏幕和 I.MX6U-ALPHA 开发板连接起来,如图:

以下内容将在下一节中进行学习:

三、LCD驱动程序编写

四、运行测试

1、LCD屏幕基本测试

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

3、LCD背光调节

4、LCD自动关闭解决方法


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

这篇关于Linux学习第34天:Linux LCD 驱动实验(一):星星之火可以燎原的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359544

相关文章

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio