Linux驅動開發(8)——靜態和動態申請字元裝置
阿新 • • 發佈:2018-11-02
先貼一段demo
#include <linux/init.h> /*包含初始化巨集定義的標頭檔案,程式碼中的module_init和module_exit在此檔案中*/ #include <linux/module.h> /*包含初始化載入模組的標頭檔案,程式碼中的MODULE_LICENSE在此標頭檔案中*/ /*定義module_param module_param_array的標頭檔案*/ #include <linux/moduleparam.h> /*定義module_param module_param_array中perm的標頭檔案*/ #include <linux/stat.h> /*三個字元裝置函式*/ #include <linux/fs.h> /*MKDEV轉換裝置號資料型別的巨集定義*/ #include <linux/kdev_t.h> /*定義字元裝置的結構體*/ #include <linux/cdev.h> static int scdev_init(void) { int ret = 0; dev_t num_dev; printk(KERN_EMERG "numdev_major is %d!\n",numdev_major); printk(KERN_EMERG "numdev_minor is %d!\n",numdev_minor); if(numdev_major){ num_dev = MKDEV(numdev_major,numdev_minor); ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME); } else{ printk(KERN_EMERG "numdev_major %d is failed!\n",numdev_major); } if(ret<0){ printk(KERN_EMERG "register_chrdev_region req %d is failed!\n",numdev_major); } printk(KERN_EMERG "scdev_init!\n"); /*列印資訊,KERN_EMERG表示緊急資訊*/ return 0; }
字元裝置函式在檔案“include/linux/fs.h”中,核心提供了三個函式來註冊一組字元裝置編號。
-
register_chrdev_region()是提前知道裝置的主次裝置號,再去申請裝置
號,也是demo中使用的函式 -
extern int register_chrdev_region(dev_t , unsigned, const char *);
- 引數1:dev_t型別,通過MKDEV得到的裝置號
- 引數2:裝置數量
- 引數3:裝置名稱 -
alloc_chrdev_region() 是動態分配主次裝置號
- int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
- 引數1:dev_t *通過MKDEV得到的裝置號,注意是指標型別,&num_dev取得
- 引數2:次裝置號
- 引數3:裝置數量
- 引數4:裝置名稱 -
register_chrdev()。是老版本的裝置號註冊方式,只分配主裝置號。從
裝置號在mknod的時候指定
巨集定義MKDEV在標頭檔案“include/linux/kdev_t.h中。在kdev_t.h標頭檔案中有一系列裝置號處理的巨集命令,用於處理各種裝置號
相關的資料。
include/linux/cdev.h是定義字元裝置的結構體。cdev型別是是字元裝置描述的結構
另外說明:使用命令“cat /proc/devices”檢視已經被註冊的主裝置