LDD3筆記——scull模塊加載與卸載函數

    在字符設備驅動模塊加載函數中應實現設備號的申請和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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章