1,注册platform_device 设备时,如果 struct resource 里面的寄存器地址一样,在卸载时(卸载两个时,卸载一个是没有错误的)会出现段错误(比如 两个 led时,实际上是不会一样的,只是在做实验时,我为了方便就用了一样的,结果在卸载时就出现段错误了,很好奇,为啥会出错,struct resource 里面的数据不是在匹配上驱动时才会被操作吗,难道在注册设备时也会被内核操作?)
2、
3、无论是在哪种总线上注册驱动,最终都会调用 int driver_register(struct device_driver *drv)这个函数
在看源代码时,发现 自己写的probe函数被替换成内核提供的probe函数了,我们提供的probe函数实际上是在内核(platform总线)提供的那个probe函数里面执行的,我觉得这样做原因是 driver_register函数的参数类型是struct device_driver,而我们用platform_driver_register函数注册的参数类型是struct platform_driver,也就是类型不一样。内核提供的probe函数的参数类型是struct device_driver,但是它会利用这个函数找到struct platform_driver,也就是我们那个参数
总的来说,还是为了方便上层人员的开发,因为如果是用driver_register函数注册驱动还需要指定bus类型等东西,但是用platform_driver_register函数就不需要做这一步了。
4、
在驱动中要获取resource这个结构体要用到
struct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num) 函数,num是指索引,这个索引并不一定等于前面那个数字(比如 [0] ),而是等于从上到下相同类型的序号,类型在参数type中指定。
设备的信息除了可以用resource(有限制,因为这是个结构体)存放,也可以放在 platform_data (限制少,这只是个 void 类型的指针)中
获取 platform_data 是很简单的,直接定义跟platform_data 数据类型的变量比如
int data = pdev->platform_data。(pdev是传进来的platform_device 结构体)
5、有设备树下
当设备树和驱动匹配后,在platform_device 结构体上就有设备节点 node 的指针了 ,就不需要再用of_find_node_by_name啥的函数去设备树中捞了。