Linux内核必备知识点 platform_driver( 三 )


makesudo rmmod device sudo rmmod driversudo dmesg -c执行

结果表明,探针功能正确地读取了硬件信息 。
4.如何管理platform_device?1.没有设备树当没有设备树时,以三星Cortex-A8 s5pc100为例,将硬件信息放在以下位置
arch\arm\mach-s5pc100\Mach-smdkc100.carch\arm\plat-samsung\
注册平台_设备
平台_设备定义
这个数组存储了内核启动时需要初始化的硬件的信息 。
2.如果有设备树内核中会有完整的设备初始化的代码,在内核启动时会解析并初始化设备树信息,并将硬件信息初始化到对应的链表中 。总线匹配成功后,硬件信息会传递给probe()函数 。
四、其他与公交车相关的知识点1.内核总线相关结构变量内核维护的所有总线都需要用下面的结构注册一个变量 。
struct bus_type { const char*name; const char*dev_name; struct device*dev_root; struct device_attribute *dev_attrs; /* use dev_groups instead */ const struct attribute_group **bus_groups; const struct attribute_group **dev_groups; const struct attribute_group **drv_groups; int (*match)(struct device *dev, struct device_driver *drv); int (*uevent)(struct device *dev, struct kobj_uevent_env *env); int (*probe)(struct device *dev);int (*remove)(struct device *dev); void (*shutdown)(struct device *dev); int (*online)(struct device *dev); int (*offline)(struct device *dev); int (*suspend)(struct device *dev, pm_message_t state); int (*resume)(struct device *dev); const struct dev_pm_ops *pm; struct iommu_ops *iommu_ops; struct subsys_private *p; struct lock_class_key lock_key;};平台总线变量struct Bus _ Type的定义平台总线类型定义如下:
struct bus_type platform_bus_type = { .name= "platform", .dev_groups = platform_dev_groups, .match= platform_match, .uevent= platform_uevent, .pm= &platform_dev_pm_ops,};最重要的成员是** 。匹配** 。
当一个设备的硬件信息注册在platform_bus_type总线上时,它将遍历平台总线维护的所有驱动程序,并按名称进行匹配 。如果硬件信息相同,说明硬件信息与驱动匹配,会调用驱动的platform_driver ->probe函数初始化驱动的所有资源,使驱动生效 。
当设备的驱动程序在platform_bus_type总线上注册时,它将遍历由平台总线维护的所有硬件信息,并按名称匹配它 。如果相同,说明硬件信息与驱动匹配,它会调用驱动的platform_driver ->probe函数,初始化驱动的所有资源,使驱动生效 。
注册地点
drivers\base\Platform.c
平台_总线_类型的注册
动词 (verb的缩写)注册码流程详解架构的好处是可以帮助我们定位问题 。
1.什么时候调用匹配函数?2.什么时候调用探测函数以下是上述两个问题代码的调用流程:
代码调用过程
【Linux内核必备知识点 platform_driver】


推荐阅读