mini2440驱动分析之ADC

发布者:Aningmeng最新更新时间:2022-10-12 来源: csdn关键字:mini2440  驱动分析  ADC 手机看文章 扫描二维码
随时随地手机看文章

1 . ADC_DEV 结构

typedef struct {

wait_queue_head_t wait;

int channel;

int prescale;

}ADC_DEV;

 wait      等待队列,进程读取设备,如果没有转换数据,就会睡眠在此队列上

channel   转换通道,s3c2440有八通道的ad,但是只有四个通道AIN[3:0]可以使用,其他四个用于触摸屏

prescale   计算转换速率的时候使用


2 . 变量

    OwnADC   表示是否拥有ADC信号量

    ev_adc   使能ADC标志,用于等待队列的等待条件

    adc_data 转换读出的数据


3 模块初始化,dev_init() 

static int __init dev_init(void)

{

int ret;


base_addr=ioremap(S3C2410_PA_ADC,0x20);

        //映射虚拟地址,其中S3C2410_PA_ADC为物理地址

if (base_addr == NULL) {

printk(KERN_ERR "Failed to remap register blockn");

return -ENOMEM;

}


adc_clock = clk_get(NULL, "adc");

if (!adc_clock) {

printk(KERN_ERR "failed to get adc clock sourcen");

return -ENOENT;

}

clk_enable(adc_clock);

//设置时钟,adc_clk为clk结构体,定义在arm/mach-mmp/clock.h中,代表一种时钟,系统默认时钟是关闭的,所以这里要使能

/* normal ADC */

ADCTSC = 0;


ret = request_irq(IRQ_ADC, adcdone_int_handler, IRQF_SHARED, DEVICE_NAME, &adcdev);

        //装载中断处理例程 

if (ret) {

iounmap(base_addr);

return ret;

}


ret = misc_register(&misc);

        //注册杂项设备

printk (DEVICE_NAME"tinitializedn");

return ret;

}

ADC为字符设备,所有注册成杂项设备,接口简单


4 . 设备打开

static int s3c2410_adc_open(struct inode *inode, struct file *filp)

{

init_waitqueue_head(&(adcdev.wait));   //初始化等待队列


adcdev.channel=0;   //设置转换通道为0,从电路图中可以看到,mini2440的AIN[0]接了一个可调电阻

adcdev.prescale=0xff; //这个是设置转换速率用

DPRINTK( "adc openedn"); //这个宏是模块自己定义的,用于打印调试信息

return 0;

}


5 . 读操作

static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

{

char str[20];

int value;

size_t len;

if (down_trylock(&ADC_LOCK) == 0) {

        //down_trylock不会睡眠,如果获得不了信号量就会返回

        //每个设备都因该有一个信号量或者自旋锁来保护,以防止并发引起的竞态,这种错误很难调试(ldd3)

OwnADC = 1;

        //代表拥有设备

START_ADC_AIN(adcdev.channel, adcdev.prescale);

    // 这是一个宏定义,就是设置ADCCON寄存器,通道,装换速率,并开始转换,把设置寄存器定义成宏简单明了

wait_event_interruptible(adcdev.wait, ev_adc);

        // 已经开始转换了,等待转换完成中断

ev_adc = 0;

        //装换完成,清完成条件为下次转换做准备

DPRINTK("AIN[%d] = 0x%04x, %dn", adcdev.channel, adc_data, ADCCON & 0x80 ? 1:0);


value = adc_data;


OwnADC = 0;

up(&ADC_LOCK);

} else {

value = -1;

}

        // 释放信号量,因为不操作设备了,这里用信号量而不是自旋锁,因为拥有自旋锁的代码不允许睡眠

        // 接下来将转换读出的数据,复制到用户空间

len = sprintf(str, "%dn", value);

if (count >= len) {

int r = copy_to_user(buffer, str, len);

return r ? r : len;

} else {

return -EINVAL;

}

}


START_ADC_AIN 定义如下

#define START_ADC_AIN(ch, prescale)

do{

ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT((ch)) ;

ADCCON |= ADC_START;

}while(0)

这个宏,设置装换速率,设置转换通道,并开始ad转换


6 . 中断处理例程

static irqreturn_t adcdone_int_handler(int irq, void *dev_id)

{

if (OwnADC) {

adc_data = ADCDAT0 & 0x3ff;

        //如果现在拥有设备,读取转换结果

ev_adc = 1;

        //设置等待条件为真

wake_up_interruptible(&adcdev.wait);

        //唤醒等待的进程

}


return IRQ_HANDLED;

}


7. 其他

       release 函数什么也没有做,只是通知设备关闭了

       模块卸载函数,释放掉中断线,注销设备


关键字:mini2440  驱动分析  ADC 引用地址:mini2440驱动分析之ADC

上一篇:mini2440驱动分析之TouchScreen
下一篇:mini2440驱动分析之PWM

推荐阅读最新更新时间:2024-11-12 21:01

U-boot 在 mini2440-S3C2440 上的移植(4):U-boot第二阶段代码:修改初始化代码
编译U-boot给mini2440时,要编译出能在ARM平台上使用的可执行文件-bin,首先要在ubuntu 中安装交叉编译工具链,因为我使用的是友善之臂的开发板,所以我使用的已经制作好的工具链,当然也可以自己制作工具链:如基于GCC和glibc制作工具链,可以使用cross tools编译; 我使用的工具链的版本是arm-linux-gcc-4.3.3版本,下载地址:下载地址 1.在pc端下载好以后,将压缩包用xftp传输到Ubuntu;当然也可以用其他软件上传;上传后把它放在根目录下的/usr/local文件夹中新建一个arm文件夹,然后把压缩包复制到这个文件夹;注意先建好文件夹再上传,可以减少很多工作量; 一定要上传压缩包,
[单片机]
U-boot 在 mini2440-S3C2440 上的移植(4):U-boot第二阶段代码:修改初始化代码
重庆市经信委主任陈金山:ADC芯片设计全国领先
集微网消息,1月27日,重庆市五届人大一次会议举行首场记者会,以“推动高质量发展”为主题,邀请市经信委、市科委、两江新区管委会相关负责人进行了交流。会上,市经信委主任陈金山介绍,去年全年重庆战略性新兴制造业产值增长32.6%,全市规模企业研发投入280亿元,工业企业的研发投入强度达到1.05%。 陈金山介绍,去年全年重庆战略性新兴制造业产值增长32.6%。 实施百项战略性新兴产业项目推进计划,推动康宁玻璃基板、中光电触控显示等一批重点项目建成投产,集成电路提档升级,ADC芯片设计全国领先; 液晶显示基本形成玻璃基板到终端显示的全产业链;工业机器人初步形成研发、整机制造、系统集成、零部件配套、应用服务全产业体系。 物联网基本形成硬件
[手机便携]
数字电源控制器UCD3138的数字比较器与ADC的应用说明
摘要 数字电源控制器UCD3138 内部集成有 4 个数字比较器,可以灵活配置其输入端和参考值。模拟前端(AFE)模块的绝对值量和EADC 的输出都可以作为数字比较器的输入,因此使用数字比较器可以实现对系统输出电压的故障响应与保护。UCD3138 内部集成有 16 个模数转换器(ADC),其中名称为 ADC15 的模数转换器不对外部开放,可以用来检测 3 个AFE 模块中任何一个的 EAP 或 EAN 引脚,实现对系统输出电压的精确采集,最终可以实现对输出电压的故障响应与保护。 1 、 UCD3138 的数字比较器 UCD3138 内部集成有4数字比较器,可以以AFE 的绝对值量或者误差值为输入端,灵活配置参考值
[电源管理]
数字电源控制器UCD3138的数字比较器与<font color='red'>ADC</font>的应用说明
mini2440裸机之MMU(二)(mmu.c)
/************************************************ NAME : MMU.C DESC : Revision: 2002.2.28 ver 0.0 ************************************************/ #include def.h #include option.h #include 2440addr.h #include 2440lib.h #include 2440slib.h #include mmu.h //段(section)是大小为1MB的存储块 // 1) Only the section table is use
[单片机]
<font color='red'>mini2440</font>裸机之MMU(二)(mmu.c)
MSP430学习笔记(4)ADC12
几个术语: a)分辨率(LSB):表示输出数字量变化一个相邻数码所需要输入模拟电压的变化量,它定义为转换器的满刻度电压与2的n次幂,其中n为ADC的位数。 b)量化误差:由于有限数字对模拟值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率。即正负12LSB。 c)转换精度:反应实际的ADC模块在量化上与理想的ADC模块进行模数转换的差值。 d) 转换时间:指ADC完成一次模/数转换所需要的时间。 2.结构: 3. 参考电压发生器: a)指需要的基准信号,通常为电压基准。MSP430 ADC12内置参考电源,有6种可编程选择。 b
[单片机]
MSP430学习笔记(4)<font color='red'>ADC</font>12
GD32 ADC内部通道采样异常原因
熟悉GD32的小伙伴都知道,ADC除了可以采集IO口上的电压外,还有两个内部通道,分别为内部温度传感器通道(ADC0_CH16)和Vrefint通道(ADC0_CH17),其中内部温度传感器通道可以采集芯片周围的温度(注意,这个温度通道适用于采集相对温度,如果用来测试绝对温度,是有一定的误差哦),Vrefint是一个稳定的带隙基准电压,典型值为1.2V。 有的小伙伴反馈使用这两个内部通道时,始终得不到转换数据,那么可能的原因有哪些呢? 原因一: 使用ADC的外部通道即IO电压时,将IO口配置为模拟模式, 然后配置ADC就可以正常工作了,而由于内部通道不需要配置IO口,所有有的小伙伴就直接将IO口的配置去除,但此时发现
[单片机]
GD32 <font color='red'>ADC</font>内部通道采样异常原因
基于STM8的ADC读取---STM8-第四章
1. 综诉   想学会如何在STM8上使用ADC这个功能,我们先得了解单片机中ADC究竟是什么。   ADC是模拟信号转成数值信号,单片机只能识别TTL电平,其实就是 1 或者 0 ,但是如果我们给它一个3.3V电压,单片机就无法识别,,若想使用单片机读取出来得时候,它必须将模拟量变成数字量。 2. 关于STM8S103手册的ADC简介 由官方的全英手册可知。 -------------------------------------------------------------------------------------------------------------------------------
[单片机]
基于STM8的<font color='red'>ADC</font>读取---STM8-第四章
ATmega48 ADC噪声抑制模式
SM2..0为001时,SLEEP指令使MCU进入噪声抑制模式。在此模式下,CPU停止运行,而 ADC、外部中断、两线串行地址匹配、定时器/计数器 2 和看门狗继续工作 (如果已经使能)这个休眠模式只停止了clkI/O、clkCPU 和clkFLASH,其他时钟则继续工作。 此模式改善了 ADC 的噪声环境,使得转换精度更高。 ADC 使能的时候,进入此模式将自动启动一次 AD 转换。ADC 转换结束中断、外部复位、看门狗复位、BOD 复位、两线串行地址匹配、 定时器/计数器2中断、SPM/EEPROM 准备好中断、外部中断 INT0 、INT1 或引脚电平变化中断可以将 MCU 从 ADC 噪声抑制模式唤醒。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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