这个属于分离的思想,将设备和驱动分开管理。
总线是处理器和设备之间的通道。总线有多种类型,每种总线可以挂载多个设备。
在设备模型中,所有的设备都通过总线相连,以总线来管理设备和驱动函数。总线有bus_type结构表示。
设置总线的属性后,会在对应的总线目录下增加了一个新的文件,通过对该文件的读写访问,触发相应的函数 *** 作,从而实现/sys/的文件接口与内核设备模型的数据交互。
bus_attribute中有两个函数指针,show和store。
使用宏BUS_ATTR
BUS_ATTR(_name, _mode, _show, _store)
该宏会定义一个名叫bus_attr__name的bus_attibute的结构,并且成员name设置为_name,文件权限mode设置为_mode,两个函数调用分别人show和store。
使用以下调用:
该函数失败时返回错误号。
一旦调用该函数,会就在指定bus总线的目录下新建一个名叫_name的文件
驱动程序是在CPU运行时,提供 *** 作的软件接口。所有的设备必须有与之配套驱动程序才能正常工作。一个驱动程序可以驱动多个类似或者完全不同的设备。
和设备不一样的是,在注册驱动函数是必须指定该驱动函数对应的总线,因为驱动函数注册成功后,会存放在对应总线的driver目录下,如果没有总线,注册当然会失败。
1、定义结构体device_driver。
2、调用注册函数:
设备就是连接在总线上的物理实体。设备是有功能之分的。具有相同功能的设备被归到一个类,如输入设备(鼠标,键盘,游戏杆等)。
linux系统中每个设备都用一个device结构的表示
注册一个完整的device结构前,至少定义parrent、bus_id、bus和release成员
1、定义结构体device。
2、调用注册函数:
使用宏DEVICE_ATTR
DRIVER_ATTR(_name, _mode, _show, _store)
该宏会定义一个名叫driver_attr__name的driver_attibute的结构,并且成员name设置为_name,文件权限mode设置为_mode,两个函数调用分别人show和store。
一旦调用该函数,会就在指定dev设备的目录下新建一个名叫_name的文件.
设备模型是2.6内核新引入的特征。设备模型提供了一个独立的机制专门来表示设备,并描述其在系统中的拓扑结构。
sys下有如下目录
block:用于管理块设备,系统中的每一个块设备会在该目录下对应一个子目录。
bus:用于管理总线,每注册一条总线,在该目录下有一个对应的子目录。
其中,每个总线子目录下会有两个子目录:devices和drivers。devices包含里系统中所有属于该总线的的设备。drivers包含里系统中所有属于该总线的的驱动。
class:将系统中的设备按功能分类。
devices:该目录提供了系统中设备拓扑结构图。
dev:该目录已注册的设备节点的视图。
class/net/eth0的路径其实就是devices目录中一个网卡设备的软连接。
sys中的其他目录都是将device目录下的数据加以转换加工而得。上面的图中,将usb设备归类到bus总线上,又把它归类到class。正是在sys中有很多这样的结构,内核就有一个完整而且复杂的拓扑结构图。
而维护这些关系的结构体就包括kobject、kset、ktype和subsystem等数据结构
kobject是一个对象的抽象,它用于管理对象。每个kobject对应着sysfs中的一个目录。
kobject用struct kobject来描述。
kset是一些kobject的集合,这些kobject可以有相同的ktype,也可以不同。同时,kset自己也包含一个kobject。在sysfs中,kset也是对应这一个目录,但是目录下面包含着其他的kojbect。
每个kobject对象都内嵌有一个ktype,该结构定义了kobject在创建和删除时所采取的行为。
device和driver里面都有一个成员变量bus,表示它们归哪个总线管理;
bus里面则有两个链表,device链表和driver链表。
当有新的设备加入的时候,就会将它加入它对应的bus的device链表,然后在它的驱动链表中寻找是否有驱动driver和该device匹配成功,如果匹配成功设备就可以正常使用了,否则,不好意思继续等待。
当有新的驱动加入的时候,就会将它加入它对应的bus的driver链表,然后在它的设备链表中寻找是否有设备device和该driver匹配成功,如果成功设备就可以正常使用了
bus_add_device()
bus_probe_device
device_attach
__device_attach
i2c hid设备是linux的I2C设备驱动模型,platform驱动在代码中的作用是在其probe方法获取到platform设备的参数,初始化I2C控制器硬件参数和软件机制,并在I2C总线下注册一个I2C适配器设备,以被内核默认创建的I2C总线驱动dev_driver匹配。
驱动,计算机软件术语,是指驱动计算机里软件的程序。驱动程序全称设备驱动程序,是添加到 *** 作系统中的特殊程序,其中包含有关硬件设备的信息。
此信息能够使计算机与相应的设备进行通信。驱动程序是硬件厂商根据 *** 作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。
驱动作用
驱动本质上是软件代码,其主要作用是计算机系统与硬件设备之间完成数据传送的功能,只有借助驱动程序,两者才能通信并完成特定的功能。如果一个硬件设备没有驱动程序,只有 *** 作系统是不能发挥特有功效的,也就是说驱动程序是介于 *** 作系统与硬件之间的媒介。
实现双向的传达,即将硬件设备本身具有的功能传达给 *** 作系统,同时也将 *** 作系统的标准指令传达给硬件设备,从而实现两者的无缝连接。
以上内容参考 百度百科-驱动
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)