1.什么叫做Linux2.6设备的注册
linux2.6设备注册 他是一个最规范的设备注册的手段;
特点:
主设备号和次设备号都不限制;
主设备号范围:0-4096; 次设备号范围:0-1,048,576
2.linux2.6设备注册及注销的流程
注册流程:
1)申请设备号;
2)初始化linux2.6的核心结构体;
3)向内核注册一个linux2.6的核心结构体;
4)创建一个类的结构体;
5)创建设备文件;
注销的流程
1)销毁设备文件;
2)销毁类结构体;
3)向内核取消注册一个linux2.6的核心结构体;
4)取消设备号;
3.linux2.6设备注册相关函数
1) 函数功能:向内核申请一个可以使用的设备号
头文件:#include <linux/fs.h>
函数原型:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name)
参数:
dev_t *dev:设备号存储的位置 包含了主设备和次设备
unsigned baseminor:次设备号的起始位置
unsigned count:要申请的设备号的个数
const char *name:设备号的名字 ,会出现在/proc/devices文件里
返回值:
成功返回0; 失败返回 负数
2) 函数功能:释放设备号
头文件:#include <linux/fs.h>
函数原型:void unregister_chrdev_region(dev_t from, unsigned count)
参数:
from:释放的设备号的起始的位置
count:要释放的设备号的个数
3) 函数功能:初始化一个linux2.6的核心构体
头文件:#include <linux/cdev.h>
函数原型:void cdev_init(struct cdev *cdev, const struct file_operations *fops)
参数:
struct cdev *cdev:linux2.6设备注册的核心结构体
const struct file_operations *fops:这个就是我们操作集合的结构体
返回值:无
4) 函数功能:向内核注册一个linux2.6的核心结构体
头文件:#include <linux/cdev.h>
函数原型:int cdev_add(struct cdev *p, dev_t dev, unsigned count)
参数:
struct cdev *p:linux2.6的核心结构体
dev_t dev:申请的设备号;
unsigned count:注册的设备的个数, 一般填写1
返回值:
成功返回 0; 失败返回 负数
5) 函数功能:从内核取消注册一个linux2.6的核心结构体
头文件:#include <linux/cdev.h>
函数原型:void cdev_del(struct cdev *p)
参数:struct cdev *p:linux2.6的核心结构体
返回值:无
6) 函数功能:创建一个类的核心结构体
头文件:#include <linux/device.h>
函数原型:struct class * class_create(struct module *owner, const char *name)
参数:
struct module *owner:固定填写THIS_MODULE
const char *name:类的名字
返回值:
成功返回 我们创建的类的结构体的指针
失败返回 NULL
7) 函数功能:自动的生成一个设备文件
头文件:#include <linux/device.h>
函数原型:struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
参数:
struct class *class:创建的类
struct device *parent:父节点设备,填NULL
dev_t devt:设备号
void *drvdata:传给我们设备的私有数据 ,填写NULL
const char *fmt, ...:你要创建的设备文件的名字
返回值:
成功返回 设备文件的核心结构体 ,主要用于摧毁该设备
8) 函数功能:摧毁创建的设备文件
头文件:#include <linux/device.h>
函数原型:void device_destroy(struct class *class, dev_t devt)
参数:
struct class *class:创建的类结构体
dev_t devt :设备号
返回值:无
9) 函数功能:摧毁一个类结构体
头文件:#include <linux/device.h>
函数原型:void class_destroy(struct class *cls)
参数:struct class *cls:类的核心结构体
返回值:无
4.linux2.6的设备注册,不会自动生成设备文件,要想使用自己写的驱动,要生成一个设备文件
生成方式:
1)手动生成:mknod /dev/myled c 主设备号 次设备号
2)自动生成:依赖类的核心结构体,首先创建一个类的核心结构体,然后再自动生成一个设备文件;
//1.向内核申请一个可以使用的设备号
ret= alloc_chrdev_region(&mydev, 0, 1,"beep");
if(ret < 0)
{
printk("设备号申请失败\n");
return -1;
}
printk("dev:%d\n",mydev);
printk("主设备号:%d\n",MAJOR(mydev));
printk("次设备号:%d\n",MINOR(mydev));
//2.初始化linux2.6的核心结构体
myfops.owner=THIS_MODULE;
myfops.open=myopen;
myfops.release=myclose;
cdev_init(&mycdev,&myfops);
//3.向内核注册一个Linux2.6的核心结构体
cdev_add(&mycdev, mydev, 1);//4.创建一个类的核心结构体
myclass = class_create(THIS_MODULE,"bee");
if(myclass == NULL)
{
printk("类的核心结构体创建失败\n");
return -1;
}//5.创建设备文件
mydevice = device_create(myclass, NULL,mydev,NULL,"beep");
if(mydevice = NULL)
{
printk("创建设备文件失败\n");
return -1;
}
//1.销毁设备
device_destroy(myclass, mydev);
//2.销毁类结构体
class_destroy(myclass);
//3.从内核取消注册一个linux2.6的核心结构体
cdev_del(&mycdev);
//4.释放设备号
unregister_chrdev_region(mydev,1);