这两周主要学习了字符设备驱动、杂项设备驱动以及驱动程序设计的核心理论与技巧。完成了一个蜂鸣器的字符设备驱动和一个LED杂项设备驱动。做一下总结。
字符设备驱动:字符设备驱动是基本的串行输入输出驱动,将一些按字节、字进行读取、写入的设备做成驱动模块。Insmod装载驱动模块到内核,则用户空间与内核空间的交互就可以达成控制设备的目的。为了方便驱动的设计与调试,将驱动做成模块obj-m。
字符设备设计模式:内核提供了一套字符设备的接口,利用这些接口完成字符设备的注册和注销。
注册:
1、获取设备号:字符设备的设备后数据类型为dev_t,用函数MKDEV(MAJOR,MINOR)获得设备号。但还要向内核申请到这一个设备号(想要的设备号与实际可以得到 的设备号的区别)。因此还要通过静态获取设备号或者动态获取设备号(区别是,主设备号是否为0)。静态申请获取设备号的前提是已知设备号的情况。动态申请获 取设备号则是未知的,但可以避免设备号冲突。在使用动态申请获取设备号时,函数调用成功会将设备号放入到参数dev_t dev中这时应该用MAJOR(dev)获得主设 备号并在成功注册字符设备后将信息打印出来,利于创建设备结点。
int register_chrdev_region(dev_tfrom,unsigned count,const char *name);
intalloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count,const char*name);
如果函数调用发生错误,返回小于0的值。
2、初始化化字符设备:字符设备结构体(struct cdev)的初始化包括file_operations、owner。file_oerations包含有字符设备的控制方法。owner为驱动模块的拥有 者,为权限设置,一般设置为THIS_MODULE。
voidcdev_init(struct cdev *cdevp,struct file_operations *ops);
cdevp->owner= THIS_MODULE;
cdevp->fops= ops;
3、添加字符设备:将初始化的字符设备添加到字符设备队列。完成这一步,字符设备的注册就全部做完了。参数unsigned count表明添加到设备队列的字符设备个 数。
voidcdev_add(struct cdev *cdevp,dev_t devn,unsigned count);
注销:
1、 从字符设备队列删除字符设备:将字符设备结构体从设备队列删除。
voidcdev_del(struct cdev *cdevp);
2、注销字符设备号:释放掉设备号(设备号属于有限资源,主设备号为212个,次设备号为220个)。参数unsigned count为要注销的设备号个数。
voidunregister_chrdev_region(dev_t from,unsigned count);
字符设备基本的注册、注销过程就是这个模式。如果加入了私有数据filp->private_data、信号量或者其他的驱动程序设计的核心理论,则是在这个基础上进行添加。这