Linux系统驱动之分析内核自带的LCD驱动程序_基于IMX6ULL
百问网技术交流群,百万嵌入式工程师聚集地:
https://www.100ask.net/page/2248041
资料下载
coding无法使用浏览器打开,必须用git工具下载:
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
视频观看
百问网驱动大全
分析内核自带的LCD驱动程序_基于IMX6ULL
参考资料,GIT仓库里:
IMX6ULL\开发板配套资料\datasheet\Core_board\CPU\IMX6ULLRM.pdf
《Chapter 34 Enhanced LCD Interface (eLCDIF)》
IMX6ULL的LCD裸机程序
IMX6ULL\source\03_LCD\05_参考的裸机源码\03_font_test
内核自带的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
- 驱动源码:
1. 驱动程序框架
Linux驱动程序 = 驱动程序框架 + 硬件编程。
在前面已经基于QEMU编写了LCD驱动程序,对LCD驱动程序的框架已经分析清楚。
核心就是:
- 分配fb_info
- 设置fb_info
- 注册fb_info
- 硬件相关的设置
1.1 入口函数注册platform_driver
1.2 设备树有对应节点
1.3 probe函数分析
2. 编写硬件相关的代码
我们只需要针对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);
百问网技术交流群,百万嵌入式工程师聚集地:
https://www.100ask.net/page/2248041
百问网技术论坛:
http://bbs.100ask.net/
百问网嵌入式视频官网:
https://www.100ask.net/index
百问网开发板:
淘宝:https://100ask.taobao.com/
天猫:https://weidongshan.tmall.com/
Linux系统驱动之分析内核自带的LCD驱动程序_基于IMX6ULL相关推荐
- Linux USB驱动框架分析 【转】
转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...
- linux RTC 驱动模型分析
linux RTC 驱动模型分析 RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间.RTC因为是电池供电的,所以掉电后时间不丢失.Linux内核把RTC用作&quo ...
- linux MISC 驱动模型分析
linux MISC 驱动模型分析 阅读led驱动程序的代码的时候,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数,这说明led设备是作为杂项设备出现在内核 ...
- Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)
<DPDK 20.05 | rte_pci_bus思维导图 | 第一版> <linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作> <Linux指令:ls ...
- Linux PCIe驱动框架分析(第二章)
目录 项目背景 1. 概述 2. 数据结构 3. 流程分析 3.1 设备驱动模型 3.2 初始化 3.2.1 pci_bus_match 3.2.2 pci_device_probe 3.3 枚举 项 ...
- 深入分析Linux PCI驱动框架分析(二)
说明: Kernel版本:4.14 ARM64处理器 使用工具:Source Insight 3.5, Visio 1. 概述 本文将分析Linux PCI子系统的框架,主要围绕Linux PCI子系 ...
- 【genius_platform软件平台开发】第六十八讲:linux系统驱动开发之-驱动程序发送信号给应用程序
大家好,我是峰哥,今天给大家解说一下:驱动层发送信号给应用程序.在上一篇文章中,我讲过:应用层发送指令来控制驱动层的GPIO状态,[genius_platform软件平台开发]第六十七讲:linux系 ...
- LINUX设备驱动模型分析之三 驱动(DRIVER)接口分析
上一章我们分析了bus-driver-device模型中bus接口部分,本章我们将分析driver接口,在bus-driver-device模型中,driver接口是依附于bus上,而不像device ...
- Linux i2c驱动框架分析 (二)
Linux i2c驱动框架分析 (一) Linux i2c驱动框架分析 (二) Linux i2c驱动框架分析 (三) 通用i2c设备驱动分析 i2c core i2c核心(drivers/i2c/i ...
最新文章
- 未来医疗AI发展的八大趋势
- Linux软raid创建和维护
- 第一课:数据结构的基本概念和术语
- 随笔:web服务器中建立一个小的个人站点
- Jackson序列化和反序列化
- 计算机导论声明型摆设,《计算机导论作业-论文排档》.doc
- p语言是python吗-Python语言
- 并发编程之美(1)并发编程基础
- python如何解压zip文件_Python压缩解压zip文件
- Iphone版音乐计算机,iPhone网易云音乐app的离线音乐导出到电脑
- 学生学籍管理系统数据库
- android悬浮窗口 关闭,Android悬浮窗的创建及关闭
- LPC1768的P0.27,P0.28管脚作为GPIO口输出需要外接上拉电阻才能输出高电平
- 高分一号影像处理流程
- C语言程序设计-同一天生日[综合应用]
- 登陆未名空间(mitbbs)的一个办法
- python cnn 股市_股市分析——ATR指标(附python代码)
- X61t安装Ubuntu后平板导航键失效解决方法
- 维控触摸屏通过U盘升级工程教程
- 2021上海各区小学梯队排名一览
热门文章
- vb 读取oracle中的表格数据,如何将数据库信息读取导出excel表格中-VB 从SQL数据库中把数据导出到Excel表格中,怎么写?...
- dns服务器响应名称,在没有配置的 DNS 服务器响应之后,名称xxxx的名称解析超时。...
- jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
- 蓝海创意云获苏州电信2022年度“云业务优秀合作方”表彰
- 游戏制作第四棒——坦克大战
- js创建元素并添加的几种方法
- 安利丨文案大神都在偷偷看的网站
- 关于Keil5编译器报错:ARMLMD_LICENSE_FILE: unset - 解决
- AI芯片独角兽寒武纪 - 诚聘虚拟化/深度学习/系统软件研发工程师
- React基础 - refs的详解与应用