struct class_device {
struct kobject kobj;
struct class *class;
struct device *dev;
void *class_data;
char class_id[BUS_ID_SIZE];
};
class_id 成員持有設(shè)備名子, 如同它在 sysfs 中的一樣. class 指針應(yīng)當(dāng)指向持有這個(gè)設(shè)備的類, 并且 dev 應(yīng)當(dāng)指向關(guān)聯(lián)的設(shè)備結(jié)構(gòu). 設(shè)置 dev 是可選的; 如果它是非 NULL, 它用來創(chuàng)建一個(gè)符號(hào)連接從類入口到對應(yīng)的在 /sys/devices 下的入口, 使得易于在用戶空間找到設(shè)備入口. 類可以使用 class_data 來持有一個(gè)私有指針.
通常的注冊函數(shù)已經(jīng)被提供:
int class_device_register(struct class_device *cd);
void class_device_unregister(struct class_device *cd);
實(shí)例用法 ,參照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是個(gè)stuct device結(jié)構(gòu)。
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)建了一個(gè)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 是分配的設(shè)備號(hào), device 是代表這個(gè)設(shè)備的 struct device, 其他的參數(shù)是一個(gè) printk-風(fēng)格 的格式串和參數(shù)來創(chuàng)建設(shè)備名子. 這個(gè)調(diào)用添加一項(xiàng)到類, 包含一個(gè)屬性, dev, 含有設(shè)備號(hào). 如果設(shè)備參數(shù)是非 NULL, 一個(gè)符號(hào)連接( 稱為 device )指向在 /sys/devices 下的設(shè)備的入口。
可能添加其他的屬性到設(shè)備入口. 它只是使用 class_device_create_file,
在這里,class_simple_device_add向這個(gè)類添加了設(shè)備,該設(shè)備設(shè)備號(hào)為devno.名字為davinci。,于是在sys下有:
# ls /sys/class/davinci/davinci/dev
/sys/class/davinci/davinci/dev
# cat /sys/class/davinci/davinci/dev
252:0
向calss下添加一個(gè)dev會(huì)產(chǎn)生熱插拔事件,如果有UDEV運(yùn)行,那么這時(shí)在/dev目錄下會(huì)出現(xiàn)/dev/davinci設(shè)備,并且設(shè)備號(hào)為252:0。
其實(shí)"class_simple_device_add"也是class_device_register和class_device_create_file的封裝。
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |