linux内核混杂设备:
官方定义:非标准的字符设备属于混杂设备。
代码定义:主设备号内核已经定义的一类字符设备。主设备号为10.通过次设备号来分区各个混杂设备。内核通过链表来管理混杂设备。核心代码在driver/char/misc.c
混杂设备对应的数据结构:
struct miscdevice {
intminor; //次设备号,如果指定MISC_DYNAMIC_MINOR,表明让内核帮你分配一个次设备号
constchar *name; //设备文件名,内核会帮你自动创建
conststruct file_operations *fops;//给用户提供操作访问硬件的接口
};
如何实现一个混杂设备驱动呢:
1.分配初始化structmiscdevice
struct miscdevice led_misc = {
.minor = MISC_DYNAMIC_MINOR,//让内核帮你分配
.name= "myled", //内核会自动创建设备节点/dev/myled
.fops= &led_fops //给用户提供的访问操作接口
};
2.调用misc_register(&led_misc);//向内核注册混杂设备
3.卸载混杂设备misc_deregister(&led_misc);
案例:利用混杂设备驱动的模型来实现ADC驱动
模拟信号转成数字信号需要AD转换器(ADC)
数字信号转成模拟信号需要DA转换器(DAC)
衡量ADC,DAC的硬件指标:
1.分辨率(转换率):比如分辨率为10,表示ADC将模拟信号转换成数字信号以后,用10个bit位来表示这个数字量。如果分辨率为12,表示ADC将模拟信号转成数字信号以后,用12bit位来表示这个数字量。它也同时表示了转换以后的最小的量度:
最小量度 = 5V/(1 << 10) = A
最小量度 = 5V/(1 << 12) = B
B比A更加精确,但是转换时间要长!
如果分辨率为10位,对于电压模拟信号的最大值5V
模拟量 数字量
5V 1111111111
X 0110111011
X = (0110111011) * (5.0/(1 << 10))
如果CPU不自带ADC,或者不想使用CPU自带的ADC,这时考虑外接的ADC芯片来转换。如果使用外接的ADC芯片,一定要考虑好外接芯片跟CPU之间的通信接口,到底采用GPIO,I2C,uart,还是SPI总线接口。
S5PV210自带ADC的硬件相关参数:
1.分辨率:10bit和12bit
2.ADC的时钟源是PCLK=66MHz,ADC工作频率最大5MHz
需要降频!
3.ADC模拟信号输入通道有10路,但是ADC转换器只有1个,所以在同一时刻,只能处理1路,对应的GPIO为AIN0~AIN9,这10个GPIO只能做输入口,不能复用!AIN0,AIN1这两路仅仅做为普通的模拟输入源。AIN2~AIN9这八路即可作为普通的模拟输入源,也可以外接电阻屏。
4.ADC只能转换电压模拟信号,模拟电压信号的范围0~3.3V
5.ADC转换模拟信号以后,会给CPU发送一个中断信号,告诉CPU,转换结束。还可以轮询查看某个寄存器的相应为来判断是否转换结束!
6.跟普通ADC转换相关的寄存器:
所有寄存器的及地址:0xE1700000
配置寄存器
延时寄存器
数据寄存器
中断清除寄存器
模拟输入通道选择寄存器