Chinaunix首页 | 论坛 | 博客
  • 博客访问: 620371
  • 博文数量: 168
  • 博客积分: 1053
  • 博客等级: 少尉
  • 技术积分: 1187
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-30 17:20
个人简介

公众号【嵌入式er笔记】持续记录和分享C/C++、Linux、ARM、Android、IoT等技术相关知识,以及职场、生活经验和感悟。

文章分类

全部博文(168)

分类:

2013-01-14 10:33:24

原文地址:class device的注册 作者:lpzgbd

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的封装。

阅读(2372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~