免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1120 | 回复: 0
打印 上一主题 下一主题

class device的注册 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-06 18:57 |只看该作者 |倒序浏览
Class_device接口

struct class_device {

struct kobject kobj;

struct class *class;

struct device *dev;

void *class_data;

char class_id[BUS_ID_SIZE];

 };

class_id 成员持有设备名子, 如同它在 sysfs 中的一样. class 指针应当指向持有这个设备的类, 并且 dev 应当指向关联的设备结构. 设置 dev 是可选的; 如果它是非 NULL, 它用来创建一个符号连接从类入口到对应的在 /sys/devices 下的入口, 使得易于在用户空间找到设备入口. 类可以使用 class_data 来持有一个私有指针.

通常的注册函数已经被提供:

int class_device_register(struct class_device *cd);

void class_device_unregister(struct class_device *cd);

实例用法 ,参照drivers/i2c/i2c-core.c

adap->class_devstruct class_device类型:

   memset(&adap->class_dev, 0x00, sizeof(struct class_device));

        adap->class_dev.dev = &adap->dev;

        adap->class_dev.class = &i2c_adapter_class;

        strlcpy(adap->class_dev.class_id, adap->dev.bus_id, BUS_ID_SIZE);

        class_device_register(&adap->class_dev);

adap->dev是个stuct device结构。

i2c_adapter_class定义:

static struct class i2c_adapter_class = {

        .name =         "i2c-adapter",

        .release =      &i2c_adapter_class_dev_release,

};

 adap->dev.bus_id的值形如i2c-0i2c-1这种类型。

那么在SYS目录下有:

# ls /sys/class/i2c-adapter/i2c-0/ 

device  driver

# ls /sys/class/i2c-adapter/i2c-0/device/

0-001a        0-0048        detach_state

0-003a        0-0068        name

# ls /sys/class/i2c-adapter/i2c-0/driver/

class_simple 接口

static struct class_device *davinci_class_device;

static struct class_simple *davinci_class;

davinci_class = class_simple_create( THIS_MODULE , "davinci" );

if( IS_ERR( davinci_class ) )

{

printk("creat davinci_class fault");

goto class_simple_create_err;

}

davinci_class_device = class_simple_device_add(davinci_class,devno,NULL,"davinci" );

class_simple_create创建了一个davinci .

class_simple_device_add的原形为:

struct class_device *class_simple_device_add(struct class_simple *cs, dev_t devnum, struct device *device, const char *fmt, ...); 

这里, cs 是之前创建的简单类, devnum 是分配的设备号, device 是代表这个设备的 struct device, 其他的参数是一个 printk-风格 的格式串和参数来创建设备名子. 这个调用添加一项到类, 包含一个属性, dev, 含有设备号. 如果设备参数是非 NULL, 一个符号连接( 称为 device )指向在 /sys/devices 下的设备的入口。

可能添加其他的属性到设备入口. 它只是使用 class_device_create_file, 

在这里,class_simple_device_add向这个类添加了设备,该设备设备号为devno.名字为davinci。,于是在sys下有:

# ls /sys/class/davinci/davinci/dev 

/sys/class/davinci/davinci/dev

# cat  /sys/class/davinci/davinci/dev 

252:0

calss下添加一个dev会产生热插拔事件,如果有UDEV运行,那么这时在/dev目录下会出现/dev/davinci设备,并且设备号为252:0

其实"class_simple_device_add"也是class_device_registerclass_device_create_file的封装。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP