分析内核自带的LCD驱动程序_基于IMX6ULL

news2024/11/16 2:14:57

分析内核自带的LCD驱动程序_基于IMX6ULL


文章目录

  • 分析内核自带的LCD驱动程序_基于IMX6ULL
  • 参考资料:
    • 一、驱动程序框架
      • 1.1 入口函数注册platform_driver
      • 1.2 设备树有对应节点
      • 1.3 probe函数分析
    • 二、 编写硬件相关的代码
      • 2.1 GPIO设置
      • 2.2 时钟设置
      • 2.3 LCD控制器的配置
  • 致谢



参考资料:

  • 内核自带的IMX6ULL LCD驱动程序
    • 驱动源码:Linux-4.9.88\drivers\video\fbdev\mxsfb.c
    • 设备树:
      • arch/arm/boot/dts/imx6ull.dtsi
      • arch/arm/boot/dts/100ask_imx6ull-14x14.dts

一、驱动程序框架

Linux驱动程序 = 驱动程序框架 + 硬件编程。
在前面已经基于QEMU编写了LCD驱动程序,对LCD驱动程序的框架已经分析清楚。
核心就是:

  • 分配fb_info
  • 设置fb_info
  • 注册fb_info
  • 硬件相关的设置

1.1 入口函数注册platform_driver

在这里插入图片描述

1.2 设备树有对应节点

在这里插入图片描述

1.3 probe函数分析

二、 编写硬件相关的代码

我们只需要针对IMX6ULL的编写硬件相关的代码,涉及3部分:

  • GPIO设置
    • LCD引脚
    • 背光引脚
  • 时钟设置
    • 确定LCD控制器的时钟
    • 根据LCD的DCLK计算相关时钟
  • LCD控制器本身的设置
    • 比如设置Framebuffer的地址
    • 设置Framebuffer中数据格式、LCD数据格式
    • 设置时序

2.1 GPIO设置

有两种方法:

  • 直接读写相关寄存器
  • 使用设备树,在设备树中设置pinctrl
    • 本课程专注于LCD,所以使用pinctrl简化程序

设备树arch/arm/boot/dts/100ask_imx6ull-14x14.dts中:
在这里插入图片描述

2.2 时钟设置

IMX6ULL的LCD控制器涉及2个时钟:

在这里插入图片描述
代码里直接使用时钟子系统的代码。

  • 在设备树里指定频率:

    • 文件:arch/arm/boot/dts/100ask_imx6ull-14x14.dts

    • 代码:clock-frequency

             display-timings {
                  native-mode = <&timing0>;
      
                   timing0: timing0_1024x768 {
                   clock-frequency = <50000000>;
      
  • 从设备树获得dot clock,存入display_timing

    • 文件:drivers\video\of_display_timing.c

    • 代码:

      ret |= parse_timing_property(np, "clock-frequency", &dt->pixelclock);
      
  • 使用display_timing来设置videomode

    • 文件:drivers\video\videomode.c

    • 代码:

      void videomode_from_timing(const struct display_timing *dt,
      			  struct videomode *vm)
      {
      	vm->pixelclock = dt->pixelclock.typ;
      	vm->hactive = dt->hactive.typ;
      	vm->hfront_porch = dt->hfront_porch.typ;
      	vm->hback_porch = dt->hback_porch.typ;
      	vm->hsync_len = dt->hsync_len.typ;
      
      	vm->vactive = dt->vactive.typ;
      	vm->vfront_porch = dt->vfront_porch.typ;
      	vm->vback_porch = dt->vback_porch.typ;
      	vm->vsync_len = dt->vsync_len.typ;
      
      	vm->flags = dt->flags;
      }
      
      
  • 根据videomode的值,使用时钟子系统的函数设置时钟:

    • 文件:drivers\video\fbdev\mxc\ldb.c
    • 代码:

在这里插入图片描述

2.3 LCD控制器的配置

以设置分辨率为例。

  • 在设备树里指定频率:

    • 文件:arch/arm/boot/dts/100ask_imx6ull-14x14.dts

    • 代码:clock-frequency

             display-timings {
                  native-mode = <&timing0>;
      
                   timing0: timing0_1024x768 {
      				hactive = <1024>;
      	            vactive = <600>;
      
      
  • 从设备树获得分辨率,存入display_timing

    • 文件:drivers\video\of_display_timing.c

    • 代码:

      	ret |= parse_timing_property(np, "hactive", &dt->hactive);
      	ret |= parse_timing_property(np, "vactive", &dt->vactive);
      
  • 使用display_timing来设置videomode

    • 文件:drivers\video\videomode.c

    • 代码:

      void videomode_from_timing(const struct display_timing *dt,
      			  struct videomode *vm)
      {
      	vm->hactive = dt->hactive.typ;
      
          vm->vactive = dt->vactive.typ;
      
  • 根据videomode的值,设置fb_videomode

    • 文件:drivers\video\fbdev\core\fbmon.c

    • 代码:

      int fb_videomode_from_videomode(const struct videomode *vm,
      				struct fb_videomode *fbmode)
      {
      	unsigned int htotal, vtotal;
      
      	fbmode->xres = vm->hactive;
      
          fbmode->yres = vm->vactive;
      
      
  • 根据fb_videomode的值,设置fb_info中的var:

    • 文件:drivers\video\fbdev\core\modedb.c

    • 代码:

      void fb_videomode_to_var(struct fb_var_screeninfo *var,
      			 const struct fb_videomode *mode)
      {
      	var->xres = mode->xres;
      	var->yres = mode->yres;
      
      
  • 根据var的分辨率,设置寄存器

    • 文件:drivers\video\fbdev\mxsfb.c

    • 代码:

      	writel(TRANSFER_COUNT_SET_VCOUNT(fb_info->var.yres) |
      			TRANSFER_COUNT_SET_HCOUNT(fb_info->var.xres),
      			host->base + host->devdata->transfer_count);
      
      
      
    • 文件:drivers\video\fbdev\mxsfb.c

    • 代码:

      	writel(TRANSFER_COUNT_SET_VCOUNT(fb_info->var.yres) |
      			TRANSFER_COUNT_SET_HCOUNT(fb_info->var.xres),
      			host->base + host->devdata->transfer_count);
      
      


致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!



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

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

相关文章

[软件工程导论(第六版)]第1章 软件工程学概述(课后习题详解)

文章目录1. 什么是软件危机&#xff1f;它有哪些典型表现&#xff1f;为什么会出现软件危机&#xff1f;2. 假设自己是一家软件公司的总工程师&#xff0c;当把图1.1给手下的软件工程师们观看&#xff0c;告诉他们及早发现并改正错误的重要性时&#xff0c;有人不同意这个观点&…

C#按边框切检验仪器图

最近碰到一个检验设备是生成PDF文件报告的。imedicallis监听程序把PDF解析出来之后发现PDF里面图不是多个小图&#xff0c;而是一张大图。但用户又要传到检验系统的是小图&#xff0c;而且小图位置和数量不固定&#xff0c;也不能用固定位置截取实现。为此开启一段“高端设备局…

Linux生产者消费模型

1.生产者消费者模型 1.1 为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接…

【淄博正大光明】收藏|三分钟带你全面了解这个神奇的镜片

对于孩子的东西 家长总是谨慎再谨慎 而对于夜间戴在眼睛里的镜片 家长更是存在很多顾虑 安全吗&#xff1f;有效吗&#xff1f; 影响孩子睡觉吗&#xff1f; 别着急淄博正大光明眼科医院 带你深度了解角膜塑形镜 01 角膜塑形镜究竟是什么&#xff1f; 角膜塑形镜是一种使用高分…

一文搞懂Linux内核进程CPU调度基本原理

为什么需要调度 进程调度的概念比较简单&#xff0c;我们假设在一个单核处理器的系统中&#xff0c;同一时刻只有一个进程可以拥有处理器资源&#xff0c;那么其他的进程只能在就绪队列中等待&#xff0c;等到处理器空闲之后才有计划获得处理器资源来运行。在这种场景下&#…

k8s快速入门

文章目录一、Kubernetes&#xff08;K8S&#xff09;简介1、概念1.1 Kubernetes (K8S) 是什么1.2 核心特性1.3 部署方案2、Kubernetes 集群架构2.1 架构2.2 重要概念 Pod2.3 Kubernetes 组件二、Kubernetes集群安装1、安装方式介绍2、minikubute安装3、裸机搭建&#xff08;Bar…

python实用脚本(六)—— pandas库的使用(生成、读取表格)

本期主题&#xff1a; python的pandas使用 往期链接&#xff1a; python实用脚本&#xff08;一&#xff09;—— 批量修改目标文件夹下的文件名python实用脚本&#xff08;二&#xff09;—— 使用xlrd读取excelpython实用脚本&#xff08;三&#xff09;—— 通过有道智云AP…

Linux 日志查找常用命令

1.1 cat、zcat cat -n app.log | grep "error"&#xff1a;查询日志中含有某个关键字error的信息&#xff0c;显示行号。 cat -n app.log | grep "error" --color&#xff1a;查询日志中含有某个关键字error的信息&#xff0c;显示行号&#xff0c;带颜色…

基于Detectron2模型和深度学习方法的改进森林火灾检测方法

1.文章信息本次介绍的文章是来自韩国科研团队的一篇2023年火灾检测文章&#xff0c;文章立足于森林火灾检测&#xff0c;题目为《An Improved Forest Fire Detection Method Based on the Detectron2 Model and a Deep Learning Approach》。2.摘要随着全球变暖和人口的增加&am…

【java】真正理解NIO

文章目录前言1、线程不够用, 就算使用了线程池复用线程也无济于事;2、阻塞I/O模式下,会有大量的线程被阻塞,一直在等待数据,这个时候的线程被挂起,只能干等,CPU利用率很低,换句话说,系统的吞吐量差;3、如果网络I/O堵塞或者有网络抖动或者网络故障等,线程的阻塞时间可能很长。整…

Spring boot实现热部署

1.说明 在我们进行Spring Boot项目的编写过程中&#xff0c;会有局部的代码&#xff0c;发生一些变动&#xff0c;这时候&#xff0c;我们只有将项目重启&#xff0c;发生变动的代码才能够生效&#xff0c;为了解决这个问题&#xff0c;我们可以设置Spring Boot热部署&#xf…

React Hooks之useRef详解

一、什么是useRef const refContainer useRef(initialValue); useRef 返回一个可变的 ref 对象&#xff0c;其内部只有一个 current 属性被初始化为传入的参数&#xff08;initialValue&#xff09;useRef 返回的 ref 对象在组件的整个生命周期内持续存在更新 current 值时并不…

Java 洛谷 P1739 表达式括号匹配

题目描述&#xff1a; 题目链接&#xff1a;https://www.luogu.com.cn/problem/P1739 代码实例&#xff1a; import java.util.Scanner; import java.util.Stack;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String…

本地生成动漫风格 AI 绘画 图像|Stable Diffusion WebUI 的安装和部署教程

Stable Diffusion WebUI 的安装和部署教程1. 简介2. Windows安装环境3. 运行4. 模型下载链接5. 其他资源1. 简介 先放一张WebUI的图片生成效果图&#xff0c;以给大家学习的动力 &#xff1a;&#xff09; 怎么样&#xff0c;有没有小小的心动&#xff1f;这里再补充一下&…

Linux文件系统中的硬链接及常见面试题

如果能对inode的概念有所了解&#xff0c;对理解本文会有所帮助。如果对inode的概念不太清楚也没有关系&#xff0c;我们会捎带介绍一下。在文件系统的实现层面&#xff0c;我们可以认为包含两个组件&#xff1a;一个是包含数据块的池子&#xff0c;池子中的数据块是等大小的&a…

K3S 系列文章-5G IoT 网关设备 POD 访问报错 DNS ‘i/o timeout‘分析与解决

开篇 《K3s 系列文章》《Rancher 系列文章》 问题概述 20220606 5G IoT 网关设备同时安装 K3S Server, 但是 POD 却无法访问互联网地址&#xff0c;查看 CoreDNS 日志提示如下&#xff1a; ... [ERROR] plugin/errors: 2 update.traefik.io. A: read udp 10.42.0.3:38545-&…

进程间通信(重点)

概念 进程是一个独立的资源分配单元&#xff0c;不同进程之间的资源是独立的进程并非孤立的&#xff0c;不同进程需要进行信息的交互和状态的传递&#xff0c;因此需要进程之间的通信【IPC: Inter processes communication】 如qq聊天&#xff0c;qq在每个人的手机上是独立的…

记录--滚动视差动画和解决方法

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 最简单的代码&#xff0c;最极致的享受&#xff0c;主打的就是一个炫酷&#xff5e; 滚动视差 滚动视差效果(Parallax Scrolling)是指让多层背景以不同的速度位移&#xff0c;形成立体的运动效果的视觉…

代码随想录算法训练营第三天 | 链表理论基础 、203.移除链表元素、707.设计链表、206.反转链表

打卡第三天&#xff0c;今天还是认真做了两道题目&#xff0c;明天要6点早起&#xff0c;想早点睡&#xff0c;加上昨天的螺旋数组&#xff08;昨天想到怎么做&#xff0c;但是代码实现解不出来&#xff0c;还没有仔细看视频讲解&#xff09;&#xff0c;和今天的设计链表&…

内网渗透(三十九)之横向移动篇-pass the ticket 票据传递攻击(PTT)横向攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…