怎么创建字符设备驱动
【1】
字符设备驱动(register_chrdev)
struct cdev {
struct module *owner; //THIS_MODULE
const struct file_operations *ops; //操作方法结构体
dev_t dev; //设备号 32 12|20 2^32=4G
unsigned int count; //设备的个数
};
1、先定义结构体
//1、定义结构体
struct cdev *cdev = cdev; //结构体的定义
cdev = cdev_alloc(); //该函数没有参数
//void kfree(void *p); //释放内存
int ret;
if(cdev == NULL){
printk("alloc memory error\n");
//在写驱动程序的时候我们一般返回的是一个内核定义的宏
ret = -ENOMEM;
goto ERR_STEP0;
}
//2、结构体的初始化
cdev_init(cdev,&fops);
//3.设备号的申请在这里我们可以用判断的方式来选择(手动分配)还是(自动分配)
if(major > 0){
ret = register_chrdev_region(MKDEV(major,minor),count,CDEVNAME);
if(ret){
printk("static:alloc device number error\n");
goto ERR_STEP1;
}else{
//自动申请
ret = alloc_chrdev_region(&devm,minor,count,CDEVNAME);
if(ret){
printk("dynaimc:alloc device number error\n");
goto ERR_STEP1; //跳转到错误步骤1,然后执行下面的程序
}
major = MAJOR(devm); //获取主设备号
minor = MINOR(devm); //获取次设备号
}
//4、注册设备号
ret = cdev_add(cdev,MKDEV(major,minor),count);
//判断返回值
if(ret){
printk("char device register error\n");
goto ERR_STEP2;
}
return 0; //不能忽略
ERR_STEP2:
unregister_chrdev_region(MKDEV(major,minor),count);
ERR_STEP1:
kfree(cdev);
ERR_STEP0:
return ret;
}
//在这里的 (入口函数) 和 (出后函数) 和 (自动创建节点函数) 我没写
//你用得话直接把程序放到你的static int __init mycdev_init(void)这是我得入口函数函数名叫mycdev_init