由图可知,模拟ADC分为两部分功能,一部分是触屏功能,另一部分就是普通ADC功能。分别可以产生INT_TC和INT_ADC 两个中断。该ADC模块总共有8个通道可以进行模拟信号的输入,分别是AIN0、AIN1、AIN2、AIN3、YM、YP、XM、XP通过一个8路模拟开关MUX进行选通。设定控制寄存器(ADCCON)中预分频器的值来确定AD转换器频率,之后ADC将模拟信号转换为数字信号保存到ADC数据寄存器ADCDAT0, ADCDAT0中的数据(一般第十位有效)可以通过中断或查询的方式来获取。

ADC 的使用步骤:
(1) 设置ADCCON
寄存器,选择输入信号通道,设置A/D 转换器的时钟。
(2) 设置ADCTSC 寄存器,即ADC触摸屏控制寄存器,工作在两种模式,多用于触摸屏;当使用设为普通转换模式,使用默认值即可。
(3) 设置ADCDLY 寄存器,启动A/D 转换。如果在ADCCON中设置READ_START 为1,则读取完已转换数据(读 ADCDAT0 寄存器)时即自动启动下一次转换;否则,就通过设置ENABLE_START 位 来启动A/D。
(4) 转换结束时,读取ADCDAT0 寄存器来获取数值。如果使用查询方式,则可以不读取ADCCON 寄存器的ECFLG 位来确定转换是否结束;否则可以使用INT_ADC 中断,发生INT_ADC 中断时表示转 换结束。

ADC驱动代码:http://www.cnblogs.com/hoys/archive/2011/01/24/1943533.html

记录学习到几点:

1,使用信号量semaphore和队列可以实现阻塞式访问临界区,实现对资源的互斥访问,

信号量使用:

定义和初始化(宏):DEFINE_MUTEX(ADC_LOCK)

两种获取和释放信号量方法,函数包含在linux/semaphore.h头文件声明应该对应使用:

获取信号量:mutex_lock(&ADC_LOCK)              释放信号量:mutex_unlock(&ADC_LOCK)

获取信号量:down_trylock(&ADC_LOCK)            释放信号量:up(&ADC_LOCK)

队列使用:

一个等待队列由一个"等待队列头"来管理, wait_queue_head_t 类型的结构, 定义在<linux/wait.h>中. 一个等待队列头可被定义和初始化, 使用:

定义和初始化:

DECLARE_WAIT_QUEUE_HEAD(adc_waitq)   或者

wait_queue_head_t adc_waitq;

init_waitqueue_head(&adc_waitq);

队列睡眠:

wait_event(adc_waitq, condition)

wait_event_interruptible(adc_waitq, condition)

wait_event_timeout(adc_waitq, condition, timeout)

wait_event_interruptible_timeout(adc_waitq, condition, timeout)

adc_waitq 是要用的等待队列头。

队列唤醒:

void wake_up(wait_queue_head_t *adc_waitq);

void wake_up_interruptible(wait_queue_head_t *adc_waitq);

通常, 不用区分的, 实际上, 惯例是使用 wake_up

2,linux的misc设备对字符设备的封装

http://blog.csdn.net/yaozhenguo2006/article/details/6760575

3,共享中断的使用

申请ADC中断服务,由于触摸屏驱动和普通转换ADC使用同一中断,共享中断参数IRQF_SHARED。

int request_irq(unsigned int irq,  irqreturn_t (*handler)(int, void *, struct pt_regs *),    unsigned long flags,   const char *dev_name,      void *dev_id);

参数解析:

unsigned int irq //请求的中断号

irqreturn_t (*handler) //   安装的处理函数指针.

unsigned long flags //一个与中断管理相关的选项的位掩码,共享中断设置为IRQF_SHARED, 否则使用IRQF_DISABLED

const char *dev_name //这个传递给 request_irq 的字串用在 /proc/interrupts 来显示中断的拥有者

void *dev_id //用作共享中断线的指针. 它是一个独特的标识, 用在当释放中断线时以及可能还被驱动用来指向它自己的私有数据区(来标识哪个设备在中断). 如果中断没有被共享, dev_id 可以设置为 NULL,

 

学习链接:http://blog.chinaunix.net/uid-24219701-id-3292997.html

4,测试代码

/*********************************************************************************
* Copyright: (C) 2014 zhouguangfeng <zhouguangfeng91@sina.com>
* All rights reserved.
*
* Filename: s3c_adc.c
* Description: This file
*
* Version: 1.0.0
* Author: zhouguangfeng <zhouguangfeng91@sina.com>
* ChangeLog: 1, Release initial version on "04/01/2012 02:51:19 PM"
*
********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h> int main(void)
{
int adc_fd;
int adc_value, adc_size;
int k=8; adc_fd = open("/dev/adc", O_RDONLY);
if (adc_fd < 0)
{
perror("open device adc");
exit(1);
} while(k--)
{
adc_size = read(adc_fd, &adc_value, sizeof(adc_value));
printf("adc channel %d value : %d\n", k, adc_value);
sleep(1);
} close(adc_fd);
return 0;
}

  

FL2440驱动添加(5)ADC驱动学习笔记的更多相关文章

  1. linux驱动开发之块设备学习笔记

    我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...

  2. mini2440驱动奇谭——ADC驱动与測试(动态挂载驱动)

    博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态载入adc驱动模块并能通过測试程序 系统:Ubuntu 14.04     驱动交叉编译内核:linux-2. ...

  3. .net core webapi +ddd(领域驱动)+nlog配置+swagger配置 学习笔记(2)

    DDD领域驱动模型设计 什么是DDD 软件开发不是一蹴而就的事情,我们不可能在不了解产品(或行业领域)的前提下进行软件开发,在开发前,通常需要进行大量的业务知识梳理,而后到达软件设计的层面,最后才是开 ...

  4. .net core webapi +ddd(领域驱动)+nlog配置+swagger配置 学习笔记(1)

    搭建一个.net core webapi项目  在开始之前,请先安装最新版本的VS2017,以及最新的.net core 2.1. 首先创建一个Asp.Net Core Web应用程序 这个应用程序是 ...

  5. ALSA声卡12_从零编写之添加音量控制_学习笔记

    1.设置音量时应用程序的调用过程 (1)strace分析: amixer cset numid=1 30 (设置音量) /dev/snd/controlC0 open SNDRV_CTL_IOCTL_ ...

  6. 【转】 linux内核移植和驱动添加(三)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...

  7. linux 混杂设备驱动之adc驱动

    linux2.6.30.4中,系统已经自带有了ADC通用驱动文件---arch/arm/plat-s3c24xx/adc.c,它是以平台驱动设备模型的架构来编写的,里面是一些比较通用稳定的代码,但是l ...

  8. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  9. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

  10. MongoDB学习笔记(转)

    MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...

随机推荐

  1. Strategy策略设计模式

    1.策略模式和状态模式的区别和联系(本部分转载自:http://letscoding.cn/java%E4%B8%AD%EF%BC%8C%E7%8A%B6%E6%80%81%E6%A8%A1%E5%B ...

  2. android开发(50) Android透明状态栏。适用于 4.4 以上及 5.0以上设备

    概述 有时候我们想在 andorid 手机上实现一种 跨越 顶部状态栏的效果,比如一张图片直接显示在 状态栏内.比如下图: 这个页面里有张图片,这个图片显示在整个页面的上部分.状态栏是 漂浮在这个图片 ...

  3. Ubuntu14.04手动创建桌面快捷方式

    如果是系统自带的程序,默认的桌面图标放在 /usr/share/applications/下面,可以直接将对应的图标放到当前用户的~/Desktop/目录下即可 如果是从网上下载已编译的二进制文件(e ...

  4. jQuery - jQuery的$.extend和$.fn.extend作用及区别

    jQuery为开发插件提拱了两个方法,分别是: 1. jQuery.fn.extend(); 2. jQuery.extend(); 虽然 javascript没有明确的类的概念,但是可以构建类似类的 ...

  5. 通过RFC给SAP新建用户

    1.首先引用dll,然后在程序开头:using SAP.Middleware.Connector; 2.接下去就是设置登陆参数了,以前相关博文都有说明: public class MyBackendC ...

  6. centos下配置java环境变量

    一. 需要配置的环境变量1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们需要把 jdk安装目录下的bin ...

  7. Access导出csv 内容添加双引号 vba

    要求:导出的csv文件,用文本工具打开时,文字内容需要有双引号,如下:"1","name1","name2","" 我之 ...

  8. C# 事件和委托

    相信大家在面试的时候会经常问到事件和委托的区别,为什么.net中需要事件和委托这样类似的问题吧,对于一些初学者来说可平时用的过程中也不知道为什么, 只知道这样用,而对于其中的实现机制不是很清楚, 所以 ...

  9. NuGet 让你都美好的PM

    题外话 从前有座山,山上有座庙,庙里有个老和尚.阿阿阿,好多鱼好多余. 什么是Nuget NuGet(发音:New-Get)是一个Visual Studio的扩展.在使用Visual Studio开发 ...

  10. JS魔法堂:浏览器模式和文档模式怎么玩?

    一.前言 从IE8开始引入了文档兼容模式的概念,作为开发人员的我们可以在开发人员工具中通过“浏览器模式”和“文档模式”(IE11开始改为“浏览器模式”改成更贴切的“用户代理字符串”)品味一番,它的出现 ...