LCD笔记(4)分析内核自带的LCD驱动程序

2023-11-19

1. 驱动程序框架

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

  • 分配fb_info

  • 设置fb_info

  • 注册fb_info

  • 硬件相关的设置

1.1 入口函数注册platform_driver

1.2 设备树有对应节点

2. 编写硬件相关的代码

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

  • GPIO设置

    • LCD引脚

    • 背光引脚

  • 时钟设置

    • 确定LCD控制器的时钟

    • 根据LCD的DCLK计算相关时钟

  • LCD控制器本身的设置

    • 比如设置Framebuffer的地址

    • 设置Framebuffer中数据格式、LCD数据格式

    • 设置时序

2.1 GPIO设置

有两种方法:

  • 直接读写相关寄存器

  • 使用设备树,在设备树中设置pinctrl

    • 本课程专注于LCD,所以使用pinctrl简化程序

 

2.2 时钟设置

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

 

代码里直接使用时钟子系统的代码。

  • 在设备树里指定频率:

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

    • 代码:clock-frequency

 

从设备树获得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);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LCD笔记(4)分析内核自带的LCD驱动程序 的相关文章

随机推荐

  • C#中unsafe的使用

    1 unsafe在C 程序中的使用场合 实时应用 采用指针来提高性能 引用非 net DLL提供的如C 编写的外部函数 需要指针来传递该函数 调试 用以检测程序在运行过程中的内存使用状况 2 使用unsafe的利弊 好处是 性能和灵活性提高
  • python 分段拟合 判别_利用Python检验你的策略参数是否过拟合(转)

    过拟合现象 一般来说 量化研究员在优化其交易策略参数时难免会面临这样一个问题 优化过后的策略在样本内表现一般来说均会超过其在样本外的表现 即参数过拟合 对于参数优化来说 由于优化时存在噪音 过拟合是不可避免的现象 然而为了追求策略的稳定性
  • unity期末作业-插针游戏

    unity期末作业 插针游戏 附下载链接 鼠标控制针的发射 圆盘可以显示接住的针数目 若两根针碰到则界面变红 游戏结束 详细情况如下动态图 点我下载 https download csdn net download weixin 43474
  • 从云到「链」,京东云成为中国第四朵云背后

    在产业加速到数实融合加速的今年 云计算不再是云厂商的唯一考校指标 作者 叶子 出品 产业家 京东云再次破圈 信号来自接连发布的几份报告 在国际权威研究机构Forrester发布的名为 The Forrester Wave Public Cl
  • maven官网下载bin.tar.gz和bin.zip以及src.tar.gz和src.zip的区别

    maven官网http maven apache org download cgi 去官网下载的时候不知道选哪个 现在记录一下 首先弄清楚各后缀的含义 1 bin代表二进制class文件 由java文件编译而成 src代表源码 java源码
  • 天池数据竞赛docker提交操作学习

    天池数据竞赛docker提交操作学习 由于最近天池的比赛都要求使用docker来提交结果 所以在此记录一下docker提交到天池的整个流程 目前正在做的 全球人工智能技术创新大赛 热身赛二 比赛链接 https tianchi aliyun
  • 高效计算基础与线性分类器

    七月算法5月深度学习班课程笔记 No 2 1 深度学习与应用 1 图像上的应用 可以根据图片 识别图片的内容 描述图像 模仿人的创造性生成画作 相册自动归类等 2 NLP上的应用 用RNN学习某作家的文笔风格进行写作 学习代码写作等 下图为
  • 使用 gperftools 分析程序cpu性能

    一 gperftools 简介 gperftools 是 google 开源的一组套件 提供了高性能的 支持多线程的 malloc 实现 以及一组优秀的性能分析工具 二 安装 gperftools 2 1 下载源码 从 gperftools
  • DockerCompose的安装以及使用

    docker compose的安装以及使用 docker compose的定义 docker compose是docker容器的单机编排工具 它是一个可以管理多容器的工具 比如可以解决多容器之间的依赖关系 比如启动nginx前端服务的时候会
  • redis使用Jackson2JsonRedisSerializer序列化问题

    一 spring boot 集成Redis方法 依赖
  • /proc/modules分析

    参考 redhat linux deployment guide 5 2 21 proc modules This file displays a list of all modules loaded into the kernel Its
  • Qt5实现与单片机ATS89S51通信

    Qt实现与单片机直接的通信上位机 单片机代码 测试环境 项目目标 实现效果 关键通信类 QSerialport 总结 这是我大二下学期的单片机课设做的一个小项目 实现上位机与下位机之间的通信 测试环境 开发环境 Qt5 96 Mingw32
  • Acwing 890. 能被整除的数

    注 S 表示集合S中的元素个数 对于 S1 U S2 U S3 U U Sn 中的任意一个元素x 证明在等式右侧只被计算一次 上述证明中假设x属于k个集合 推出x会被计算的次数 注 Si是指1 n中i的倍数的个数 使用容斥原理的时间复杂度是
  • 3年c/c++开发总结(二):书籍[1]

    对3年来学习中书籍的整理 评价 主要为c c 方面 分数为个人意见 虽然大家都知道 但还是强调下 免得口水 分1 5 5为最高 格式 英文名 中文名 作者 出版社 个人评价 评分 无译者说明是因为建议看原版 p s 国产图书要努力 因看过的
  • (Ext基础篇) 表单与输入控件

    FormPanel和BasicForm详解 我们制作一个Ext form FormPanel 然后在里面设置field 顾名思议 FormPanel是Ext Panel的一个子类 可以对其执行各种Panel操作 实际上 表单的功能是在Ext
  • vue滚动插件:vue-seamless-scroll

    地址 使用 vue seamless scroll 使用方法 1 下包 yarn add vue seamless scroll 2 局部导入 import vueSeamlessScroll from vue seamless scrol
  • 搜索指定站点和指定文档类型

    对于像我这个不生产代码 只是代码搬运工的程序员来说 搜索引擎是必不可少的 遇到问题 搜索一下 基本都能找到答案 但有时 搜索出来的答案千篇一律 而且垃圾网站一波波 这时就要指定搜索某些 网站 如csdn 1 指定站点 在搜索框里面输入 关键
  • HTTP状态码总结

    为了更好地了解各个状态码代表的意思 做了一个总结 在实际的工作中 主要涉及到的还是200 404 500等 1 HTTP状态码分5大类 状态码 类别 100 199 信息性状态码 200 299 成功状态码 300 399 重定向状态码 4
  • 如何在 wxPython 中创建多个工具栏

    在GUI编程领域 wxPython已经成为一个功能强大且通用的库 使开发人员能够轻松制作令人惊叹的图形用户界面 在众多基本组件中 工具栏在为用户提供对各种功能的快速访问方面发挥着至关重要的作用 在本教程中 我们将深入探讨使用 wxPytho
  • LCD笔记(4)分析内核自带的LCD驱动程序

    1 驱动程序框架 Linux驱动程序 驱动程序框架 硬件编程 在前面已经基于QEMU编写了LCD驱动程序 对LCD驱动程序的框架已经分析清楚 核心就是 分配fb info 设置fb info 注册fb info 硬件相关的设置 1 1 入口