分析完了linux设备模型的核心实现代码,想小结下挂在总线上的设备和驱动是如何匹配上的。
以平台总线(platform bus)为例:
向系统中注册一个平台设备(platform device)时,需调用:platform_device_register()函数,
该函数会调用相关函数初始化一个设备实例,并将其挂到平台总线上:
int platform_device_register(struct platform_device *pdev) { device_initialize(&pdev->dev); arch_setup_pdev_archdata(pdev); return platform_device_add(pdev); }
函数device_initialize()便是完成对设备实例的初始化工作,该函数是设备模型核心提供的接口函数。
接下来,platform_device_add()将设备挂到平台总线,该函数的实现不算太复杂,其主要功能是:
1、将平台设备和平台总线绑定起来
2、设置设备的名称
3、如果我们在创建一个平台设备时,指定了其需要的“资源”,在该函数中会分配给设备
4、调用函数device_add()将平台设备抽象的“设备”添加到设备容器中
其实,除了第3,第1和第2、以及前面对设备实例的初始化工作,都是为第4点做准备。
device_add()的源码较长,其主要是对前面一些已被初始化的参数进行检查、在sys中创建对应的目录以及
一些属性文件、向用户空间发送热插拔事件,最后调用bus_probe_device()为我们注册的设备匹配对应的驱动。
前面写了总结了这么多,终于进入主题了——开始设备和驱动的匹配。
将设备和挂在总线上的驱动进行匹配:
void bus_probe_device(struct device *dev) { struct bus_type *bus = dev->bus; struct subsys_interface *sif; int ret; if (!bus) return; if (bus->p->drivers_autoprobe) { ret = device_attach(dev); WARN_ON(ret < 0); } mutex_lock(&bus->p->mutex); list_for_each_entry(sif, &bus->p->interfaces, node) if (sif->add_dev) sif->add_dev(dev, sif); mutex_unlock(&bus->p->mutex); }
(未完)

浙公网安备 33010602011771号