在字符設備驅動模塊加載函數中應實現設備號的申請和cdev的註冊,而在卸載函數中應實現設備號的釋放和cdev的註銷。
int scull_init_module(void)
{
int result, i;
dev_t dev = 0;
/* [1]分配設備編號 */
if (scull_major) { /* 預先自己指定了主設備號 */
dev = MKDEV(scull_major, scull_minor); /* 利用主設備號,找到設備編號給方法1用 */
result = register_chrdev_region(dev, scull_nr_devs, "scull");
} else { /* 動態自己生成設備編號,然後再利用設備編號得到主設備號;
記住如果用這個方法那麼就要後建設備文件了,因爲不能提前知道主號
當然也可以利用ldd3書中提供的腳本,巨方便&&通用 */
result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs,
"scull");
scull_major = MAJOR(dev);
}
if (result < 0) {
printk(KERN_WARNING "scull: can't get major %d/n", scull_major);
return result;
}
/*[2]設備對象實例化*/
/*
* allocate the devices -- we can't have them static, as the number
* can be specified at load time
*/
scull_devices = kmalloc(scull_nr_devs * sizeof(struct scull_dev), GFP_KERNEL);
if (!scull_devices) {
result = -ENOMEM;
goto fail; /* Make this more graceful */
}
memset(scull_devices, 0, scull_nr_devs * sizeof(struct scull_dev));
/* [3]在這裏初始化設備用了2.6的新方法,在scull_setup_cdev裏完成 */
/* Initialize each device. */
for (i = 0; i < scull_nr_devs; i++) {
scull_devices[i].quantum = scull_quantum; /* 可以根據自己insmod時傳參
來自己改變量子和量子集(指針數組)的大小 */
scull_devices[i].qset = scull_qset;
init_MUTEX(&scull_devices[i].sem);
scull_setup_cdev(&scull_devices[i], i); /* 在分別完主設備編號後goto Tag002 設備註冊 */
}
/* At this point call the init function for any friend device */
dev = MKDEV(scull_major, scull_minor + scull_nr_devs);
dev += scull_p_init(dev);
dev += scull_access_init(dev);
#ifdef SCULL_DEBUG /* only when debugging */
scull_create_proc();
#endif
return 0; /* succeed */
fail:
scull_cleanup_module();
return result;
}
module_init(scull_init_module); //insmod
module_exit(scull_cleanup_module); //rmmod