Linux设备模型

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);


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值