《精通linux设备驱动程序开发》——视频驱动程序

一、显示架构

  1、PC系统的显示连接。(P247  图12-1)


  2、VGA(视频图形阵列)是IBM提出的早期显示标准。VGA的分辨率是640X480,而更新的标准比如SVGA(高级视频图形阵列)和XGA(扩展图形阵列)分别支持更高的

        800X600和1024X768的分辨率。嵌入式设备上常用具有320X240分辨率的QVGA面板。


  3、视频电缆标准

   1)、模拟显示器。

   2)、数字平面显示器。

   3)、与DVI(数字视频接口)规范兼容的显示器。

   4)、与HDTV(高清电视)规范兼容的显示器。


  4、嵌入式系统的显示连接。(P249  图12-2)


  5、嵌入式系统的LVDS和DVI连接。(P249  图12-3)



二、Linux视频子系统

  1、帧缓冲的概念解决了低可移植性和冗余代码导致的大量投入和维护开销的问题。从而开发成员可以以与平台无关的方式编写应用层和较高内核层的程序。(P250  图12-4)


  2、Linux视频子系统。(P250  图12-5)

   1)、此子系统包括底层显示驱动程序、中间层帧缓冲和控制台、高层虚拟终端驱动程序、X Windows的用户模式驱动程序和配置显示参数程序。

   2)、X Windows  GUI操作视频卡的方式有两种:或者使用适用于相应视频卡的内建用户空间驱动程序,或者工作在帧缓冲子系统之上。

   3)、文本模式控制台工作在虚拟终端字符驱动程序之上。



三、显示参数

  1、有时为了让设备能播放视频,在编写驱动程序的时候,只需要配置与显示面板的属性即可。


  2、fbset命令来显示特性

    

   1)、D:值表示dotclock,它是视频硬件在显示器上绘制像素的速率。

   2)、值65.003MHz表示视频控制器绘制一个像素需要用时约15384ps,这个时间称为pixclock,是timings行中的第一个数值参数。

   3)、geometry(几何形状)后面的数表示可视的分辨率为1024X768(SVGA),一个像素的信息需8bit来保存。

   4)、H:后面的值是为水平扫描率,它是视频硬件每秒扫描的水平显示线数目,是pixclock乘以X次方向分辨率的积德倒数。

   5)、V:值是整屏的刷新率,是pixclock、X方向分辨率、Y方向分辨率三者的积的倒数。

   6)、视频控制器在每行结束时发一个水平同步脉冲(HSYNC),在每帧结束时发一个垂直同步脉冲(VSYNC)。



四、帧缓冲API

  1、帧缓冲核心层向用户空间输出设备结点,一边应用程序能访问每个支持的视频设备。


  2、struct  fd_var_screeninfo结构体(视频卡的属性)

  


  3、struct  fd_fix_screeninfo结构体(视频硬件的固定信息)

    


  4、struct  fd_cmap结构体(颜色映射)

     struct  fd_cmap  {

        __u32  start;

        __u32  len;

        __u16  *read;

        __u16  *green;

        __u16  *blue;

        __u16  *transp;

     };


  5、以硬件无关的方式清除显示屏(代码清单12-1)




五、帧缓冲驱动程序

 一)、导航系统简介

  1、一个Linux导航设备的显示系统。(P254  图12-6)

   1)、工作过程:GPS接收机通过UART接口向SOC发送坐标数据流,应用程序根据收到的位置信息产生图像,并更新系统内存中的帧缓冲。帧缓冲驱动程序通过DMA方式将

             这幅图像数据传输到作为SoC LCD控制器一部分的显示缓冲区,控制器将像素数据传输到QVGA LCD面板进行显示。


  2、导航系统被设计成此结构:GPS应用程序运行在LCD控制器的底层帧缓冲驱动程序上。应用程序通过dev/ttySX从GPS接收机获得位置,这里的X是连接到接收机的UART

        号。然后它将几何定位信息转换成图像,并将像素数据写入与LCD控制器相关的帧缓冲。


  3、LCD控制器的寄存器。(P255  表12-1)



 二)、数据结构

  1、fd_info结构体

  

 


  2、fd_ops结构体

 

      

        



 三)、检查和设置参数

  1、fd_check_var()方法执行变量的合法性检查。同时也设置合适的RGB格式。


  2、fd_set_par()方法根据fd_check_var中的值设置LCD控制器的寄存器:

   1)、HSYC_REG中的水平同步时间,左空边,右空边。

   2)、VSYC_REG中的垂直同步时间,上空边,下空边。

   3)、SIZE_REG中的可见区X、Y分辨率。

   4)、MNA_REG中的DMA参数。


  3、GPS应用程序试图将QVGA的分辨率改为50X50。



 四)、屏幕消隐

  1、fd_blank()方法支持显示消隐和去消隐,主要用于电源管理。



 五)、加速方法

  1、如果用户接口需要执行繁重的视频操作,可能就需要通过图形加速来获得可以接受的性能。


  2、fd_imageblit()方法在显示器上画一幅图像,这个函数为驱动程序提供了一个能利用视频控制器所拥有的某些特别能力的机会,以加速这种操作。如果硬件不支持加速功

        能,cfd_imageblit()就是帧缓冲核心为加速提供的通用库函数。


  3、fd_copyarea()将屏幕的一个矩形区域复制到另一个区域。如果图形控制器没有任何可加速这个操作的能力,那么fd_copyarea()就为这个操作提供优化的方法。


  4、fd_fillrect()方法能快速用像素行填充矩形区。cfd_fillrecf()方法则是这种操作的一个通用的非加速方法。



 六)、从帧缓冲DMA

  1、导航系统的LCD控制器包含了一个DMA引擎,其能从系统内存抓取图形帧。控制器将得到的图像数据发到显示面板。DMA的速率支撑了显示器的刷新率。


  2、适合并发访问的禁止cache的帧缓冲区是从myfd_probe()中用dma_alloc_coherent()分配的。my_set_par()将这个已分配的DMA地址写入LCD控制器的DMA_REG寄存器。


  3、当驱动程序启用DMA时,控制器就通过同步DMA方式从帧缓冲不断将像素数据转送到显示器。所以,当GPS应用程序映射帧缓冲并写入位置信息时,像素就会被绘制到

         LCD上。



 七)、对比度和背光

  1、导航系统中的LCD控制器通过使用CONTRAST_REG寄存器来控制对比度。驱动程序通过myfd_ioctl()向用户空间提供这个寄存器接口。


  2、导航系统的LCD面板通过背光照亮,处理器通过DPIO线控制背光,因此设置相应引脚的电平就可以开/关背光。内核通过sysfs结点将其抽象为一般背光接口。为了利用这

        个接口,驱动程序必须实现backlight_ops结构体,而且该结构体中要包含获得和改变背光亮度的函数,然后通过调用backlight_device_regisiter将其注册到内核。


  3、导航系统的帧缓冲驱动程序。(P260  代码清单12-2)




六、控制台驱动程序

 一)、简介

  1、控制台是用于显示内核产生的printk()消息的一种设备。控制台包含两层,顶层驱动程序以及负责高级操作的底层驱动程序。


  2、控制台驱动程序主要使用两种接口定义的结构。顶层控制台驱动程序以struct  console为主,它定义了基本操作,底层驱动程序以struct  consw为主,它指定了高级操作。

   

   


  2、两层控制台驱动程序的结构

  


 二)、设备实例:手机

  1、USB_UART上的控制台(代码清单12-3)


 三)、启动logo

  1、帧缓冲子系统的一个特色是可以启动logo。为了显示这个logo,在内核配置阶段启用CONFIG_LOGO选项并选择一个可用的logo。


  2、CLUT224是常用的启动logo的图片形式,它支持224种颜色。一个CLUT224图片是包含以下两种结构的C文件。

   1)、CLUT,它是一个224个RGB组的字符矩阵。每个3字节的CLUT单元是红、绿、蓝3种颜色的组合。

   2)、数据矩阵,它的每个字节是CLUT表的索引,索引从32开始,一直到225结束。32指向CLUT表中的第一个单元。logo操作码从与数据矩阵每个索引对应的CLUT组创建

             帧缓冲像素数据,图像显示由底层帧缓冲驱动程序的fd_inmagelit()方法完成。


  3、其他支持logo格式包括16色的vga16和黑白的单色。scripts/目录下的脚本可将标准的PPM文件转换成支持的logo格式。



七、调试(略)

       

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 原书名: Essential Linux Device Drivers 原出版社: Prentice Hall 作者: (印)Sreekrishnan Venkateswaran 译者: 宋宝华 何昭然 史海滨 吴国成 丛书名: 图灵程序设计丛书 操作系统 出版社:人民邮电出版社 ISBN:9787115221674 出版日期:2010 年6月 页码:468 内容简介   本书是linux设备驱动程序开发领域的权威著作。全书基于2.6内核,不仅透彻讲解了基本概念和技术,更深入探讨了其他书没有涵盖或浅尝辄止的许多重要主题和关键难点,如pcmcia、i2c和usb等外部总线以及视频、音频、无线连网和闪存等驱动程序开发,并讲解了相关的内核源码文件,给出了完整的开发实例。   本书适合中高级linux开发人员阅读。 目录 第1章 引言1 1.1 演进1 1.2 gnu copyleft2 1.3 kernel.org2 1.4 邮件列表和论坛3 1.5 linux发行版3 1.6 查看源代码4 1.7 编译内核7 1.8 可加载的模块8 1.9 整装待发9 第2章 内核11 2.1 启动过程11 2.1.1 bios-provided physical ram map12 2.1.2 758mb lowmem available14 2.1.3 kernel command line: ro root=/dev/hda114 2.1.4 calibrating delay...1197.46 .bogomips (lpj=2394935)15 2.1.5 checking hlt instruction16 2.1.6 net: registered protocol family 217 2.1.7 freeing initrd memory: 387k freed17 2.1.8 io scheduler anticipatory registered (default)18 2.1.9 setting up standard pci resources18 2.1.10 ext3-fs: mounted filesystem19 2.1.11 init: version 2.85 booting19 2.2 内核模式和用户模式20 2.3 进程上下文和中断上下文20 2.4 内核定时器21 2.4.1 hz和jiffies21 2.4.2 长延时22 2.4.3 短延时24 2.4.4 pentium时间戳计数器24 2.4.5 实时钟25 2.5 内核中的并发26 2.5.1 自旋锁和互斥体26 2.5.2 原子操作30 2.5.3 读—写锁31 2.5.4 调试32 2.6 proc文件系统32 2.7 内存分配33 2.8 查看源代码34 第3章 内核组件37 3.1 内核线程37 3.1.1 创建内核线程37 3.1.2 进程状态和等待队列41 3.1.3 用户模式辅助程序42 3.2 辅助接口43 3.2.1 链表44 3.2.2 散列链表49 3.2.3 工作队列49 3.2.4 通知链51 3.2.5 完成接口54 3.2.6 kthread辅助接口56 3.2.7 错误处理助手57 3.3 查看源代码58 第4章 基本概念61 4.1 设备驱动程序介绍61 4.2 中断处理63 4.2.1 中断上下文63 4.2.2 分配irq号64 4.2.3 设备实例:导航杆65 4.2.4 softirq和tasklet68 4.3 linux设备模型71 4.3.1 udev71 4.3.2 sysfs、kobject和设备类73 4.3.3 热插拔和冷插拔76 4.3.4 微码下载76 4.3.5 模块自动加载77 4.4 内存屏障78 4.5 电源管理79 4.6 查看源代码79 第5章 字符设备驱动程序81 5.1 字符设备驱动程序基础81 5.2 设备实例:系统cmos82 5.2.1 驱动程序初始化83 5.2.2 打开与释放86 5.2.3 数据交换88 5.2.4 查找92 5.2.5 控制94 5.3 检测数据可用性95 5.3.1 轮询95 5.3.2 fasync98 5.4 和并行端口交互99 5.5 rtc子系统108 5.6 伪字符驱动程序109 5.7 混杂驱动程序110 5.8 字符设备驱动程序注意事项115 5.9 查看源代码115 第6章 串行设备驱动程序118 6.1 层次架构119 6.2 uart驱动程序121 6.2.1 设备实例:手机122 6.2.2 rs-485132 6.3 tty驱动程序132 6.4 线路规程134 6.5 查看源代码141 第7章 输入设备驱动程序143 7.1 输入事件驱动程序144 7.2 输入设备驱动程序150 7.2.1 serio150 7.2.2 键盘150 7.2.3 鼠标152 7.2.4 触摸控制器157 7.2.5 加速度传感器158 7.2.6 输出事件158 7.3 调试159 7.4 查看源代码160 第8章 i2c协议161 8.1 i2c/smbus是什么161 8.2 i2c核心162 8.3 总线事务164 8.4 设备实例:eeprom164 8.4.1 初始化165 8.4.2 探测设备167 8.4.3 检查适配器的功能169 8.4.4 访问设备169 8.4.5 其他函数170 8.5 设备实例:实时时钟171 8.6 i2c-dev174 8.7 使用lm-sensors监控硬件174 8.8 spi总线174 8.9 1-wire总线176 8.10 调试176 8.11 查看源代码176 第9章 pcmcia和cf179 9.1 pcmcia/cf是什么179 9.2 linux-pcmcia子系统181 9.3 主机控制器驱动程序183 9.4 pcmcia核心183 9.5 驱动程序服务183 9.6 客户驱动程序183 9.6.1 数据结构184 9.6.2 设备实例:pcmcia卡185 9.7 将零件组装在一起188 9.8 pcmcia存储189 9.9 串行pcmcia189 9.10 调试191 9.11 查看源代码191 第10章 pci193 10.1 pci系列193 10.2 寻址和识别195 10.3 访问pci198 10.3.1 配置区198 10.3.2 i/o和内存199 10.4 dma200 10.5 设备实例:以太网—调制解调器卡203 10.5.1 初始化和探测203 10.5.2 数据传输209 10.6 调试214 10.7 查看源代码214 第11章 usb216 11.1 usb体系架构216 11.1.1 总线速度218 11.1.2 主机控制器218 11.1.3 传输模式219 11.1.4 寻址219 11.2 linux-usb子系统220 11.3 驱动程序的数据结构221 11.3.1 usb_device结构体221 11.3.2 urb222 11.3.3 管道223 11.3.4 描述符结构223 11.4 枚举225 11.5 设备实例:遥测卡225 11.5.1 初始化和探测过程226 11.5.2 卡寄存器的访问230 11.5.3 数据传输233 11.6 类驱动程序236 11.6.1 大容量存储设备236 11.6.2 usb-串行端口转换器241 11.6.3 人机接口设备243 11.6.4 蓝牙243 11.7 gadget驱动程序243 11.8 调试244 11.9 查看源代码245 第12章 视频驱动程序247 12.1 显示架构247 12.2 linux视频子系统249 12.3 显示参数251 12.4 帧缓冲api252 12.5 帧缓冲驱动程序254 12.6 控制台驱动程序265 12.6.1 设备实例:手机266 12.6.2 启动logo270 12.7 调试270 12.8 查看源代码271 第13章 音频驱动程序273 13.1 音频架构273 13.2 linux声音子系统275 13.3 设备实例:mp3播放器277 13.3.1 驱动程序函数和结构体278 13.3.2 alsa编程287 13.4 调试288 13.5 查看源代码289 第14章 块设备驱动程序291 14.1 存储技术291 14.2 linux块i/o层295 14.3 i/o调度器295 14.4 块驱动程序数据结构和方法296 14.5 设备实例:简单存储控制器298 14.5.1 初始化299 14.5.2 块设备操作301 14.5.3 磁盘访问302 14.6 高级主题304 14.7 调试306 14.8 查看源代码306 第15章 网络接口卡308 15.1 驱动程序数据结构308 15.1.1 套接字缓冲区309 15.1.2 网络设备接口310 15.1.3 激活311 15.1.4 数据传输311 15.1.5 看门狗311 15.1.6 统计312 15.1.7 配置313 15.1.8 总线相关内容314 15.2 与协议层会话314 15.2.1 接收路径314 15.2.2 发送路径315 15.2.3 流量控制315 15.3 缓冲区管理和并发控制315 15.4 设备实例:以太网nic316 15.5 isa网络驱动程序321 15.6 atm321 15.7 网络吞吐量322 15.7.1 驱动程序性能322 15.7.2 协议性能323 15.8 查看源代码324 第16章 linux无线设备驱动326 16.1 蓝牙327 16.1.1 bluez328 16.1.2 设备实例:cf卡329 16.1.3 设备实例:usb适配器330 16.1.4 rfcomm331 16.1.5 网络332 16.1.6 hid334 16.1.7 音频334 16.1.8 调试334 16.1.9 关于源代码334 16.2 红外335 16.2.1 linux-irda335 16.2.2 设备实例:超级i/o芯片337 16.2.3 设备实例:ir dongle338 16.2.4 ircomm340 16.2.5 联网340 16.2.6 irda套接字341 16.2.7 lirc341 16.2.8 查看源代码342 16.3 wifi343 16.3.1 配置343 16.3.2 设备驱动程序346 16.3.3 查看源代码347 16.4 蜂窝网络347 16.4.1 gprs347 16.4.2 cdma349 16.5 当前趋势350 第17章 存储技术设备352 17.1 什么是闪存352 17.2 linux-mtd子系统353 17.3 映射驱动程序353 17.4 nor芯片驱动程序358 17.5 nand芯片驱动程序359 17.6 用户模块361 17.6.1 块设备模拟361 17.6.2 字符设备模拟361 17.6.3 jffs2362 17.6.4 yaffs2363 17.7 mtd工具363 17.8 配置mtd363 17.9 xip364 17.10 fwh364 17.11 调试367 17.12 查看源代码367 第18章 嵌入式linux369 18.1 挑战369 18.2 元器件选择370 18.3 工具链371 18.4 bootloader372 18.5 内存布局374 18.6 内核移植375 18.7 嵌入式驱动程序376 18.7.1 闪存377 18.7.2 uart377 18.7.3 按钮和滚轮378 18.7.4 pcmcia/cf378 18.7.5 sd/mmc378 18.7.6 usb378 18.7.7 rtc378 18.7.8 音频378 18.7.9 触摸屏379 18.7.10 视频379 18.7.11 cpld/fpga379 18.7.12 连接性379 18.7.13 专用领域电子器件380 18.7.14 更多驱动程序380 18.8 根文件系统380 18.8.1 nfs挂载的根文件系统381 18.8.2 紧凑型中间件382 18.9 测试基础设施383 18.10 调试383 18.10.1 电路板返工384 18.10.2 调试器385 第19章 用户空间的驱动程序386 19.1 进程调度和响应时间387 19.1.1 原先的调度器387 19.1.2 o(1)调度器387 19.1.3 cfs388 19.1.4 响应时间388 19.2 访问i/o区域390 19.3 访问内存区域393 19.4 用户模式scsi395 19.5 用户模式usb397 19.6 用户模式i2c400 19.7 uio401 19.8 查看源代码402 第20章 其他设备驱动程序403 20.1 ecc报告403 20.2 频率调整407 20.3 嵌入式控制器408 20.4 acpi408 20.5 isa与mca410 20.6 火线410 20.7 智能输入/输出411 20.8 业余无线电411 20.9 voip411 20.10 高速互联412 20.10.1 infiniband413 20.10.2 rapidio413 20.10.3 光纤通道413 20.10.4 iscsi413 第21章 调试设备驱动程序414 21.1 kdb414 21.1.1 进入调试器415 21.1.2 kdb415 21.1.3 kgdb417 21.1.4 gdb420 21.1.5 jtag调试器421 21.1.6 下载423 21.2 内核探测器423 21.2.1 kprobe423 21.2.2 jprobe427 21.2.3 返回探针429 21.2.4 局限性431 21.2.5 查看源代码431 21.3 kexec与kdump431 21.3.1 kexec432 21.3.2 kdump与kexec协同工作432 21.3.3 kdump433 21.3.4 查看源代码437 21.4 性能剖析437 21.4.1 利用oprofile剖析内核性能438 21.4.2 利用gprof剖析应用程序性能440 21.5 跟踪441 21.6 ltp444 21.7 uml444 21.8 诊断工具444 21.9 内核修改配置选项444 21.10 测试设备445 第22章 维护与发布446 22.1 代码风格446 22.2 修改标记446 22.3 版本控制447 22.4 一致性检查447 22.5 构建脚本448 22.6 可移植代码450 第23章 结束语451 23.1 流程一览表451 23.2 下一步该做什么452 附录a linux汇编453 附录b linux与bios457 附录c seq文件461

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值