linux驱动关于platfrom的device以及driver
(带设备树)驱动加载时,是利用设备树里的compatible去进行设备跟驱动的匹配,设备树在内核加载之后会自动将节点转化为platform_device这种格式,同时把名字放到of_node这个地方。利用compatible进行匹配。不带设备树的驱动加载时,可以用name名字去匹配,probe函数中是有device注册的函数的。linux驱动中,自动加载驱动是在执行完insmod指令之后,手动加载
(带设备树)驱动加载时,是利用设备树里的compatible去进行设备跟驱动的匹配,设备树在内核加载之后会自动将节点转化为platform_device这种格式,同时把名字放到of_node这个地方。利用compatible进行匹配。
不带设备树的驱动加载时,可以用name名字去匹配,probe函数中是有device注册的函数的。
linux驱动中,自动加载驱动是在执行完insmod指令之后,手动加载驱动的顺序是先insmod,然后在mknode,之后再dev目录下生成设备文件。在操作系统中,ioremap函数是将物理地址映射到内核虚拟地址,mmap函数是将物理地址映射到用户虚拟地址,在应用程序中就可以访问,进程的4GB地址空间0-3G是用户地址,3-4G是内核地址,这4G地址都是虚拟地址,应用程序只能访问虚拟地址,不能访问物理地址。
驱动中的总线,platform总线是虚拟总线,普通设备可以用虚拟总线来实现总线结构的驱动模型,其他设备是IIC或者SPI总线,这种事实际的总线。
关于驱动匹配的问题:linux驱动---设备注册 驱动注册与驱动匹配过程整理 - guoyw - 博客园
只有用到驱动模型(总线驱动,类似platform这种的或者spi、IIC总线),才需要device跟driver匹配,其他时候不需要匹配,直接在驱动中写硬件资源,因为没有总线,所以driver跟device没有挂到总线上,所以没有匹配函数,只需要在驱动程序中直接使用定义就可以。只有用到总线的时候才需要注册设备跟驱动进行匹配,并不是所有的驱动都需要用到总线模型去写。
驱动不是必须使用设备结构体去跟驱动匹配的,device结构体保存硬件资源,如果有的话可以直接获取,没有的话驱动中自己添加映射,不是必须用device结构体跟driver结构体去匹配,而且这个设备结构体跟驱动结构体说的是挂在总线上的(platfrom_device、platfrom_driver结构体),类似platfrom_device跟platfrom_driver这两个。
linux2.6版本前,直接使用register_chrdev就可以实现cdev的初始化这些函数去注册字符设备,2.6版本后,使用register_chrdev_region函数以及手动初始化cdev(cdev_init()、cdev_add()等函数),或者register_chrdev这两种方式都可以使用去注册字符设备,所以有时候我们会看到这两种代码在驱动的入口函数中。
linux驱动中总线驱动模型下,匹配顺序有:
1、先用设备树中的 compatible 属性和platform_driver中的driver中的 of_match_table 来匹配(没有设备
树进行第二种)
2、再用 platform_driver 中的 id_table 中的 name 和 platform_device 中的 name来匹配(这里的
id_table是platform_driver结构体中的,of_match_table是platform_driver的成员driver的成员变量)
3、最后用platform_device中的name和 platform_driver 中的 driver 中的 name来匹配
驱动匹配中的名字指的是platfrom_driver成员变量driver的成员name,platfrom_driver本身是没有name这一成员的,而设备的成员变量指的是platfrom_device的成员name。
关于驱动中的device跟driver模块,都需要在总线上注册,注册后才能进行匹配,如果是有设备树的情况下,修改设备树,在系统初始化的时,会将设备树解析成为设备模块,包括里面的资源(硬件资源都是保存在硬件
模块platfrom_device里,如果不是用总线结构写驱动,则没有这一结构体,也不需要去进行匹配),如果没有设备树的情况下,如果总线设备链表里没有此设备,没有进行过注册,则需要自己先写设备结构体,然后进行注册,类似驱动一样的写法,生成.ko文件,通过insmod去加载,device不需要进行probe,driver需要,device在总线上注册后,会在sys/bus/总线目录/device/下生成设备名字的文件,此时注册成功,注册成功后需要进行driver的注册,注册成功后进行匹配。匹配成功后进行probe。匹配的顺序有三种。任何一个方式匹配成功即可。
自己的理解,可能有错误,正在学习,只用来记录的博客
更多推荐
所有评论(0)