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)