註冊字元裝置

核心內部使用struct cdev型別的結構來代表字元裝置。要讓核心能提調你的驅動程式提供的作業方法,你必須配置並註冊一或多個struct cdev。為此你的程式必須引入,因為struct cdev 與相關的輔助函式都定義於此標頭檔。用於配置struct cdev的函式是cdev_alloc(),你可以在執行期間配置一個獨立的cdev結構,然後接其fops欄位指向你的file_operations結構:

struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;

然而,如果你的驅動程式需要將cdev嵌在自己設計的一個特殊資料結構中,在這種情形下,就必須使用cdev_init()函式來初始化所得到的cdev;

void cdev_init(struct cdev *dev,struct file_operations *fops);

無論用哪一種方法初始化struct cdev,你都必須自己設定他的另一個欄位:owner。如同file_operations結構,struct cdev的owner欄位應該要被設定為THIS_MODULE。 準備好cdev結構後,最後一步就是以cdev_add()的方式將它加入核心:

int cdev_add(struct cdev *dev, dev_t num, unsigned count);

此處的dev式設定好的cdev結構,num是第一個裝置編號,count是裝置編號的總數。通常count是設定為1,除非驅動程式要應付多個裝置編號。範例:

static struct cdev devone_cdev;
static dev_t devone_dev;
int err = 0;
cdev_init(&devone_cdev,&devone_fops);
devone_cdev.owner = THIS_MODULE;
devone_cdev.ops = &devone_fops;
err=cdev_add(&devone_cdev,MKDEV(major,minor),1);
if(err) printk(KERN_NOTICE "Error %d adding scull%d", err, index);

要註銷cdev,只要呼叫cdev_del()即可,

void dcdev_del(struct cdev *dev);

results matching ""

    No results matching ""