1. 程式人生 > >設備號

設備號

play 代碼 const efi pan oid base proc 設備名

一、

<include/linux/fs.h >

int register_chrdev_region(dev_t from, unsigned count, const char *name);

函數用於已知起始設備的設備號的情況 ;要先查看cat /proc/devices去查看沒有使用的

from:要分配的設備編號範圍的初始值, 這組連續設備號的起始設備號, 相當於register_chrdev()中主設備號
Count:連續編號範圍. 是這組設備號的大小(也是次設備號的個數)
Name:編號相關聯的設備名稱. (/proc/devices); 本組設備的驅動名稱

<linux/kdev_t.h>


為獲得一個 dev_t 的主或者次編號

MAJOR(dev_t dev);
MINOR(dev_t dev);

相反, 如果你有主次編號, 需要將其轉換為一個 dev_t, 使用:
MKDEV(int major, int minor);

技術分享圖片
#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> #define DEVICE_NAME "sscdev" #define DEVICE_MINOR_NUM 2 #define
DEV_MAJOR 0 #define DEV_MINOR 0 MODULE_LICENSE("Dual BSD/GPL"); /*聲明是開源的,沒有內核版本限制*/ MODULE_AUTHOR("iTOPEET_dz"); /*聲明作者*/ int numdev_major = DEV_MAJOR; int numdev_minor = DEV_MINOR; /*輸入主設備號*/ module_param(numdev_major,int,S_IRUSR); /*輸入次設備號*/ module_param(numdev_minor,int,S_IRUSR); 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; } static void scdev_exit(void) { printk(KERN_EMERG "scdev_exit!\n"); unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM); } module_init(scdev_init); /*初始化函數*/ module_exit(scdev_exit); /*卸載函數*/
View Code

使用命令cat /proc/devices查看已經被註冊的主設備,設備號9沒有被註冊
insmod /mnt/udisk/request_cdev_num.ko numdev_major=9 numdev_minor=0
使用命令cat /proc/devices查看,設備號9被註冊為scdev
rmmod request_cdev_num numdev_major=9 numdev_minor=0

二、

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
const char *name);

void unregister_chrdev_region(dev_t from, unsigned count);

register_chrdev() 是老版本的設備號註冊方式,只分配主設備號。從
設備號在mknod的時候指定

設備號