公众号【嵌入式er笔记】持续记录和分享C/C++、Linux、ARM、Android、IoT等技术相关知识,以及职场、生活经验和感悟。
分类:
2013-01-14 10:33:24
原文地址:class device的注册 作者:lpzgbd
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_dev是struct 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-0”,”i2c-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_register和class_device_create_file的封装。