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

发布时间:2024-07-24  

由图可知,模拟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 类型的结构, 定义在中. 一个等待队列头可被定义和初始化, 使用:

定义和初始化:

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,


4,测试代码


/*********************************************************************************

 *      Copyright:  (C) 2014  zhouguangfeng  

 *                  All rights reserved.

 *

 *       Filename:  s3c_adc.c

 *    Description:  This file

 *                

 *        Version:  1.0.0

 *         Author:  zhouguangfeng

 *      ChangeLog:  1, Release initial version on "04/01/2012 02:51:19 PM"

 *                

 ********************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

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 : %dn", k, adc_value);

        sleep(1);

    }

 

    close(adc_fd);

    return 0;

}

  


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>