Linux驱动学习——混杂设备

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

  配置寄存器

  延时寄存器

  数据寄存器

  中断清除寄存器

  模拟输入通道选择寄存器

 







 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值