1.板载蜂鸣器驱动测试
1.1驱动部分
1)九鼎移植内核已经提供了蜂鸣器驱动源码
2)make menuconfig
3)bug排查。修改Makefile中的宏名,最终可以在系统中看到 /dev/buzzer
由于makefile文件与Kconfig文件中的宏定义不一致,修改makefile宏为:
然后编译,下载,结果看到:
我们看到在fileoperations结构体中的open和close源码都是空的:
那么怎样对设备文件进行操作呢?结果就是使用ioctl。
2.应用部分
1)应用编写:打开文件+ioctl
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEVNAME "/dev/buzzer"
#define PWM_IOCTL_SET_FREQ 1
#define PWM_IOCTL_STOP 0
int main(void)
{
int fd = -1;
fd = open(DEVNAME, O_RDWR);
if(fd < 0)
{
perror("open");
return -1;
}
ioctl(fd, PWM_IOCTL_SET_FREQ, 1000);
sleep(3);
ioctl(fd, PWM_IOCTL_STOP);
sleep(3);
ioctl(fd, PWM_IOCTL_SET_FREQ, 10000);
sleep(3);
ioctl(fd, PWM_IOCTL_STOP);
return 0;
}
2)测试实践
2.misc类设备介绍
2.1何为misc
1)中文名:杂项设备\杂散类设备。是一类设备,这些设备不好分类,所以放在misc类设备里面,比如蜂鸣器、闹钟、led等。
2)/sys/class/misc
3)是典型的字符设备
4)有一套驱动框架,内核实现一部分(misc.c),驱动实现一部分(x210-buzzer.c)。
5)misc是对原始的字符设备注册接口的一个类层次的封装,很多典型字符设备都可以归类到misc类中,使用misc驱动框架来管理。
2.2misc类设备驱动架构
1)内核开发者实现部分,关键点有2个:一个是类的创建,另一个是开放给驱动开发者的接口
2)具体设备驱动工程师实现部分
2.3本部分学习方法
1)蜂器驱动源码已有,分析为主
2)复习并验证前面讲的驱动框架的思维
3)有余力的不妨开始注意一些细节
3.Misc驱动框架
3.1. misc源码框架基础
1)misc源码框架本身也是一个模块,内核启动时自动加载
2)源码框架的主要工作:注册misc类,使用老接口注册字符设备驱动(主设备号10),开放device注册的接口misc_register给驱动工程师
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) }
1)主设备号和次设备号的作用和区分
使用的是位图的数据结构方法。Find_first_zero_bit在位图中找到第一个为0的位置。
3.3 open函数分析
Inod是硬盘里的设备节点,file是设备文件路径。
3.4 misc在proc下的展现
3.5 内核互斥锁
1)何为互斥锁
2)定义:DEFINE_MUTEX
3)上锁mutex_lock和解锁mutex_unlock
4)内核防止竞争状态的手段:原子访问、自旋锁、互斥锁、信号量
5)原子访问主要用来做计数、自旋锁后面讲中断会详细讲、互斥锁和信号量很相似(其实就是计数值为1的信号量),互斥锁的出现比信号量晚,实现上比信号量优秀,尽量使用互斥锁。
4.蜂鸣器驱动
4.1.dev_init
Init_MUTEX:信号量。用于保证蜂鸣器不能被两个进程进行访问。
1)信号量
2)miscdevice
/* GPD0_2 (PWMTOUT2) */
ret = gpio_request(S5PV210_GPD0(2), "GPD0");
3)gpio_request
4)printk
4.2.ioctl
1)为什么需要ioctl(input output control,输入输出控制)。
输入输出控制,read和write有缺陷的,在于驱动和硬件之间的交互。
2)ioctl怎么用
硬件操作有关的代码