《Linux驱动》动态申请字符设备号
2016-05-13 01:44
519 查看
#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 "ascdev" MODULE_LICENSE("Dual BSD/GPL"); /*声明是开源的,没有内核版本限制*/ MODULE_AUTHOR("HerGhost"); /*声明作者*/ int numdev_major; static int scdev_init(void) { int ret = 0; dev_t num_dev; /*动态注册设备号*/ /* 申请设备号: register_chrdev_region(dev_t first,unsigned int count,char *name) First :要分配的设备编号范围的初始值(次设备号常设为0); Count:连续编号范围. Name:编号相关联的设备名称. (/proc/devices); 动态分配: Int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name); Firstminor : 通常为0; *dev:存放返回的设备号; count:连续编号范围. 这个意思说假如major是248,count是2的话,249也就是相当于被使用的了. 成功返回0,失败返回-1;*/ ret = alloc_chrdev_region(&num_dev,0,2,DEVICE_NAME); /*获得主设备号*/ numdev_major = MAJOR(num_dev); printk(KERN_EMERG "adev_region req %d !\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,0),2); } module_init(scdev_init); /*初始化函数*/ module_exit(scdev_exit); /*卸载函数*/
相关文章推荐
- OMAP3630 Linux I2C总线驱动分析
- Linux设备驱动开发环境的搭建
- 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用
- 简单讲解C语言中宏的定义与使用
- C/C++ 宏详细解析
- 深入探讨:宏、内联函数与普通函数的区别
- C++十六进制宏的用法详解
- C++基础入门教程(二):数据、变量、宏等
- 枚举和宏的区别详细解析
- 详解C语言中的#define宏定义命令用法
- 浅析c++ 宏 #val 在unicode下的使用
- 如何在C语言的宏中使用类型关键字
- c/c++ 宏定义中的#/##
- 树形结构
- 设备控制接口(ioctl 函数) 主要是在驱动中
- 巧用可变参数宏、编译器内置宏和printf输出调试信息
- Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver 驱动问题处理办法
- NAPI
- 用宏获取函数名