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 應當指向關聯(lián)的設備結構. 設置 dev 是可選的; 如果它是非 NULL, 它用來創(chuàng)建一個符號連接從類入口到對應的在 /sys/devices 下的入口, 使得易于在用戶空間找到設備入口. 類可以使用 class_data 來持有一個私有指針.
通常的注冊函數(shù)已經(jīng)被提供:
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創(chuàng)建了一個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 是之前創(chuàng)建的簡單類, devnum 是分配的設備號, device 是代表這個設備的 struct device, 其他的參數(shù)是一個 printk-風格 的格式串和參數(shù)來創(chuàng)建設備名子. 這個調用添加一項到類, 包含一個屬性, dev, 含有設備號. 如果設備參數(shù)是非 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目錄下會出現(xiàn)/dev/davinci設備,并且設備號為252:0。
其實"class_simple_device_add"也是class_device_register和class_device_create_file的封裝。