linux下camera驱动分析_LINUX设备驱动模型分析之一 总体概念说明

这段时间阅读了LINUX SYSFS模块的代码,并完成了相应的学习笔记,阅读这些代码,为我们分析LINUX设备驱动模型提供了基础。下面这一段时间我将分析LINUX设备驱动模型。

本次分析的LINUX设备驱动模型,主要涉及如下几个部分:

一、LINUX设备驱动模型总体概述()

二、LINUX总线(BUS)接口分析

三、LINUX设备(DEVICE)接口分析

四、LINUX驱动(DRIVER)接口分析

五、LINUX总线-设备-驱动接口关联说明

六、LINUX设备类接口说明

七、LINUX PLATFORM总线接口分析与说明

本章节主要对LINUX设备驱动模型相关的概念进行说明,先从整体上对LINUX设备驱动模型进

行了解,下一章节我们就进行具体内容的分析。

设备驱动模型说明

在sysfs文件系统下,有block、dev、bus、devices、class、fs、kernel等目录,本次我们介绍设备驱动模型,主要涉及class、bus、device这三个子目录。这三个目录下的子模块之间的关联与区别即构成了设备驱动模型。

其中,class模块主要将某一类的设备聚在一起,目前内核已支持的类型包括i2c-dev、rtc、gpio、sound、tty、input等。比如rtc类,该类下汇聚了所有rtc设备,而不管该rtc设备是通过i2c总线与cpu通信还是以spi总线与cpu通信,同时一个设备可能属于多个类,如rtc设备即属于rtc类,也可能属于i2c-dev类。

而devices目录下包含所有已扫描到的设备,每一个设备目录下面包含了uevent文件(主要用于向应用层发送event,可与udev相关联),也包含了每一个设备的属性信息,可进行设备属性的读写操作。

bus目录下存放了所有已注册的总线类型,而每一个总线目录下又包含了drivers子目录、devices子目录,其中drivers子目录下包含了所有注册到该总线上的驱动程序,而devices目录下包含了所有挂载至该总线类型上的设备,其中devices目录下的所有设备类型是/sys/devices目录下的链接文件。

如下是这三个模块之间的关联图,BUS、CLASS模块均与DEVICES进行关联,其中系统中所有的设备目录均在/sys/devices目录下创建,而BUS->devices目录下的子设备目录、CLASS目录下子设备目录均是/sys/devices目录下子设备目录的链接。

8cc1d441236aebcd43b80c1b6fa2459e.png

subsystem相关的结构体变量

针对BUS模块和CLASS模块,它们的结构体变量(struct class、struct bus)中均包含了struct subsys_private结构体变量,而该结构体变量中又包含了kset,从而完成了kobject的关联,因此在进行具体模块的分析之前,先对这几个结构体之间的关联进行梳理与说明。

如下所示,即为struct class、struct bus、struct subsys_private、kset、kobject、kobj_type、kref等结构体之间的关联,BUS模块和CLASS模块通过subsys_private即实现了与kset、kobject的关联,而我们在之前的分析文档《LINUX SYSFS文件系统分析之五 kobject、kset相关接口分析》中,已经分析了kset、kobject与sysfs文件系统的关联。由此即实现了bus模块、class模块与sysfs文件系统的关联。

而针对devices模块而言,并没有定义类似struct class、struct bus的结构体,但‘

devices模块定义了kset类型的全局变量struct kset *devices_kset,并在函数devices_init中完成了对变量devices_kset内存申请及初始化操作。

af7eff7ddd71d1f33ffee34844c16ea1.png
struct subsys_private {struct kset subsys;struct kset *devices_kset;struct list_head interfaces;struct mutex mutex; struct kset *drivers_kset;struct klist klist_devices;struct klist klist_drivers;struct blocking_notifier_head bus_notifier;unsigned int drivers_autoprobe:1;struct bus_type *bus; struct kset glue_dirs;struct class *class;};

如上即为subsys_private结构体的定义,其中kset用于将将该子系统下的kobject聚集在一起,而devices_kset则用于将所有设备对应的kobject聚集在一起,而drivers_kset则用来将所有注册的drivers链接在一起,而drivers_autoprobe则用于自动进行设备即驱动的注册操作(即在进行设备的注册以及驱动的注册时,扫描所有已经注册的驱动及设备,完成设备与驱动的匹配操作)。

本小节的内容比较少,主要对LINUX设备模型进行简要的介绍,以便对LINUX设备模型有一个概念,下一章将开始介绍具体的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值