Linux 驱动--ADC驱动

发布者:咖啡狐狸最新更新时间:2016-05-05 来源: eefocus关键字:Linux  驱动  ADC驱动 手机看文章 扫描二维码
随时随地手机看文章
主机系统:Ubuntu 11.04

内核版本:Linux Kernel 2.6.39

硬件平台:FL2440

开发板系统:Linux Kernel 2.6.28

下面是用CPU轮寻的方式来判断AD转换完成的

  1. #include   
  2. #include   
  3.   
  4. #include   
  5. #include  /*创建设备节点*/  
  6. #include   
  7. #include /*延时函数*/  
  8.   
  9. #include   
  10. #include   
  11.   
  12. #include   
  13. #include   
  14.   
  15. #define ADC_MAJOR 102  
  16. #define ADC_NAME "my_adc"  
  17. #define SUCCESS 0  
  18.   
  19. static int adc_open(struct inode *,struct file *);  
  20. static int adc_release(struct inode *,struct file *);  
  21. static int __init adc_init(void);  
  22. static int __exit adc_exit(void);  
  23. static ssize_t adc_read(struct file *,char *,size_t,loff_t *);  
  24.   
  25. volatile unsigned long adc_con;  
  26. unsigned long adc_dat0;  
  27. //#define adc_con       (unsigned long)ioremap(0x58000000,4)  
  28. //#define adc_dat0      (volatile unsigned long)ioremap(0x5800000c,4)  
  29. struct clk *adc_clk;   
  30.   
  31. struct file_operations  adc_ops =  
  32. {  
  33.     .owner  =   THIS_MODULE,  
  34.     .read       =   adc_read,  
  35.     .open   =   adc_open,  
  36.     .release    =   adc_release,  
  37. };  
  38.   
  39. static int __init adc_init(void)  
  40. {  
  41.     int ret;  
  42.     adc_clk = clk_get(NULL,"adc");//获取时钟  
  43.     clk_enable(adc_clk);//使能时钟  
  44.     ret=register_chrdev(ADC_MAJOR,ADC_NAME,&adc_ops); //注册设备  
  45.     if(ret<0)  
  46.     {  
  47.         printk("register device fail/n");  
  48.         return ret;  
  49.     }  
  50.     adc_con=(unsigned long)ioremap(0x58000000,4);  
  51.     adc_dat0=(volatile unsigned long)ioremap(0x58000000+S3C2410_ADCDAT0,4);  
  52.     if(adc_con&adc_dat0==0)  
  53.     {  
  54.         printk("Failed to ioremap/n");  
  55.         goto handle;  
  56.     }  
  57.     printk("Initialized.../n");  
  58.     return SUCCESS;  
  59. handle:  
  60.     unregister_chrdev(ADC_MAJOR,ADC_NAME);  
  61.     return -1;  
  62. }  
  63.   
  64. static int adc_open(struct inode * inode,struct file * file) //打开设备函数  
  65. {  
  66.       
  67.     return SUCCESS;  
  68. }  
  69.   
  70. static int adc_release(struct inode * inode,struct file * file) //关闭设备函数  
  71. {  
  72.     return SUCCESS;  
  73. }  
  74.   
  75. static ssize_t adc_read(struct file *file,  
  76.                             char * buffer,  
  77.                             size_t length,  
  78.                             loff_t * offset)//设备读取函数  
  79. {  
  80.     unsigned int buf;  
  81.     int tmp;  
  82.     int i;  
  83.     writew((1<<14)|(0x31<<6),adc_con);       //设置ADCCON  
  84.     writew((readw(adc_con) | 0x1),adc_con);  //启动AD转换  
  85.     while(readw(adc_con) & 0x1) ;              //启动转换后,等待启动位清零  
  86.     while(!(readw(adc_con) & 0x8000)) ;            //等待转换是否完毕  
  87.     //for(i=0;i<200000;i++) ;  
  88.     mdelay(100);  
  89.     buf=(readw(adc_dat0) & 0x3ff );                 //取出转换后得到的有效数据  
  90.   
  91.     copy_to_user(buffer, (char *)&buf, sizeof(buf));  
  92.     //printk("The value is %x/n",buf);  
  93.     return 2;  
  94.   
  95. }  
  96.   
  97. static int __exit adc_exit(void) //驱动卸载函数  
  98. {  
  99.     iounmap(adc_con);  
  100.     iounmap(adc_dat0);  
  101.     unregister_chrdev(ADC_MAJOR,ADC_NAME);  
  102.     clk_disable(adc_clk);  
  103.     clk_put(adc_clk);  
  104.     printk("The adc is unintialized/n");  
  105.     return SUCCESS;  
  106. }  
  107.   
  108. module_init(adc_init);           
  109. module_exit(adc_exit);  
  110. MODULE_LICENSE("GPL");  

 

其中控制寄存器的第15未标明AD转换是否完成,当AD完成转换时,控制寄存器自动置一,但是由于数据存在延迟,当第15位置一的时候读出的数据并不稳定,需要在其后加个延迟的函数,在内核态使用的延迟函数包含头文件./linux/delay.h

mdelay(int x);延时x毫秒

udelay(int x);延时x微秒

ndelay(int x);延时x纳秒

 

测试函数如下:

 

  1. #include   
  2. #include   
  3. #include   
  4.   
  5. #define ADC_DEVICE  "/dev/my_adc"  
  6.   
  7. int main()  
  8. {  
  9.     int ret;  
  10.     unsigned int data;  
  11.     ret=open(ADC_DEVICE,0);  
  12.     if(ret<0)  
  13.     {  
  14.         printf("Open adc fail/n");  
  15.         return ret;  
  16.     }  
  17.     for(;;)  
  18.     {  
  19.         //printf("cnt=%d/n",cnt);  
  20.         read(ret,&data,sizeof(data));  
  21.         printf("The value is 0x%x/n",data);  
  22.     }  
  23.     close(ret);  
  24.     return 0;  
  25. }  

 

测试结果

 

关键字:Linux  驱动  ADC驱动 引用地址:Linux 驱动--ADC驱动

上一篇:linux-2.6.35.3内核移植(s3c2440)
下一篇:ARM Cortex-M3 学习笔记(4-2)

推荐阅读最新更新时间:2024-03-16 14:52

mini2440的LEDS驱动程序和测试程序详解
一 leds的驱动程序 位置:linux 2.6.29/drivers/char/mini2440_leds.c #include linux/miscdevice.h #include linux/delay.h #include asm/irq.h #include mach/regs-gpio.h //具体头文件位置/opt/FriendlyARM/mini2440/linux-2.6.29/arch/arm/mach-s3c2410/include/mach/*.h #include mach/hardware.h #include linux/kernel.h #include linux/module.h //具体的
[单片机]
Linux驱动曝光AMD Vega20核心:有望对应7nm加速卡
  这两天发硬件新闻总市心有戚戚,即便看到挺靠谱的消息,也总是有一种愚人节埋雷的隐忧。不过,下面这则,笔者仔细查验了一番,应该可信。下面就随嵌入式小编一起来了解一下相关内容吧。   据VideoCardz,在 Linux 的Freedesktop分支中,出现了Vega20的芯片识别代码。   Vega20识别出来了6种型号,此前Vega 10在驱动中识别出9种,覆盖Instinct、Radeon Pro和RX系列产品。     不过,按照 AMD 的规划,GPU产品线在2018年分为三个级别,其中高端桌面的Vega 56/64已经与我们见面,Vega Mobile已经用在APU和Intel的Kaby Lake-G中。而唯一称
[嵌入式]
智能家居和互联照明 “双引擎”,驱动蓝牙设备网络解决方案高速增长
智能家居和互联照明 “双引擎”,驱动蓝牙设备网络解决方案高速增长 作为蓝牙四大解决方案之一的设备网络,能够安全可靠地连接家庭、商业或其他环境中的数十、数百乃至数千台设备。蓝牙技术联盟(Bluetooth Special Interest Group, SIG)发布的年度报告《2022蓝牙市场最新资讯》表明,未来五年蓝牙设备网络设备年出货量将迎来2.5倍的增长,其中,蓝牙技术在智能家居设备中的广泛普及以及蓝牙互联照明控制系统逐渐获得主流认可的趋势,将赋能相关领域持续高速增长。 2022年蓝牙设备网络设备的出货量将达到6.16亿台 蓝牙设备网络解决方案的关键用例包括控制系统、监测系统、自动化系统等。在蓝牙设备网络多种多样
[电源管理]
详解嵌入式Linux的USB驱动设计
    随着计算机外围硬件的扩展,各种外围设备使用不同的总线接口,导致计算机外部各种总线繁多,管理困难,USB总线可以解决这些问题,因此而诞生。USB总线提供统一的外设的接口方式,并且支持热插拔,方便了厂商开发设备和用户使用设备。USB(通用串行总线)是由Microsft,Compad,Inter和NEC等推出的外围总线接口,目前已发展到2.0标准最高支持480Mb/s的速率,最多可以支持127个外设。   嵌入式Linux是一款源代码完全免费的新兴操作系统,用户可以用户可以通过网络等其他途径免费获得,并可以任意修改其源代码,这是其他的操作系统做不到的。正是由于这一点,Linux得到了广泛的应用。    1 Linux中USB
[嵌入式]
用于汽车尾灯的LED驱动器MAX16804应用电路
用于汽车尾灯的LED驱动器MAX16804应用电路 多数汽车的尾灯和刹车灯采用同一组LED,这就要求LED工作在两个不同的亮度等级:刹车时处于全亮状态,作为尾灯行驶灯时处于10%~25%满亮度状态(可调光)。调光方式最好选择脉宽调节(PWM),能够在整个亮度范围内保持LED的色谱。另外,采用内置200Hz振荡电路的LED驱动器可以省去外部PWM信号发生器,简化设计。   尾灯(可调节LED亮度)和刹车灯(全亮状态)受控于LED驱动器的TAIL和STOP输入,当TAIL端施加电压时,尾灯LED驱动到满亮度的10%至25%。当STOP端施加电压(刹车)时,LED驱动至满亮度状态(无论TAIL端输入处于何种状态)。    尾灯
[电源管理]
用于汽车尾灯的LED<font color='red'>驱动</font>器MAX16804应用电路
stm32驱动ad9854程序分享_ad9854构成信号发生器电路
AD9854概述 AD9854数字合成器是高集成度的器件,它采用先进的DDS技术,片内整合了两路高速、高性能正交D/A转换器通过数字化编程可以输出I、Q两路合成信号。在高稳定度时钟的驱动下,AD9854将产生一高稳定的频率、相位、幅度可编程的正弦和余弦信号,作为本振用于通信,雷达等方面。AD9854的DDS核具有48位的频率分辨率(在300M系统时钟下,频率分辨率可达1uHZ)。输出17位相位截断保证了良好的无杂散动态范围指标。AD9854允许输出的信号频率高达150MHZ,而数字调制输出频率可达100MHZ。通过内部高速比较器正弦波转换为方波输出,可用作方便的时钟发生器。 ad9854优势和特点 00MHz内部时钟速率
[单片机]
stm32<font color='red'>驱动</font>ad9854程序分享_ad9854构成信号发生器电路
2017世界机器人大会开幕,创新驱动智能社会
  8月23日,为期5天的2017世界 机器人 大会在北京亦创国际会展中心盛大开幕,本次大会以会议、展会、竞赛的形式展开,数百名世界一流的学者和企业专家密集交流,共话 机器人 产业新风向。大会得到了IEEE 机器人 与自动化学会、国际机器人研究基金会、美国机器人工业协会、韩国机器人协会等15家国际机构支持。展会上,国内外知名机器人企业同台亮相,演绎了一场规模宏大的机器人行业盛宴。下面就随工业控制小编一起来了解一下相关内容吧。   近年来,在巨大市场需求和全球各国政府的大力支持下,机器人产业获得了快速发展的机会,多地兴起机器人产业园建设,机器人技术,产品,人才逐步跟上,进一步推动了机器人在制造、农业、医疗、社会服务等领域展的应用。
[工业控制]
新型场致发光灯驱动器IMP803的原理与应用
    摘 要: 介绍了新型EL灯驱动专用电路IMP803的原理及典型应用。场致发光灯(EL)应用日益广泛,目前大量用作LCD背光源。     关键词: 场致发光灯 BOOST变换器 H桥驱动器        近年来,场致发光灯(EL)在照明、标牌、键盘以及玩具中的应用日益广泛,目前大量用作LCD背光源。过去的基于变压器的EL场致发光灯驱动器有许多缺点:体积庞大、笨重、噪音大并对负载的依赖非常大。在频率较低时,这一缺点显得更加突出。本文介绍的单电感驱动器IMP803具有极低的电磁干扰(EMI),并且易于控制。     1 IMP803的基本工作原理     场致发光灯是一种面发光的冷光源,由夹在两层导体(电
[半导体设计/制造]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved