设备驱动程序中的设备添加函数 - 代码详解
这段代码是设备驱动程序中的设备添加函数,它将新的设备添加到系统中。以下是代码的逐行解释:
if (dev->bus):判断设备是否已经有总线对象(即是否已经与总线相关联)。如果有,则执行下一行代码。blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_ADD_DEVICE, dev);:通过总线通知程序调用链通知所有订阅了总线添加设备事件的观察者。blocking_notifier_call_chain是一个阻塞的通知程序调用链函数,它会等待所有观察者完成处理之后才会返回。BUS_NOTIFY_ADD_DEVICE表示设备添加事件。kobject_uevent(&dev->kobj, KOBJ_ADD);:使用kobject_uevent()函数向用户空间发送一个内核对象事件,以通知用户空间发生了一个设备添加事件。KOBJ_ADD表示设备添加事件。bus_probe_device(dev);:调用总线的probe_device()方法来探测设备是否可用。该方法会根据设备的类型和驱动程序,进行一系列的初始化操作,例如分配资源、注册中断处理函数等。if (parent):判断该设备是否有父设备。如果有,则执行下一行代码。klist_add_tail(&dev->p->knode_parent, &parent->p->klist_children);:将该设备添加到父设备的子设备列表中。klist_add_tail()函数用于将一个节点添加到一个链表的尾部。if (dev->class):判断该设备是否有设备类。如果有,则执行接下来的代码块。mutex_lock(&dev->class->p->mutex);:获取设备类的互斥锁,防止其他线程同时访问设备类。klist_add_tail(&dev->p->knode_class, &dev->class->p->klist_devices);:将该设备添加到设备类的设备列表中。list_for_each_entry(class_intf, &dev->class->p->interfaces, node):遍历该设备类的所有接口。if (class_intf->add_dev):判断该接口是否有add_dev方法。如果有,则执行下一行代码。class_intf->add_dev(dev, class_intf);:调用该接口的add_dev方法,通知该接口设备已经添加。mutex_unlock(&dev->class->p->mutex);:释放设备类的互斥锁。
总结:这段代码通过一系列的操作,将一个新的设备添加到系统中,并通知相关的组件,例如总线、父设备和设备类。
原文地址: https://www.cveoy.top/t/topic/mHV4 著作权归作者所有。请勿转载和采集!