FL2440驱动添加(5)ADC驱动学习笔记

由图可知,模拟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

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 <[email protected]>
 *                  All rights reserved.
 *
 *       Filename:  s3c_adc.c
 *    Description:  This file
 *
 *        Version:  1.0.0
 *         Author:  zhouguangfeng <[email protected]>
 *      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;
}

  

时间: 2024-08-02 23:55:06

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

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

学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.html 1.块设备 块设备将数据按照固定块大小的块中,每个块的大小通常在512字节到32768字节之间,磁盘.SD卡都是常见的块设备. 2.字符设备和块设备的区别: 字符设备 块设备 ---------------------------------------------- 按字节访问 按块进行访问 只能按照数据流访问 随机访问 直接访问设备 挂在文件系统的方式访问

变形PE头添加节形式感染学习笔记

原文:http://www.pediy.com/kssd/index.html -- 病毒技术 -- 病毒知识 -- Anti Virus专题 1> 变形PE头的原理: 这里的变形PE头的思路是用的比较方便的方法,就是将IMAGE_DOS_HEADER 和 IMAGE_NT_HEADER 结构融合到一起.因为我们都知IMAGE_DOS_HEADER和IMAGE_NT_HEADER的结构成员很多我们是用不到的,所以我们可以按照相应的结构排列,把这些无用的结构成员,融合到一起后,替换成一些有用的成员

iOS类添加方法、属性学习笔记

一.在运行时为类添加方法 我们首先定义了一个EmptyClass,继承NSObject,没有任何自带方法,接着定义了一个函数.这里提一句,Obj-C的方法(method)就是一个至少需要两个参数(self,_cmd)的C函数,这个函数仅仅输出一句Hello.接下来在addMethod方法中,我们调用class_addMethod()为EmptyClass添加方法,class_addMethod()是这样定义的: BOOL class_addMethod(Class cls, SEL name,

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

原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED驱动的添加 1, 将led.c驱动文件拷贝到linux-3.1.4/drivers/char/目录下 [email protected]# pwd /change/linux-3.1.4/drivers/char [email protected]#  cp /mnt/hgfs/fh/driver/

MongoDB学习笔记系列

回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助和启发,文章中有对新技术的研究(Mongo驱动),对老技术的回顾(代码重构),还有对架构设计的阐述等(面向接口编程,对扩展开放,对修改关闭,所以出现了IMongoRepository接口). MongoDB学习笔记系列~目录 MongoDB学习笔记~环境搭建 (2015-03-30 10:34) M

Android深度探索(卷1)HAL与驱动开发学习笔记(2)

Android深度探索(卷1)HAL与驱动开发学习笔记(2) 第二章搭建Android开发环境 书中介绍了两种JDK的安装方法, 方法一: 从官网下载JDK并进行配置,解压后在终端打开profile文件来设置PATH环境变量(# soure /etc/profile),打开profile文件后输入下面的内容 export PATH=.:developer/jdk6/bin:$PATH 保存profile文件以后,有两种方法可以重新加载profile文件. 1.# sourse  /etc/pro

PHP 数据库驱动、连接数据不同方式学习笔记

相关学习资料 http://www.php.net/manual/zh/refs.database.php http://www.php.net/manual/zh/internals2.pdo.php http://bbs.phpchina.com/thread-184537-1-1.html http://www.metsky.com/archives/660.html http://www.phpbuilder.com/ http://www.w3school.com.cn/php/php

AM335x(TQ335x)学习笔记——触摸屏驱动编写

前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱动源码,单纯的配置DTS是无法完成TQ335x的触摸驱动移植工作的,因此,本文参考内核中原有的pixcir_i2c_ts驱动编写TQ335x的触摸屏(TN92)驱动. 在之前移植TQ210时,我已经编写过TQ210的触摸屏驱动,我的TQ335x还是使用的TQ210的屏,因此,难度不是很大.这里需要说

iOS: 学习笔记, 用代码驱动自动布局实例

iOS自动布局是设置iOS界面的利器. 本实例展示了如何使用自动布局语言设置水平布局, 垂直布局 1. 创建空白iOS项目 2. 添加一个控制器类, 修改YYAppDelegate.m文件 #import "YYAppDelegate.h" #import "YYViewController.h" @implementation YYAppDelegate - (BOOL)application:(UIApplication *)application didFin