简单的字符驱动初始化

1. 申请设备号 :
驱动 , 首先必须得有设备号 . 设备号由主设备号和从设备号组成
dev_t devno;      //32位的整数 dev_t   (<linux/types.h>)     这是一个unsigned int  是一个32位的无符号整型
devno = MKDEV(major, minor); // MKDEV(major,minor);它做的事:major<<20 | minor
31~20    主设备号,用于识别不同类型的设备
19~0      次设备号,用于识别相同类型的不同设备

设备号的申请函数 :
 静态申请
register_chrdev_region(dev_t first, unsigned int count, char *name)
动态分配
    作为一个新的驱动程序,应该使用动态分配机制获取主设备号
    alloc_chrdev_region(dev_t *devno, unsigned int first, unsigned int count, char *name
不管用何种方法分配, 不用时都要释放掉
      void unregister_chrdev_region(dev_t first, unsigned int count);



2.注册字符驱动 :
当你有了设备号之后 , 就需要往内核中添加我们的字符驱动了
struct cdev 
.....
void  cdev_init (struct cdev *, const struct file_operations *);  
struct cdev *cdev_alloc(void);  
int  cdev_add (struct cdev *, dev_t, unsigned);  
void  cdev_del( struct cdev *);  

cdev_init初始化cdev结构体并与struct file_operations device建立接连.相关代码如下.  
void cdev_init(struct cdev *cdev, const struct file_operations *fops)  



cdev_add cdev_del 分别是向内核添加和删除 cdev,cdev_add 一般放在模块加载函数内 , 当然 cdev_del  一般也放在模块卸载函数内



3.创建设备文件 :
Linux  中有这样一句话 , 一切皆文件 . 那么驱动也理应是文件的形式存在了 . /dev/ 目录下就是列出了当前系统存在的设备文件了 . 有人要问了 ,insmod 加载之后不会自动产生吗 ? 答案是的 , 除非我们添加创建设备文件的代码 , 所以这里就引出了如何创建设备文件 .     
3.1 mknod手工创建
      mknod  用法:
     mknod  filename type  major  minor
 
       filename :  设备文件名
         type        :  设备文件类型
         major      :   主设备号
          minor      :   次设备号
    
3.2 自动创建
设备文件的创建分 2 个部分 . 第一部分就创建设备类 . 然后在设备类的基础上创建设备文件 .
structure class * class_create(struct module *owner, const char *name);
该函数是创建设备类, 设备类可以在 /sys/class 看到
extern struct device *device_create(struct class *cls, struct device *parent,dev_t devt, void *drvdata,const char *fmt, ...);

 
3.3 模块退出时要销毁设备文件
device_destroy(_cls,_device)  
class_destroy(struct class * cls)  






猜你喜欢

转载自blog.csdn.net/szy_sin/article/details/78691364