struct platform_device (/include/linux/Platform_device.h){ const char * name; int id; struct device dev; u32 num_resources; struct resource * resource;};
Platform_device 结构体描述了一个 platform 结构的设备,在其中包含了一般设备的结构体 struct device dev; 设备的资源结构体 struct resource * resource;还有设备的名字 const char * name。(注意,这个名字一定要和后面platform_driver.driver àname相同,原因会在后面说明。)
该结构体中最重要的就是resource结构,这也是之所以引入platform机制的原因。
struct resource ( /include/linux/ioport.h){ resource_size_t start; resource_size_t end; const char *name; unsigned long flags; struct resource *parent, *sibling, *child;};
其中 flags 表示该资源的类型,start 和 end 分别表示该资源的起始地址和结束地址(/include/linux/Platform_device.h):
struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state); int (*suspend_late)(struct platform_device *, pm_message_t state); int (*resume_early)(struct platform_device *); int (*resume)(struct platform_device *); struct device_driver driver;};
Platform_driver 结构体描述了一个 platform 结构的驱动。其中除了一些函数指针外,还有一个一般驱动的 device_driver 结构。
名字要一致的原因:
上面说的驱动在注册的时候会调用函数 bus_for_each_dev(), 对在每个挂在虚拟的platform bus 的设备作__driver_attach()→driver_probe_device(),在此函数中会对dev和drv做初步的匹配,调用的是drv->bus->match所指向的函数。
platform_driver_register 函数中 drv->driver.bus = &platform_bus_type,所以 drv->bus->match 就为 platform_bus_type→match,为 platform_match 函数,该函数如下:
static int platform_match(struct device * dev, struct device_driver * drv){ struct platform_device *pdev = container_of(dev, struct platform_device, dev); return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);}
是比较 dev 和 drv 的 name,相同则会进入 really_probe() 函数,从而进入自己写的 probe 函数做进一步的匹配。所以 dev→name 和 driver→drv→name 在初始化时一定要填一样的。
不同类型的驱动,其 match 函数是不一样的,这个 platform 的驱动,比较的是 dev 和drv 的名字,还记得 usb 类驱动里的 match 吗?它比较的是 Product ID 和 Vendor ID。
个人总结 Platform 机制的好处:
1、提供 platform_bus_type 类型的总线,把那些不是总线型的soc设备都添加到这条虚拟总线上。使得,总线——设备——驱动的模式可以得到普及。
本文地址:百科问答频道 https://www.neebe.cn/wenda/933974_4.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!