***********《朱有鹏老师嵌入式linux核心课程》 *********** 《5.linux驱动开发-第6部分-5.6.misc类设备与蜂鸣器驱动》 -------------------------------------------------------- 本课程由朱老师物联网大讲堂推出并提供技术支持,课件可打包下载 网盘地址:http://yunpan.cn/cjVy3RAgfDufK 访问密码 4ad7 技术交流QQ群:朱老师物联网讲堂1群 397164505 -------------------------------------------------------- 第一部分、章节目录 5.6.1.板载蜂鸣器驱动测试 5.6.2.misc类设备介绍 5.6.3.misc驱动框架源码分析1 5.6.4.misc驱动框架源码分析2 5.6.5.蜂鸣器驱动源码分析1 5.6.6.蜂鸣器驱动源码分析2 第二部分、章节介绍 5.6.1.板载蜂鸣器驱动测试 本节使用内核中提供的蜂鸣器驱动来实践测试蜂鸣器,要同时解决驱动层的问题和应用程序的编写。 5.6.2.misc类设备介绍 本节系统介绍misc类设备的概念和分类特点,并且对misc类设备的驱动框架详细讲解。 5.6.3.misc驱动框架源码分析1 本节分析misc类设备驱动框架中内核自己实现的部分,即misc.c。 5.6.4.misc驱动框架源码分析2 本节继续分析misc.c,重点是信号量及其使用的一般技巧。 5.6.5.蜂鸣器驱动源码分析1 本节分析九鼎提供的buzzer驱动源码 5.6.6.蜂鸣器驱动源码分析2 本节分析九鼎提供的buzzer驱动源码 第三部分、随堂记录 5.6.1.板载蜂鸣器驱动测试 5.6.1.1、驱动部分 (1)九鼎移植内核已经提供了蜂鸣器驱动源码 (2)make menuconfig (3)bug排查。修改Makefile中的宏名,最终可以在系统中看到 /dev/buzzer 5.6.1.2、应用部分 (1)应用编写:打开文件+ioctl (2)测试实践 5.6.2.misc类设备介绍 5.6.2.1、何为misc (1)中文名:杂项设备\杂散设备 (2)/sys/class/misc (3)典型的字符设备 (4)有一套驱动框架,内核实现一部分(misc.c),驱动实现一部分(x210-buzzer.c)。 (5)misc是对原始的字符设备注册接口的一个类层次的封装,很多典型字符设备都可以归类到misc类中,使用misc驱动框架来管理。 5.6.2.2、misc类设备驱动架构 (1)内核开发者实现部分,关键点有2个:一个是类的创建,另一个是开放给驱动开发者的接口 (2)具体设备驱动工程师实现部分 5.6.2.3、本部分学习方法 (1)蜂鸣器驱动源码已有,分析为主 (2)复习并验证前面讲的驱动框架的思维 (3)有余力的不妨开始注意一些细节 5.6.3.misc驱动框架源码分析1 5.6.3.1、misc源码框架基础 (1)misc源码框架本身也是一个模块,内核启动时自动加载 (2)源码框架的主要工作:注册misc类,使用老接口注册字符设备驱动(主设备号10),开放device注册的接口misc_register给驱动工程师 5.6.3.2、misc类设备的注册 (1)驱动工程师需要借助misc来加载自己的驱动时,只需要调用misc_register接口注册自己的设备即可,其余均不用管。 (2)misc_list链表的作用。内核定义了一个misc_list链表用来记录所有内核中注册了的杂散类设备。当我们向内核注册一个misc类设备时,内核就会向misc_list链表中insert一个节点。 #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) 原式子:static LIST_HEAD(misc_list); 展开后:static struct list_head misc_list = { &(misc_list), &(misc_list) } (3)主设备号和次设备号的作用和区分 5.6.4.misc驱动框架源码分析2 5.6.4.1、open函数分析 5.6.4.2、misc在proc下的展现 5.6.4.3、内核互斥锁 (1)何为互斥锁 (2)定义:DEFINE_MUTEX (3)上锁mutex_lock和解锁mutex_unlock (4)内核防止竞争状态的手段:原子访问、自旋锁、互斥锁、信号量 (5)原子访问主要用来做计数、自旋锁后面讲中断会详细讲、互斥锁和信号量很相似(其实就是计数值为1的信号量),互斥锁的出现比信号量晚,实现上比信号量优秀,尽量使用互斥锁。 5.6.5.蜂鸣器驱动源码分析1 5.6.5.1、dev_init (1)信号量 (2)miscdevice (3)gpio_request (4)printk 5.6.5.2、ioctl (1)为什么需要ioctl(input output control,输入输出控制)。 (2)ioctl怎么用 5.6.6.蜂鸣器驱动源码分析2 硬件操作有关的代码