博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式学习笔记(十四)-静态与动态申请字符类设备号
阅读量:3741 次
发布时间:2019-05-22

本文共 3197 字,大约阅读时间需要 10 分钟。

静态申请字符类设备号

介绍
  • 字符设备函数在文件 include/linux/fs.h 中
  • 内核提供了三个函数来注册一组字符设备编号,这个三个函数分别是
    • register_chrdev_region() 是提前知道设备的主次设备号,再去申请设备号
    • alloc_chrdev_region() 那是动态分配主次设备号
    • register_chrdev()  是老版本的设备号注册方式,只分配主设备号,从设备号在mknod 的时候指定
申请
  • 宏定义 MKDEV 的头文件 include/linux/kdev_t.h
    • 在kdev_t.h 的头文件中只有一系列设备号处理的宏命令,用于处理各种设备号相关的数据
  • include/linux/cdev.h
    • cdev 类型是字符设备描述的结构
    • 其中设备号必须用dev_t 类型来描述,高12 位为主设备号,低20位为次设备号

源码

#include 
#include
// 定义module_param module_param_arrary 函数的头文件#include
// 定义参数函数中perm 参数的枚举量头文件#include
// MKDEV 转换设备号数据类型的宏定义#include
// 三个字符设备号函数#include
// 定义字符设备的结构体#include
#defind DEVICE_NAME "scdev";#defind DEVICE_MINOR_NUM 2;#defind DEVICE_MAJOR 0;// 主设备号#defind DEVICE_MINOR 0;module_init(sdev_init);module_exit(sdev_exit);static int module_arg1,module_arg2;static int int_array[50];static int int_num;int numdev_major = DEVICE_MAJOR;int numdev_minor = DEVICE_MINOR;/**/// 输入主设备号module_param(numdev_major,int,S_IRUSR);// 输入次设备号module_param(numdev_minor,int,S_IRUSR);static int sdev_init(void){ int ret = -1; dev_t num_dev; 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,"\t numdev_major %d is failed\n ",numdev_major); } if(!ret){ printk(KERN_EMERG,"\t register_chrdev_region req %d is failed\n ",numdev_major); } printk(KERN_EMERG,"\ cdev enter!\n "); return 0;}static int sdev_exit(void){ printk(KERN_EMERG,"\t cdev is:%d\n ",module_arg2); unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM); return 0;}
# 使用命令 cat/proc/devices 查看已经被注册的设备号,设备号9 没有被注册cat /proc/devcies # 带参数加载模块insmod /mnt/udisk/request_dev_num.ko numdev_major=9 numdev_minor=0# 查看设备号9cat /proc/devcies 写在模块

动态申请字符类设备号(源码)

  • alloc_chrdev_region() 是动态分配的主次设备号
  • 宏定义 MAJOR 提取dev_t数据中的主设备号
#include 
#include
// 定义module_param module_param_arrary 函数的头文件#include
// 定义参数函数中perm 参数的枚举量头文件#include
// MKDEV 转换设备号数据类型的宏定义#include
// 三个字符设备号函数#include
// 定义字符设备的结构体#include
#defind DEVICE_NAME "dcdev";#defind DEVICE_MINOR_NUM 2;#defind DEVICE_MAJOR 0;// 主设备号#defind DEVICE_MINOR 0;module_init(sdev_init);module_exit(sdev_exit);static int module_arg1,module_arg2;static int int_array[50];static int int_num;int numdev_major = DEVICE_MAJOR;int numdev_minor = DEVICE_MINOR;/**/// 输入主设备号module_param(numdev_major,int,S_IRUSR);// 输入次设备号module_param(numdev_minor,int,S_IRUSR);static int sdev_init(void){ int ret = -1; dev_t num_dev; if(numdev_major){ // 如果0 则动态申请 num_dev = MKDEV(numdev_major,numdev_minor); ret = register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME); }else{ ret = allo_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME); numdev_major = MAJOR(num_dev); printk(KERN_EMERG,"\t numdev_major %d is failed\n ",numdev_major); } if(!ret){ printk(KERN_EMERG,"\t register_chrdev_region req %d is failed\n ",numdev_major); } printk(KERN_EMERG,"\ dcdev enter!\n "); return 0;}static int sdev_exit(void){ printk(KERN_EMERG,"\t cdev is:%d\n ",module_arg2); unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM); return 0;}

转载地址:http://shoin.baihongyu.com/

你可能感兴趣的文章
Matplotlib绘图工具
查看>>
机器学习之Knn算法
查看>>
Mockito单元测试简述
查看>>
GUAVA的常用方法汇总
查看>>
装饰器和门面设计模式介绍
查看>>
Jackson多层泛型深度嵌套导致的反序列化问题
查看>>
创建型模式——克隆模式
查看>>
JVM关闭和Hook钩子
查看>>
线程中断处理
查看>>
消息队列积压问题处理
查看>>
并行流使用注意事项
查看>>
泛型擦除机制及相关问题
查看>>
Jackson日期反序列化时区问题
查看>>
《设计模式》
查看>>
单例设计模式
查看>>
面试题集锦(一)
查看>>
Calendar类方法——编写万年历的两种方式
查看>>
File类的使用——遍历所有文件及子文件以及遍历删除
查看>>
内存流的使用——基本使用
查看>>
RandomAccessFile 类的使用——基本使用
查看>>