linux驱动关于platfrom的device以及driver

        (带设备树)驱动加载时,是利用设备树里的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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值