关于linux设备驱动模型中bus_type有些不懂

zxcasdqwe123asd 2013-09-25 03:55:32
struct bus_type
{
const char* name; //总线类型的名称
struct subsystem subsys; //该总线所属的子系统subsystem,代表自身---kset
struct kset drivers; //该总线所使用的驱动程序的集合
struct kset devices; //挂接在该总线上的所有设备的集合

.........................
.........................

}


问题1 :这个bus_type中的devices结构体,网上都讲这个devices作用是挂接在该总线上的所有设备的集合。但是device_register中将device中的kobj中的kset指向的是devices_subsys。没有指向devices。

问题2:
:device_register中将所有注册的device中的kobj结构体的kset都指向devices_subsys。在设备模型中设备之间的层次关系没有体系出来。

上面两个问题不知道我简述清楚了不
...全文
815 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjtea 2013-09-29
  • 打赏
  • 举报
回复
1)在系统初始化阶段,作为设备,有多种总线通过device_register注册到/sys/device/下,2楼说明了实现的过程; 2)作为某种总线下的设备,需要通过指定该设备的父节点,从而使之指向对应的总线。 3) 以platform下的设备为例,要调用platform.c中的 int platform_device_register(struct platform_device * pdev) 来进行注册。首先初始化: struct kset *devices_kset; // 定义为kset pdev->dev->kobj.kset = devices_kset; 然后指定: pdev->dev.parent = &platform_bus; // 指向设备的父结点为platform 最后经device_add,将pdev->dev->kobj添加到pdev->dev->parent->kobj之下。
Eliot_shao 2013-09-26
  • 打赏
  • 举报
回复
二楼“bjtea”说的已经很清楚了, 1。创建device kset容器 2.把注册的device对应的kobj.kset指向容器。
zxcasdqwe123asd 2013-09-26
  • 打赏
  • 举报
回复
引用 1 楼 seek_0380 的回复:
device_register中将device中的kobj中的kset指向是总线上的对应的devices keset。 driver也一样。
bus_type中的类型为kset的devices和kset_create_and_add("devices", &device_uevent_ops, NULL); 不是同 一个把。bus_type中的类型为kset的devices,比如PCI,对应/sys/bus/pci/devices ,而kset_create_and_add("devices", &device_uevent_ops, NULL)的devices是在顶层(/sys/devices).为什么注册device_register把device的kobj注册到顶层的device而不是在bus_type中的devices中
zxcasdqwe123asd 2013-09-26
  • 打赏
  • 举报
回复
引用 2 楼 bjtea 的回复:
1) 在device_register所在的core.c中,有 struct kset *devices_kset; // 定义为为kset devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); //初始化为devices 2) device_register执行过程的初始化中有 dev->kobj.kset = devices_kset; // 设置dev所属容器为devices_kset 从linu2.6到3.10,以上代码基本没变。所以,网上的说法是对的
bus_type中的类型为kset的devices和kset_create_and_add("devices", &device_uevent_ops, NULL); 不是同一个把。bus_type中的类型为kset的devices,比如PCI,则在假设称为相关层(/sys/bus/pci/devices) ,而kset_create_and_add("devices", &device_uevent_ops, NULL)的devices是在顶层(/sys/devices).为什么注册device_register把device的kobj注册到顶层的device而不是在bus_type中的devices中
bjtea 2013-09-26
  • 打赏
  • 举报
回复
1) 在device_register所在的core.c中,有 struct kset *devices_kset; // 定义为为kset devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); //初始化为devices 2) device_register执行过程的初始化中有 dev->kobj.kset = devices_kset; // 设置dev所属容器为devices_kset 从linu2.6到3.10,以上代码基本没变。所以,网上的说法是对的
zxcasdqwe123asd 2013-09-26
  • 打赏
  • 举报
回复
引用 7 楼 seek_0380 的回复:
你列出的源码只能说明向驱动模型内添加设备,会指向devices_subsys就是对应的/sys/devices目录。 但是和在bus上的devices kset容器添加设备并不矛盾,在device_add(dev);中就进一步实现了总线挂接对应设备的代码。对应的:/sys/bus/PCI(i2c,spi...)/devices。
网上讲的bus_type中的struct kset devices;表示挂接在该总线上的所有设备的集合。我们向bus注册设备的时候会调用device_register.那为什么注册device_register的时候device->kobj.kset指向devices_subsys而不是device->kobj.kset=bus_type.devices。
Eliot_shao 2013-09-26
  • 打赏
  • 举报
回复
你列出的源码只能说明向驱动模型内添加设备,会指向devices_subsys就是对应的/sys/devices目录。 但是和在bus上的devices kset容器添加设备并不矛盾,在device_add(dev);中就进一步实现了总线挂接对应设备的代码。对应的:/sys/bus/PCI(i2c,spi...)/devices。
zxcasdqwe123asd 2013-09-26
  • 打赏
  • 举报
回复
引用 5 楼 seek_0380 的回复:
二楼“bjtea”说的已经很清楚了, 1。创建device kset容器 2.把注册的device对应的kobj.kset指向容器。
看看liunx2.6.22的代码吧 int device_register(struct device *dev) { device_initialize(dev); return device_add(dev); } void device_initialize(struct device *dev) { kobj_set_kset_s(dev, devices_subsys); kobject_init(&dev->kobj); klist_init(&dev->klist_children, klist_children_get, klist_children_put); INIT_LIST_HEAD(&dev->dma_pools); INIT_LIST_HEAD(&dev->node); init_MUTEX(&dev->sem); spin_lock_init(&dev->devres_lock); INIT_LIST_HEAD(&dev->devres_head); device_init_wakeup(dev, 0); set_dev_node(dev, -1); } 在看看第一个函数 #define kobj_set_kset_s(obj,subsys) \ (obj)->kobj.kset = &(subsys) 从这里可以看到device_register的时候,把每个device->kobj.kset=devices_subsys。而这个是devices_subsys是一个顶层的对应/sys/devices目录。但是网上的人讲的是bus_type中的 struct kset devices; 的作用是挂接在该总线上的所有设备的集合。但是从代码可以看到每个调用device_register的设备,都是讲他的device->kobj.kset=devices_subsys(对应目录/sys/devices)而不是device->kobj.kset=bus_type.devices(对应目录/sys/bus/PCI(i2c,spi...)/devices).
Eliot_shao 2013-09-25
  • 打赏
  • 举报
回复
device_register中将device中的kobj中的kset指向是总线上的对应的devices keset。 driver也一样。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧