Linuxデバイスドライバ開発 デバイスクラス

デバイスクラス

デバイスモデルはLinux2.6から導入された。
デバイスモデルには"device"と"driver"、"bus"と"class"というものが含まれている。
デバイスクラスを登録すると/sys/class 配下で存在が確認できるようになる。

  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3. #include <linux/types.h>          /* dev_t */  
  4. #include <linux/kdev_t.h>         /* MKDEV(), MAJOR() */  
  5. #include <linux/fs.h>             /* register_chrdev_region(), alloc_chrdev_region(), unregister_chrdev() */  
  6. #include <linux/device.h>         /* class_create(), class_unregister(), class_destroy() */  
  7.   
  8. MODULE_LICENSE("GPL v2");  
  9.   
  10. int drv_major = 0;  
  11. int drv_minor = 0;  
  12. int drv_nr_devs = 1;  
  13. struct class *skel_drv_class = NULL;  
  14.   
  15. #define SKEL_DRV_NAME "skel_drv"  
  16.   
  17. static int skel_init(void)  
  18. {  
  19.     dev_t dev = 0;  
  20.     int ret;  
  21.   
  22.     pr_info("%s\n", __FUNCTION__);  
  23.   
  24.     if (drv_major) {  
  25.         /* 指定デバイス番号を登録する */  
  26.         dev = MKDEV(drv_major, drv_minor);  
  27.         ret = register_chrdev_region(dev, drv_nr_devs, SKEL_DRV_NAME);  
  28.     }  
  29.     else {  
  30.         /* デバイス番号を動的に確保する */  
  31.         ret = alloc_chrdev_region(&dev, drv_minor, drv_nr_devs, SKEL_DRV_NAME);  
  32.         drv_major = MAJOR(dev);  
  33.     }  
  34.   
  35.     if (ret < 0) {  
  36.         pr_err("SKEL_DRV: cant't get major %d\n", drv_major);  
  37.     }  
  38.     else {  
  39.         pr_info("SKEL_DRV: char driver major number is %d\n", drv_major);  
  40.     }  
  41.   
  42.     /* デバイスクラスを作成する */  
  43.     skel_drv_class = class_create(THIS_MODULE, SKEL_DRV_NAME);  
  44.     if (IS_ERR(skel_drv_class)) {  
  45.         pr_err("SKEL_DRV: class_create failed\n");  
  46.         goto unregister_region;  
  47.     }  
  48.     else {  
  49.         goto exit;  
  50.     }  
  51.   
  52. unregister_region:  
  53.     unregister_chrdev_region(dev, drv_nr_devs);  
  54. exit:  
  55.     return 0;  
  56. }  
  57.   
  58. static void skel_exit(void)  
  59. {  
  60.     dev_t dev = 0;  
  61.   
  62.     pr_info("%s\n", __FUNCTION__);  
  63.   
  64.     /* デバイスクラスを破棄する */  
  65.     class_unregister(skel_drv_class);  
  66.     class_destroy(skel_drv_class);  
  67.   
  68.     /* デバイス番号の登録を解除する */  
  69.     dev = MKDEV(drv_major, drv_minor);  
  70.     unregister_chrdev_region(dev, drv_nr_devs);  
  71. }  
  72.   
  73. module_init(skel_init);  
  74. module_exit(skel_exit);  

実行確認

$ ls -l /sys/class/ | grep skel
$
$ sudo insmod skel_drv.ko
$ cat /proc/devices | grep skel
246 skel_drv
$ ls -l /sys/class/ | grep skel
drwxr-xr-x 2 root root 0  2月 13 16:22 skel_drv
$ sudo rmmod skel_drv
$ dmesg | tail
 :
[247855.314089] skel_init
[247855.314102] SKEL_DRV: char driver major number is 246
[247930.698627] skel_exit
$ ls -l /sys/class/ | grep skel
$

ソースコード ダウンロード

 

Linuxデバイスドライバ開発

 

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS