framebuffer设备,字符设备,platform总线间的联系

欢迎各位转载!!!


最近在看Linux设备的驱动程序编程,里面的类型的设备驱动类型把我搞糊涂了。首先书上说linux中有字符设备,块设备,网络设备三大类驱动。但是接着又扯出一大堆的的什么platfrom平台设备驱动,帧缓冲区设备驱动等各种设备驱动,于是我就蒙b了......... !网上搜各种资料,因为不搞清楚的话感觉想写个驱动都不知道要选哪一种。下面来说说我的总结和理解,纯手打,有不对的地方望各位看官海涵,也加以斧正!!!


先来上一个LCD帧缓冲设备驱动的构架图,没图说个圈圈,先知道有这个东西就好接着往下看





首先我的理解是把所谓的字符设备/字符设备驱动 当做只对于用户空间有意义,因为字符设备中最重要的结构体file_operations中的各种read,write,iotrl操作都是为了给应用程序统一的操作接口而存在的,让用户编写app的时候可以通过这些read,write操作/dev/中的设备文件来调用我们实现的驱动程序来最终控制硬件设备的行为。我们在编写LCD驱动的时候才不管他么的字符设备跟我们的驱动程序有什么关系,我们只要把我们驱动程序跟这个 字符设备/字符设备驱动 联系起来就可以了 , 关键是怎么让我们填充的结构体跟字符设备联系起来,其实就是在字符设备的read,write这些函数中会去调用registered_fb[]这个全局数组中的那个你填充的结构体的信息,这样就联系起来了。所以字符设备和字符设备驱动在我的理解中应该如下图的层次,在下图中字符设备驱动这个就代表的上面架构途中的fbmem.c那一层了。


那么什么是LCD驱动相关呢?其实LCD驱动相关就跟架构途中的xxxfb.c这一层对应啦。更具体点就是s3c2410fb.c文件中的实现。我们知道LCD在soc中通常集成了现成的控制器来模拟时序,这是为了让我们更容易控制硬件。而这些有现成的控制器的驱动我们通常挂在到platform总线上。这里涉及另一个重要的需要铭记的概念,在linux2.6中,我们关注的是总线,设备,驱动之间的关系。这个platform是总线不是设备,什么平台设备平台设备驱动这听着很是误导人,所以我在标题中写的是platform总线。关于platform总线是虚拟总线这些概念,去查其他资料吧,在这里只要明白它是一种总线,它存在的目的时为了更方便的管理设备和驱动就行了。为了更好的管理LCD驱动,所以我们用到了paltform总线所以LCD驱动相关可以如下划分



那么platfrom_device中当然包含的是LCD相关的一些硬件资源什么的它定义在/arch/arm/plat-s3c24xx/devs.c中的s3c_device_lcd。platform_driver定义在/drivers/video/s3c2410fb.c中的s3c2410fb_driver。其实就是帧缓冲设备驱动填充struct fb_info结构体,然后使用register_framebuffer()来注册这个结构体到上面第二张图提到的registered_fb[]全局数组中去,这个数组保存了所有注册过的struct fb_info结构体,所谓注册本质就是保存到这个数组中去啦。当然填充以及注册帧缓冲设备的工作都是在platform_driver中的probe函数中去做的,所以platform_driver又可以如下划分:



好了,到这里为止,是否对字符驱动,平台总线以及帧缓冲设备驱动串到一起了呢?希望对你有所帮助。最后在上一张对我启发挺大的一张图,这张图是否能对应上面的分析过程呢?哈哈,这是从别人的文章中转的,原文章在

http://blog.csdn.net/chen198746/article/details/8954063




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章