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)