ARM Linux S3C2440之ADC驱动实现

发布者:TranquilDreams最新更新时间:2024-06-11 来源: elecfans关键字:ARM  Linux  S3C2440  ADC驱动 手机看文章 扫描二维码
随时随地手机看文章

硬件描述:

S3c2440有一个10-bit的CMOS ADC 模数转换器,支持8个模拟通道输入,10位的分辨率,最高速度可达500KSPS(500 千次/每秒)。

 

 

从图中可知:模拟ADC,包含了2部分功能,一部分是触屏功能,另一部分就是普通ADC功能,分别可以产生INT_TC和INT_ADC 两个中断。8个AIN模拟输入(A[3:0],YM,YP,XM,XP)通过一个8路模拟开关MUX进行通道片选。 ADC模块共有20个寄存器。对于普通ADC转换,使用ADCCON 和 ADCDAT0即可完成控制。ADCCON用于控制设置,ADCDAT0保存了转换结果。


驱动程序ADC_DEV.ko:

  1. #include    

  2. #include    

  3. #include    

  4. #include    

  5. #include    

  6. #include        

  7. #include       

  8. #include    

  9. #include    

  10. #include    

  11. #include    

  12. #include    

  13. #include    

  14.   

  15. #define DEVICE_NAME 'ADC_DEV'   

  16.   

  17. struct ADC_DEV {  

  18.     wait_queue_head_t wait;  

  19.     int ch;  

  20.     int pres;  

  21.     int data;  

  22.     int flag;  

  23. };  

  24.   

  25. static struct ADC_DEV adc_dev;  

  26.   

  27. static void __iomem *ADC_REG_BASE;  

  28. static struct clk *adc_clk;  

  29.   

  30. #define ADCCON                  (*(volatile unsigned long *)(ADC_REG_BASE + S3C2410_ADCCON))   

  31. #define ADCDAT0                 (*(volatile unsigned long *)(ADC_REG_BASE + S3C2410_ADCDAT0))    

  32. #define START_ADC(ch,pres)    ADCCON = (0x01 | 0x01<<14 | ch<<3 | pres<<6)   

  33.   

  34.       

  35. static ssize_t adc_read(struct file *fp,  char __user *buf,  size_t count,  loff_t *ppos)  

  36. {  

  37.     START_ADC(adc_dev.ch, adc_dev.pres);              //启动ADC转换   

  38.     wait_event_interruptible(adc_dev.wait,adc_dev.flag);   //等待ADC转换完成   

  39.     adc_dev.flag = 0;  

  40.       

  41.     copy_to_user(buf,(char*)&adc_dev.data,sizeof(adc_dev.data));  

  42.   

  43.     return (sizeof(adc_dev.data));  

  44. }  

  45. static int adc_open(struct inode *in, struct file *fp)  

  46. {  

  47.     adc_dev.ch = 0x02;        //输入通道2   

  48.     adc_dev.pres = 0xff;       //prescale : 0 ~255 可选   

  49.     adc_dev.data = 0;  

  50.     adc_dev.flag = 0;  

  51.     init_waitqueue_head(&(adc_dev.wait));      

  52.       

  53.     return 0;  

  54. }  

  55. static irqreturn_t adc_done_handler(int irq, void *dev_id)  

  56. {  

  57.     adc_dev.data = ADCDAT0 & 0x3ff;  

  58.     adc_dev.flag = 1;  

  59.     wake_up_interruptible(&adc_dev.wait);      //唤醒等待事件   

  60.   

  61.     return IRQ_HANDLED;  

  62. }  

  63.   

  64. static struct file_operations dev_fops = {  

  65.     .owner = THIS_MODULE,  

  66.     .open  = adc_open,  

  67.     .read  = adc_read,  

  68. };  

  69.   

  70. static struct miscdevice misc = {  

  71.     .minor = MISC_DYNAMIC_MINOR,  

  72.     .name  = DEVICE_NAME,  

  73.     .fops  = &dev_fops,  

  74. };  

  75.   

  76. static int __init dev_init(void)  

  77. {  

  78.     int ret;  

  79.   

  80.     ADC_REG_BASE = ioremap(S3C2410_PA_ADC,0x14);    //物理地址映射   

  81.     adc_clk = clk_get(NULL,'adc');  

  82.     if (!adc_clk) {  

  83.         return -ENOENT;  

  84.     }  

  85.     clk_enable(adc_clk);            //开启adc 时钟,系统开机时默认是关闭的   

  86.       

  87.     ret = request_irq(IRQ_ADC,adc_done_handler,IRQF_SHARED,DEVICE_NAME,&adc_dev);   //分配中断线   

  88.     if (ret) {  

  89.        iounmap(ADC_REG_BASE);  

  90.        return ret;  

  91.     }  

  92.       

  93.     ret = misc_register(&misc);      //注册设备   

  94.   

  95.     return ret;  

  96. }  

  97.   

  98.   

  99. static void __exit dev_exit(void)  

  100. {  

  101.     misc_deregister(&misc);  

  102. }  

  103.   

  104. module_init(dev_init);  

  105. module_exit(dev_exit);  

  106.   

  107. MODULE_LICENSE('GPL');  

  108. MODULE_AUTHOR('itspy');  

  109. MODULE_DESCRIPTION('adc driver test');  


应用程序adc_test:


  1. #include    

  2. #include    

  3. #include    

  4. #include    

  5. #include            

  6.   

  7. int main(void)  

  8. {  

  9.     int fd;  

  10.     char buf[4];  

  11.     int i,res,adc_data;  

  12.   

  13.     if ((fd = open('/dev/ADC_DEV',O_RDONLY)) < 0) {  

  14.             printf('open adc_dev failedn');  

  15.         return 1;  

  16.     }  

  17.    printf('adc_test result:n');  

  18.     for (i= 0; i< 5; i++) {  

  19.         if ((res =read(fd, buf, 4)) != 4) {  

  20.             printf('read adc_dev failed n');  

  21.             return 1;  

  22.         }   

  23.         else {  

  24.             adc_data = buf[0] + (int)(buf[1]<<8);  

  25.             printf('adc value = %d (%.2f V) n',adc_data, adc_data/1024.0*3.3);  

  26.         }  

  27.     }  

  28.     close(fd);  

  29.   

  30.     return 0;  

  31. }  

测试结果:

[root@www.linuxidc.com /]# ./adc_test 
adc_test result:
adc value = 740 (2.38 V) 
adc value = 744 (2.40 V) 
adc value = 744 (2.40 V) 
adc value = 744 (2.40 V)


关键字:ARM  Linux  S3C2440  ADC驱动 引用地址:ARM Linux S3C2440之ADC驱动实现

上一篇:ARM Linux S3C2440 之时钟分析
下一篇:S3C2440之NAND FLASH移植到S3C2410的驱动分析

推荐阅读最新更新时间:2024-11-13 17:21

解析基于ARMLinux 通用工控硬件平台的设计
简介:本文针对嵌入式系统的特点,以高性价比的32位arm嵌入式处理器AT91RM9200为硬件核心,搭建了通用工控硬件平台,在此平台上移植嵌入式Linux操作系统和图形界面开发环境MiniGUI。以此通用工控平台为基础,可以方便地构建工程应用所需的绝大部分自动测控系统。其应用无论是在性能还是在成本方面都极具竞争力,这预示着本平台具有较好的应用前景。 随着工控技术的进步和市场竞争的加剧,开发人员通常需要在尽可能短的时间内设计出满足用户要求的测控系统。本文针对嵌入式系统的特点,以高性价比的32位arm嵌入式处理器AT91RM9200为硬件核心,搭建了通用工控硬件平台,在此平台上移植嵌入式Linux操作系统和图形界面开发环境Mini
[单片机]
解析基于<font color='red'>ARM</font> 和<font color='red'>Linux</font> 通用工控硬件平台的设计
C语言和ARM汇编混合编程实现阶乘运算
1.阶乘运算必须用汇编语言实现; 2. 通过C语言调用阶乘运算结果并显示出来。 (1) 用汇编语言编写阶乘运算子程序,命名为zmc.s; 程序如下: AREA asmfile,CODE,READONLY EXPORT asmDouble asmDouble sub R1,R0,#1 cmp R1,#00 BEQ L2 L1 mul R2,R0,R1 sub R1,R1,#1 mov R0,R2 cmp R1,#00 BNE L1 L2 mov pc, lr END (2) 将其添加到半主机程序中的SYS中; (3) 将半主机程序的main修改如下: #inclu
[单片机]
OK6410A 开发板 (八) 89 linux-5.11 OK6410A 文件系统访问加速及一致性策略
在磁盘文件系统是怎么 用以内存为cache加速访问 并 处理内存与实际硬盘文件系统的差异 在文件系统这一块实现了 高速缓存 中的 文件系统相关部分 1. dentry 高速缓存 dentry cache 2. inode 高速缓存 inode cache 3. super_block 高速缓存 4. 页高速缓存 page cache 5. 缓冲区高速缓存 buffer cache 6. 块高速缓存 block cache superblock结构体/inode 缓存/dcache缓存/buffer cache/block cache / page cache/swap 总体描述 在关
[单片机]
OK6410A 开发板 (八) 89 <font color='red'>linux</font>-5.11 OK6410A 文件系统访问加速及一致性策略
ARM寄存器中R0~R15寄存器的别名
ARM中的寄存器的别名 默认的情况下,这些寄存器只是叫做r0,r1,...,r14等,而APCS 对其起了不同的别名。 使用汇编器预处理器的功能,你可以定义 R0 等名字,但在你修改其他人写的代码的时候,最好还是学习使用 APCS 名字。 一般编程过程中,最好按照其约定,使用对应的名字,这样使得程序可读性更好。 关于不同寄存器所对应的名字,见下表: Table 3.2. ARM寄存器的别名 寄存器名字 Reg# APCS 意义 R0 a1 工作寄存器 R1 a2 R2 a3 R3 a4 R4 v1 必须保护 R5 v2 R6 v3 R7 v4 R8 v5 R9 v
[单片机]
英特尔新任CEO面临移动、ARM服务器芯片等挑战
    5月3日消息,据国外媒体报道,英特尔为期六个月的新任CEO搜寻工作近日宣告结束。现任首席运营官布莱恩·克兰尼克(Brian Krzanich)被董事会任命为CEO,接替即将退休的欧德宁(Paul Otellini)。他将面临包括移动、ARM服务器芯片在内的多个挑战。 克兰尼克一开始就是英特尔CEO职位的热门人选。2012年1月,他升任首席运营官一职。作为执行副总裁,他之前就已经是公司的第二把手。 这只是英特尔44年历史上的第五次CEO更迭,这一次该公司首次物色外部候选人,因而尤其引入注目。 克兰尼克将要应对的问题包括: - 寻找使得英特尔芯片进入更多移动设备的途径; - 抵御ARM对服务器芯片市场的入侵 - 控制芯片越来越小
[手机便携]
ARM公布iSIM技术,未来SIM卡有望内嵌至芯片上
  当下,智能手机的设计与发展已经到达了一个大同小异的时代,然而,有一个东西却一直没怎么变,那就是手机的SIM卡。从最早期的大卡渐渐演变为MicroSIM,再到后来苹果推出的NanoSIM卡,总的来看,SIM卡是向着越来越小的方向发展,带来的最直接的好处在于,在有限的机身设计空间内,提供更多放置功能元器件的空间。   前几年,随着eSIM(虚拟SIM卡)的出现,人们都在推测,未来实体SIM卡必将消失,然而直到今天,可以看到的是,在智能手机中,人们还是非常习惯使用NanoSIM卡。 Kigen设计平台   近日,外媒有消息称,SIM卡的进化又来到了一个全新的阶段。全球知名半导体芯片厂商AR
[手机便携]
<font color='red'>ARM</font>公布iSIM技术,未来SIM卡有望内嵌至芯片上
ARM嵌入式应用调试之自制系统调用
一、原理 要想自制系统调用,当然首相要做的就是明白系统调用的过程: 我们拿open函数来举个例子:当用户空间执行open函数时,会通过glibc函数库的作用最终去调用sys_open函数,sys_open函数最终又会调用我们具体注册的open函数!那么这里最主要的就是glibc函数库干了些什么呢?其实它的作用就是当用户空间执行open函数时,会去执行一条swi #val指令,这条指令会使cpu发生异常,并跳转到异常向量入口:vector_swi处去执行,之后的代码会根据引发异常的指令取出其中的参数,并根据这个参数调用对应的处理函数!sys_open、sys_read、sys_write这些函数是放在一个数组里面的,就是根据取出的这
[单片机]
imec 牵头组建汽车芯粒计划,Arm、宝马集团、博世等巨头首批承诺加入
10 月 21 日消息,据 imec 微电子研究中心比利时当地时间本月 10 日公告,包括 Arm、宝马集团、博世在内的多家重要企业承诺首批加入 imec 牵头组建的汽车芯粒 / 小芯片计划(Automotive Chiplet Program,简称 ACP)。 其余宣布率先加入 ACP 计划的企业还包括: 日月光(外包封测 OSAT 巨头)、Cadence 楷登电子、西门子、SiliconAuto(鸿海科技与 Stellantis 合资车用芯片设计企业)、Synopsys 新思科技、Tenstorrent、法雷奥(汽车零部件供应巨头)。 imec 表示,传统的车用芯片方案在满足 ADAS、车载娱乐系统等越来越复杂的需求上日益
[汽车电子]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved