Exynos4412 ADC 设备驱动开发

具体ADC硬件知识及裸机驱动请看: Exynos4412裸机开发 —— A/D转换器

1、原理图如下:


2、相关寄存器信息

ADC_BASE      0x126C0000
ADCCON        0x0000               1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6
ADCDLY          0x0008               
ADCDAT         0x000C              &0XFFF
CLRINTADC    0x0018
ADCMUX        0x001C

3、大体驱动编写流程如下

read()
{
1、向adc设备发送要读取的命令
          ADCCON    1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6

       2、读取不到数据就休眠
            wait_event_interruptible();

       3、等待被唤醒读数据
          havedata = 0;
}

adc_handler()
{
1、清中断 ADC使用中断来通知转换数据完毕的
       2、状态位置位;
            havedata=1;

       3、唤醒阻塞进程
wake_up()
}

probe()
{
1、 读取中断号,注册中断处理函数

2、读取寄存器的地址,ioremap

3、字符设备的操作
}

4、设备树中的节点编写

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. fs4412-adc{  
  2.     compatible = "fs4412,adc";  
  3.     reg = <0x126C0000 0x20>;  
  4.     interrupt-parent = <&combiner>;  
  5.     interrupts = <10 3>;  
  6. };  

5、驱动编写

driver.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include <linux/module.h>  
  2. #include <linux/device.h>  
  3. #include <linux/platform_device.h>  
  4. #include <linux/interrupt.h>  
  5. #include <linux/fs.h>  
  6. #include <linux/wait.h>  
  7. #include <linux/sched.h>  
  8. #include <asm/uaccess.h>  
  9. #include <asm/io.h>  
  10. static int major = 250;  
  11.   
  12.   
  13. static wait_queue_head_t wq;  
  14. static int have_data = 0;  
  15. static int adc;  
  16. static struct resource *res1;  
  17. static struct resource *res2;  
  18. static void *adc_base;  
  19.   
  20. #define ADCCON 0x0000     
  21. #define ADCDLY 0x0008                 
  22. #define ADCDAT 0x000C                
  23. #define CLRINTADC 0x0018  
  24. #define ADCMUX 0x001C  
  25.   
  26.   
  27. static  irqreturn_t adc_handler(int irqno, void *dev)  
  28. {  
  29.     have_data = 1;  
  30.   
  31.     printk("11111\n");  
  32.     /*清中断*/  
  33.     writel(0x12,adc_base + CLRINTADC);  
  34.     wake_up_interruptible(&wq);  
  35.     return IRQ_HANDLED;  
  36. }  
  37. static int adc_open (struct inode *inod, struct file *filep)  
  38. {  
  39.   
  40.     return 0;  
  41. }  
  42. static ssize_t adc_read(struct file *filep, char __user *buf, size_t len, loff_t *pos)  
  43. {  
  44.     writel(0x3,adc_base + ADCMUX);  
  45.     writel(1<<0 | 1<<14 | 0X1<<16 | 0XFF<<6 ,adc_base +ADCCON );  
  46.   
  47.     wait_event_interruptible(wq, have_data==1);  
  48.   
  49.     /*read data*/  
  50.     adc = readl(adc_base+ADCDAT)&0xfff;  
  51.       
  52.     if(copy_to_user(buf,&adc,sizeof(int)))  
  53.     {  
  54.         return -EFAULT;  
  55.     }  
  56.     have_data = 0;  
  57.     return len;  
  58. }  
  59. static  int adc_release(struct inode *inode, struct file *filep)  
  60. {  
  61.     return 0;  
  62. }  
  63. static struct file_operations  adc_ops =  
  64. {  
  65.     .open = adc_open,  
  66.     .release = adc_release,  
  67.     .read = adc_read,  
  68. };  
  69.   
  70.   
  71. static int hello_probe(struct platform_device *pdev)  
  72. {  
  73.     int ret;  
  74.     printk("match 0k \n");  
  75.   
  76.     res1 = platform_get_resource(pdev,IORESOURCE_IRQ, 0);  
  77.     res2 = platform_get_resource(pdev,IORESOURCE_MEM, 0);   
  78.          
  79.     ret = request_irq(res1->start,adc_handler,IRQF_DISABLED,"adc1",NULL);  
  80.       adc_base = ioremap(res2->start,res2->end-res2->start);  
  81.   
  82.     register_chrdev( major, "adc", &adc_ops);  
  83.     init_waitqueue_head(&wq);  
  84.       
  85.     return 0;  
  86. }  
  87. static int hello_remove(struct platform_device *pdev)  
  88. {  
  89.     free_irq(res1->start,NULL);  
  90.     free_irq(res2->start,NULL);    
  91.     unregister_chrdev( major, "adc");  
  92.     return 0;  
  93. }  
  94.   
  95. static struct of_device_id adc_id[]=  
  96. {  
  97.     {.compatible = "fs4412,adc" },  
  98. };  
  99.   
  100. static struct platform_driver hello_driver=  
  101. {  
  102.       
  103.     .probe = hello_probe,  
  104.     .remove = hello_remove,  
  105.     .driver ={  
  106.         .name = "bigbang",  
  107.         .of_match_table = adc_id,  
  108.     },  
  109. };  
  110.   
  111. static int hello_init(void)  
  112. {  
  113.     printk("hello_init");  
  114.     return platform_driver_register(&hello_driver);  
  115. }  
  116. static void hello_exit(void)  
  117. {  
  118.     platform_driver_unregister(&hello_driver);  
  119.     printk("hello_exit \n");  
  120.     return;  
  121. }  
  122. MODULE_LICENSE("GPL");  
  123. module_init(hello_init);  
  124. module_exit(hello_exit);  

test.c

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include <sys/types.h>  
  2. #include <sys/stat.h>  
  3. #include <fcntl.h>  
  4. #include <stdio.h>  
  5.   
  6.   
  7. main()  
  8. {  
  9.     int fd,len;  
  10.     int adc;  
  11.     fd = open("/dev/hello",O_RDWR);  
  12.     if(fd<0)  
  13.     {  
  14.         perror("open fail \n");  
  15.         return ;  
  16.     }  
  17.   
  18.     while(1)  
  19.     {  
  20.         read(fd,&adc,4);  
  21.         printf("adc%0.2f V \n",(1.8*adc)/4096);  
  22.     }  
  23.   
  24.     close(fd);  
  25. }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 爬虫进阶二之 PySpider 框架安装配置

PySpider官方文档 项目地址 官方文档 安装 phantomjs PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它全面支持 web 而不需浏览器支持&#xff0c;其快速、原生支持各种 Web 标准&#xff1a;DOM 处理、CSS 选择器、JSON、Canvas 和 SVG。 PhantomJS 可以用于页…

Exynos4412 中断驱动开发(三)—— 设备树中中断节点的创建

提到中断就必须了解到GIC&#xff0c;下面先了解一下GIC 一、GIC概念 GIC&#xff08;Generic Interrupt Controller&#xff09;是ARM公司提供的一个通用的中断控制器。GIC通过AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;这样的片上总线连接到一个…

Exynos4412 中断驱动开发(二)—— 中断处理流程分析

前面已经学习了中断的注册过程&#xff0c;下面由一张流程图来看一下当中断发生时的处理流程&#xff1a; 中断发生之后处理流程 a -- 具体的CPU architecture相关模块进行现场保护&#xff0c;然后调用machine driver执行对应的中断处理handler; b -- machine driver对应中断处…

Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程

一、中断基础概念 所谓中断&#xff0c;指CPU在执行程序的过程中&#xff0c;出现了某些突发事件即待处理&#xff0c;CPU必须暂停当前的程序。转去处理突发事件&#xff0c;处理完毕后CPU又返回原程序被中断的位置并继续执行。 1、中断分类 a -- 内部中断和外部中断 根据中断的…

rubymine 调试 redmine

1、安装debase和ruby-debug-ide包。&#xff08;注意版本&#xff0c;rubymine 8.0.2下&#xff0c;bitnami下的版本需安装debase -v 0.2.1版本&#xff0c;网上有文章说用debase -v 0.2.2beta6。容易在rubymine启动调试时出现找不到ruby-debug-ide等错误提示&#xff09; 启动…

Linux 设备驱动中的 I/O模型(二)—— 异步通知和异步I/O

阻塞和非阻塞访问、poll() 函数提供了较多地解决设备访问的机制&#xff0c;但是如果有了异步通知整套机制就更加完善了。 异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序根本就不需要查询设备状态&#xff0c;这一点非常类…

判断链表是否有环

链表有环的情况一般是链表的尾指向前面的节点而不是null&#xff0c;如head->node1->node2->node3->node4->tail->node2&#xff0c;该链表存在环。判断环是否存在可以借助两个指针&#xff0c;一个指针每次迭代只移动一步&#xff0c;第二个指针每次迭代移动…

Linux 设备驱动中的 I/O模型(一)—— 阻塞和非阻塞I/O

在前面学习网络编程时&#xff0c;曾经学过I/O模型 Linux 系统应用编程——网络编程&#xff08;I/O模型&#xff09;&#xff0c;下面学习一下I/O模型在设备驱动中的应用。 回顾一下在Unix/Linux下共有五种I/O模型&#xff0c;分别是&#xff1a; a -- 阻塞I/O b -- 非阻塞I/O…

Python 爬虫进阶六之多进程的用法

python 中的多线程其实并不是真正的多线程&#xff0c;并不能做到充分利用多核 CPU 资源。 如果想要充分利用&#xff0c;在 python 中大部分情况需要使用多进程&#xff0c;那么这个包就叫做 multiprocessing。 借助它&#xff0c;可以轻松完成从单进程到并发执行的转换。mult…

Linux 设备驱动的并发控制

Linux 设备驱动中必须要解决的一个问题是多个进程对共享的资源的并发访问&#xff0c;并发的访问会导致竞态&#xff0c;即使是经验丰富的驱动工程师也常常设计出包含并发问题bug 的驱动程序。 一、基础概念 1、Linux 并发相关基础概念 a -- 并发&#xff08;concurrency&#…

第三章:多坐标系

第一节&#xff1a;为什么要有多坐标系 当我们使用一个坐标系来描绘整个场景的时候&#xff0c;场景中的任意点都可以用该坐标系描述&#xff0c;此时如果有一只羊一遍摇动着耳朵&#xff0c;一边走&#xff0c;这个时候如果进行坐标的转换会发现异常的麻烦&#xff0c;此时如果…

Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用

关与设备树的概念&#xff0c;我们在Exynos4412 内核移植&#xff08;六&#xff09;—— 设备树解析 里面已经学习过&#xff0c;下面看一下设备树在设备驱动开发中起到的作用 Device Tree是一种描述硬件的数据结构&#xff0c;设备树源(Device Tree Source)文件&#xff08;以…

Android 网络通信框架Volley简介(Google IO 2013)

1. 什么是Volley 在这之前&#xff0c;我们在程序中需要和网络通信的时候&#xff0c;大体使用的东西莫过于AsyncTaskLoader&#xff0c;HttpURLConnection&#xff0c;AsyncTask&#xff0c;HTTPClient&#xff08;Apache&#xff09;等&#xff0c;今年的Google I/O 2013上&…

Linux 设备驱动开发 —— platform设备驱动应用实例解析

前面我们已经学习了platform设备的理论知识Linux 设备驱动开发 —— platform 设备驱动 &#xff0c;下面将通过一个实例来深入我们的学习。 一、platform 驱动的工作过程 platform模型驱动编程&#xff0c;需要实现platform_device(设备)与platform_driver&#xff08;驱动&am…

Python爬虫入门四urllib库的高级用法

1.设置headers 有些网站不会同意程序直接用上面的方式进行访问&#xff0c;如果识别有问题&#xff0c;那么站点根本不会响应&#xff0c;所以为了完全模拟浏览器的工作&#xff0c;我们需要设置一些 Headers 的属性。 首先&#xff0c;打开我们的浏览器&#xff0c;调试浏览器…

进程上下文、中断上下文及原子上下文

谈论进程上下文 、中断上下文 、 原子上下文之前&#xff0c;有必要讨论下两个概念&#xff1a; a -- 上下文 上下文是从英文context翻译过来&#xff0c;指的是一种环境。相对于进程而言&#xff0c;就是进程执行时的环境&#xff1b; 具体来说就是各个变量和数据&#xff0c;…

Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型

提到 sysfs 文件系统 &#xff0c;必须先需要了解的是Linux设备模型&#xff0c;什么是Linux设备模型呢&#xff1f; 一、Linux 设备模型 1、设备模型概述 从2.6版本开始&#xff0c;Linux开发团队便为内核建立起一个统一的设备模型。在以前的内核中没有独立的数据结构用来让内…

Python爬虫入门七正则表达式

已经搞定了怎样获取页面的内容&#xff0c;不过还差一步&#xff0c;这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢&#xff1f;下面就开始介绍一个十分强大的工具&#xff0c;正则表达式 1.了解正则表达式 正则表达式是用来匹配字符串非常强大的工具&#xff0c;在其…

Linux 文件系统与设备文件系统 (一)—— udev 设备文件系统

一、什么是Linux设备文件系统 首先我们不看定义&#xff0c;定义总是太抽象很难理解&#xff0c;我们先看现象。当我们往开发板上移植了一个新的文件系统之后&#xff08;假如各种设备驱动也移植好了&#xff09;&#xff0c;启动开发板&#xff0c;我们用串口工具进入开发板&a…

情人节,教大家使用css画出一朵玫瑰花。

情人节到了&#xff0c;给大家来一朵高端的玫瑰花。 在网上看到的一个canvas实现的玫瑰花&#xff0c;效果很好&#xff0c;但是代码被压缩过&#xff0c;也没有注释&#xff0c;看的云里雾里的。 今天我教大脚用CSS来实现一朵玫瑰花。 先看效果 首先我们画出一个花瓣 1、画出一…