本系列文章将分析Linux Framebuffer驱动的作用(需求)、框架、接口实现和使用。按笔者一直倡导的Linux学习理念—从软件需求的角度去理解Linux,对于Linux各个子系统,我们首先要理解其软件需求,从中自然会清楚其存在的价值和作用;接下来是理解子系统在Linux整个驱动框架中的层次、角色和如何交互;最后是理解驱动的接口如何实现软件需求,明确接口如何在各种场景中使用。
一、Linux设备驱动和裸设备驱动的关系
理解framebuffer的软件需求之前,我们先理解Linux设备驱动和裸设备驱动的关系:
例如,对于LCD液晶屏,其可以由三星研发的SOC S5PV210(Cortex A8 arm核)的多媒体硬件模块所支持。而对于具体某种LCD液晶屏,涉及到分辨率、时延参数等不同,需要通过软件来设置相应的SOC多媒体硬件寄存器,以达到控制显示的目的。这个软件设置就是SOC编程,其不管是SOC上运行的是Linux,还是Windows,或者是IOS,软件设置的最终结果体现到寄存器上都是一样的。一般地,嵌入式都是C语言开发,而高级处理器的寄存器是统一编址的,因此裸设备驱动外围设备的C语言代码基本是一样的。
在带操作系统运行时,为了安全考虑,系统一般分为用户态和内核态。那么,SOC编程是硬件编程,只能在内核态完成,并且需要向用户态程序提供一个接口以进行调用。对于不同的操作系统而言,从用户态的接口开始到进行最终的SOC编程接口调用的过程中,会经过不同的软件层次。对于Linux操作系统,设备驱动的接口调用过程就是Linux设备驱动框架所决定的。详见《Linux字符设备驱动剖析》、《Linux 设备文件的创建和mdev》、《总线、设备和驱动》和《字符设备驱动、设备驱动模型、sy