kobject ktype kset是设备模型的基础
kobject嵌入在其他结构体当中,该结构便拥有了kobject的功能。
提供如引用计数、名称、父指针等字段,用于创建对象的层次结构。
ktype是为了描述一族kobject所具有的普遍特性。因此,不再需要每个
kobject都分别定义自己的特性,而是将这些普遍的特性在ktype结构中
一次定义,然后所有同类的kobject都能共享一样的特性。
kset是kobject对象的集合体。可以当作一个容器,具有相同ktype的kobject
可以分组到不同的kset中。
/sysfs文件系统是一个处于内存中的虚拟文件系统,提供了kobject对象层次结构
视图。sysfs的根目录/sys包含了七个目录:block、bus、class、devices等
block目录下的每个子目录都对应着系统中的一个块设备。
bus目录提供了一个系统总线视图。
class目录包含了以高层功能逻辑组织起来的系统设备视图。
devices目录是系统中设备拓扑结构视图。
一、总线注册:
static int test_match,(struct device *dev, struct device_driver *driver)//判断设备名和驱动名是否相同,相同执行驱动中的probe
{
return !strncmp(dev_name(dev), driver->name, strlen(driver->name));
}
static void test_bus_release(struct device *dev)
{
printk(KERN_DEBUG "test bus release\n");
}
struct device test_bus = {
.init_name = "test_bus0",
.release = test_bus_release
};
struct bus_type test_bus_type = {
.name = "test_bus",
.match = test_match,
};
/*注册总线*/
ret = bus_register(&test_bus_type);
/*创建属性文件*/
bus_create_file(&test_bus_type, &bus_attr_version)
/*注册总线设备*/
ret = device_register(&test_bus);
二、驱动注册:
static int test_probe(struct device *dev) //当设备名和驱动名相同,执行此probe,驱动中的probe会调用其容器(如平台驱动)的probe
{
printk("Driver found device which test driver can handle!\n");
return 0;
}
static int test_remove(struct device *dev)
{
printk("Driver found device unpluged!\n");
return 0;
}
struct device_driver test_driver =
{
.name = "test_dev",
.bus = &test_bus_type,
.probe = test_probe,
.remove = test_remove,
};
/*注册驱动*/
driver_register(&test_driver);
/*创建属性文件*/
driver_create_file(&test_driver, &driver_attr_drv);
三、设备注册:
struct device test_dev = {
.bus = &test_bus_type,
.parent = &test_bus,
.release = test_dev_release,
};
/* 初始化设备 */
test_dev.init_name = "test_dev";
/*注册设备*/
device_register(&test_dev);
/*创建属性文件*/
device_create_file(&test_dev, &dev_attr_dev);
四、平台驱动与平台设备注册
平台驱动平台设备是嵌套在driver、device之上,如platform_driver是driver的容器
借助于driver、device中的kobject机制挂在已注册platform总线上
1 平台驱动注册
static struct platform_driver test_driver = {
.probe = test_probe,
.remove = test_remove,
.driver = {
.owner = THIS_MODULE,
.name = "test_dev",
},
};
/*注册平台驱动*/
platform_driver_register(&test_driver);
2 平台设备注册
/* 分配结构 */
test_device = platform_device_alloc("test_dev", -1);
/*注册设备*/
ret = platform_device_add(test_device);