1、三种驱动模板
第一种在修改的时候需要阅读整个文件,后面是吧硬件资源和驱动分离开来,对platform_device plat_driver这两个结构体匹配,然后调用probe函数。
第二种在修改的时候需要重新编译加载驱动程序,第三种引入设备树直接加载到设备树里面。DTS DTB(二进制文件)到内核生成platform_device
2、实际匹配过程
platform_driver里面有of_match_table函数这个结构体里面会对应compatible实现匹配
3、匹配成功如何获得资源,怎么联系起来
1、reg属性
reg 的本意是 register,用来表示寄存器地址。
但是在设备树里,它可以用来描述一段空间。反正对于 ARM 系统,寄存器和内存是统一编址的,即访问寄存器时用某块地址,访问内存时用某块地址,在访问方法上没有区别。
reg 属性的值,是一系列的“address size”,用多少个 32 位的数来表示 address 和 size,由其父节点的#address-cells、 #size-cells 决定。
#address-cells // 在它的子节点的 reg 属性中, 使用多少个 u32 整数来描述地址(address)
#size-cells // 在它的子节点的 reg 属性中, 使用多少个 u32 整数来描述大小(size)
of_address.h // 地址相关的函数,
// 比如 of_get_address(获得 reg 属性中的 addr, size 值)
platform_device 相关的函数:platform_get_resource这个函数跟设备树没什么关系, 但是设备树中的节点被转换为 platform_device 后, 设备树中的 reg 属性、 interrupts 属性也会被转换为“resource”。这时,你可以使用这个函数取出这些资源
对于设备树节点中的 reg 属性,它属性 IORESOURCE_MEM 类型的资源;
对于设备树节点中的 interrupts 属性,它属性 IORESOURCE_IRQ 类型的资源。
platform_derive和某一个platform_device匹配,可以从 platform_device 中得到device_node,再用 of_property_read_u32
得到属性的值:
实际操作过程
#define GROUP_PIN(g,p) ((g<<16) | (p))
这个东西的意思第几组第几个节点,为什么可以这样写?
驱动程序修改:
现在我是两个led,对应每一个匹配的platform_device都会调用一次,那么我就会调用两次probe函数
probe函数里面我们需要做什么事情?
我们需要从platform里面找到对应的设备节点取出里面的pin属性
这里回顾一下之前的open write
fileoperation 里面调用open write这两个函数分别调用底层的init 和 crtl函数