百问网技术交流群,百万嵌入式工程师聚集地:
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相关推荐

  1. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  2. linux RTC 驱动模型分析

    linux RTC 驱动模型分析 RTC(real time clock)实时时钟,主要作用是给Linux系统提供时间.RTC因为是电池供电的,所以掉电后时间不丢失.Linux内核把RTC用作&quo ...

  3. linux MISC 驱动模型分析

    linux MISC 驱动模型分析 阅读led驱动程序的代码的时候,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数,这说明led设备是作为杂项设备出现在内核 ...

  4. Linux PCI驱动框架分析:(Peripheral Component Interconnect,外部设备互联)

    <DPDK 20.05 | rte_pci_bus思维导图 | 第一版> <linux系统下:IO端口,内存,PCI总线 的 读写(I/O)操作> <Linux指令:ls ...

  5. Linux PCIe驱动框架分析(第二章)

    目录 项目背景 1. 概述 2. 数据结构 3. 流程分析 3.1 设备驱动模型 3.2 初始化 3.2.1 pci_bus_match 3.2.2 pci_device_probe 3.3 枚举 项 ...

  6. 深入分析Linux PCI驱动框架分析(二)

    说明: Kernel版本:4.14 ARM64处理器 使用工具:Source Insight 3.5, Visio 1. 概述 本文将分析Linux PCI子系统的框架,主要围绕Linux PCI子系 ...

  7. 【genius_platform软件平台开发】第六十八讲:linux系统驱动开发之-驱动程序发送信号给应用程序

    大家好,我是峰哥,今天给大家解说一下:驱动层发送信号给应用程序.在上一篇文章中,我讲过:应用层发送指令来控制驱动层的GPIO状态,[genius_platform软件平台开发]第六十七讲:linux系 ...

  8. LINUX设备驱动模型分析之三 驱动(DRIVER)接口分析

    上一章我们分析了bus-driver-device模型中bus接口部分,本章我们将分析driver接口,在bus-driver-device模型中,driver接口是依附于bus上,而不像device ...

  9. Linux i2c驱动框架分析 (二)

    Linux i2c驱动框架分析 (一) Linux i2c驱动框架分析 (二) Linux i2c驱动框架分析 (三) 通用i2c设备驱动分析 i2c core i2c核心(drivers/i2c/i ...

最新文章

  1. 未来医疗AI发展的八大趋势
  2. Linux软raid创建和维护
  3. 第一课:数据结构的基本概念和术语
  4. 随笔:web服务器中建立一个小的个人站点
  5. Jackson序列化和反序列化
  6. 计算机导论声明型摆设,《计算机导论作业-论文排档》.doc
  7. p语言是python吗-Python语言
  8. 并发编程之美(1)并发编程基础
  9. python如何解压zip文件_Python压缩解压zip文件
  10. Iphone版音乐计算机,iPhone网易云音乐app的离线音乐导出到电脑
  11. 学生学籍管理系统数据库
  12. android悬浮窗口 关闭,Android悬浮窗的创建及关闭
  13. LPC1768的P0.27,P0.28管脚作为GPIO口输出需要外接上拉电阻才能输出高电平
  14. 高分一号影像处理流程
  15. C语言程序设计-同一天生日[综合应用]
  16. 登陆未名空间(mitbbs)的一个办法
  17. python cnn 股市_股市分析——ATR指标(附python代码)
  18. X61t安装Ubuntu后平板导航键失效解决方法
  19. 维控触摸屏通过U盘升级工程教程
  20. 2021上海各区小学梯队排名一览

热门文章

  1. vb 读取oracle中的表格数据,如何将数据库信息读取导出excel表格中-VB 从SQL数据库中把数据导出到Excel表格中,怎么写?...
  2. dns服务器响应名称,在没有配置的 DNS 服务器响应之后,名称xxxx的名称解析超时。...
  3. jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
  4. 蓝海创意云获苏州电信2022年度“云业务优秀合作方”表彰
  5. 游戏制作第四棒——坦克大战
  6. js创建元素并添加的几种方法
  7. 安利丨文案大神都在偷偷看的网站
  8. 关于Keil5编译器报错:ARMLMD_LICENSE_FILE: unset - 解决
  9. AI芯片独角兽寒武纪 - 诚聘虚拟化/深度学习/系统软件研发工程师
  10. React基础 - refs的详解与应用