makesudo rmmod device sudo rmmod driversudo dmesg -c执行
结果表明,探头功能正确读取了硬件信息 。
四、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平台总线_ 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
平台总线类型的注册
五、注册代码流程详解该架构的优势在于它可以帮助我们定位问题 。
1. match函数何时被调用到?2. probe函数何时被调用到以下是上述两个问题代码的调用流程:
代码调用过程
推荐阅读
- 我的勇者输出流火战玩法攻略,升级必备
- 我的侠客擂台档进阶玩法详解,升级必备
- 小型电视柜 小户型必备
- 户外露营需要哪些装备呢 野营必备
- 赛博朋克2077免疫坠落伤害方法分享,升级必备
- 神之猎场单刷亚马逊攻略,亚马逊速刷技巧分享,升级必备
- GTA5佩里科岛保险箱密码介绍,升级必备
- 江南百景图小动物刷新一览,小动物刷新方法及规则分享,升级必备
- 幻书启世录新手阵容推荐,新手最强英雄推荐,升级必备
- 山棕床垫选购必备攻略