platform_device_id 是 一 样 的 。 以 前 总 线 总 是 通 过 platform_device.name 和
platform_driver.device_driver.name 来匹配。 新的 Linux 版 本 , 也 增 加 了 另 外 一 种
机 制 , 也 就 是 通 过 比 较 二 者 里 的 platform_device_id 里的 name。说白了,总线
匹配最终就是比较二者的名字。
struct device_driver {
const char
*name;
struct module
*owner;
...
const struct of_device_id *of_match_table;
...
struct driver_private *p;
};
在建有内核工程的 Source Insight 里搜索“of_match_table”,就会搜出一大堆示例,你会发现,
每 一 个 device_driver 实 例都 会 设 置 上面 这 三 个 加深 颜 色 的 成员 , 所 以 几乎 不 用 关 心
device_driver 的其他成员。
平台总线如何匹配设备和驱动
你前面不是说了吗?总线将设备和驱动进行绑定,在系统每注册一个设备的时候,会寻找与之
匹配的驱动;在系统每注册一个驱动的时候,也会寻找与之匹配的设备。那平台总线怎么匹配
呢?答:通过 platform_match()函数。
/* 参考 drivers/base/platform.c */
static int platform_match(struct device *dev, struct device_driver *drv)
{
struct platform_device *pdev = to_platform_device(dev);
struct platform_driver *pdrv = to_platform_driver(drv);
/* 因为没有配置 CONFIG_OF_DEVICE ,这里返回 0,不执行这个 if 分支
*/
if (of_driver_match_device(dev, drv))
return 1;
/*这里也是返回 0,不执行这个 if 分支*/
if (acpi_driver_match_device(dev, drv))
return 1;
/* 如果 pdrv->id_table 存在的话,调用 platform_match_id 函数
* 如果匹配成功,则返回 1,否则返回 0
*/
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL;