文档章节

tq2440 adc+中断 驱动

天嵌科技
 天嵌科技
发布于 2016/03/24 15:59
字数 771
阅读 16
收藏 0

  TQ2440 是由广州天嵌计算机科技有限公司精心打造的一款开发板。以稳定的性能,过硬的质量,丰富的扩展接口,优质的售后服务和技术支持,赢得众多企业的青睐和支持。

  基于tq2440开发板,内核2.6.30

  功能

  能进中断了,而且通道2读出来的数据也正确。

  点击触摸屏的时候可能会混淆。因为触摸屏用的也是 adc-irq .

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #include

  #define DEVICE_NAME "driver_adc"

  volatile unsigned long *adccon = NULL; //adc控制寄存器

  volatile unsigned long *adctsc = NULL; //adc 触摸屏控制寄存器

  volatile unsigned long *adcdly = NULL; //adc 起始延迟寄存器

  volatile unsigned long *adcdat0 = NULL; //adc 转换数据寄存器

  volatile unsigned long *adcdat1 = NULL; //adc 转换数据寄存器

  volatile unsigned long *intmsk = NULL;

  //*gpbdat &= ~((1<<5) );

  //ain2

  static DECLARE_WAIT_QUEUE_HEAD(adc_waitq);

  static volatile int val=0;

  static volatile int ev_press = 0;

  static irqreturn_t adc_irq(int irq, void *dev_id)

  {

  printk("-------------adc_irq is ok ------------\n");

  ev_press=1;

  //*adccon |= 0X1; //开始转换

  val=(*adcdat0&0x3ff);

  wake_up_interruptible(&adc_waitq);

  return IRQ_RETVAL(IRQ_HANDLED);

  }

  // ------------------- OPEN ------------------------

  ssize_t drive_open (struct inode * inode ,struct file * file)

  {

  printk("-----------------drive open ok----------------\n");

  request_irq(IRQ_ADC,adc_irq, IRQF_SAMPLE_RANDOM|IRQF_SHARED,"adc_irq",1);

  return 0;

  }

  // ------------------- RELEASE/CLOSE ---------------

  ssize_t drive_release (struct inode * inode ,struct file * file)

  {

  printk("-----------------drive close ok----------------\n");

  free_irq(IRQ_ADC, 1);

  return 0;

  }

  // ------------------- READ ------------------------

  ssize_t drive_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)

  {

  printk("-----------------drive read ok----------------\n");

  *adccon |= (1<<14)|(0xff<<6)|(2<<3);//设置分频倍数0xff,设置输入通道为2

  //*intmsk |= (1<<31)| (1<<5)|(1<<8);

  *adccon |= 0X1; //开始转换

  wait_event_interruptible(adc_waitq, ev_press);

  ev_press = 0;

  /*

  while( !(*adccon & 0x8000) ) //等待转换结束

  ;

  val=(*adcdat0&0x3ff);

  */

  *adccon &=~1; //关adc

  printk("----------------drive -----val=%d \n",val);

  copy_to_user( buf,&val,sizeof(val) );

  printk("---------------drive-close-ok-------------\n",val);

  return val;

  }

  // ------------------- WRITE -----------------------

  ssize_t drive_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)

  {

  printk("-----------------drive write ok----------------\n");

  return 0;

  }

  // ------------------- IOCTL -----------------------

  ssize_t drive_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg)

  {

  printk("-----------------drive ioctl ok----------------\n");

  return 0;

  }

  // -------------------------------------------------

  static struct file_operations drive_ops ={

  .owner = THIS_MODULE,

  .open = drive_open,

  .read = drive_read,

  .write = drive_write,

  .ioctl = drive_ioctl,

  .release = drive_release,

  };

  static struct miscdevice misc = {

  .minor = MISC_DYNAMIC_MINOR,

  .name = DEVICE_NAME,

  .fops = &drive_ops,

  };

  static int __init init_drive(void)

  {

  int ret;

  ret = misc_register(&misc);

  adccon = (volatile unsigned long *)ioremap(0x58000000, 16);

  adctsc = (volatile unsigned long *)ioremap(0x58000004, 8);

  adcdly = (volatile unsigned long *)ioremap(0x58000008, 16);

  adcdat0= (volatile unsigned long *)ioremap(0x5800000c, 16);

  adcdat1= (volatile unsigned long *)ioremap(0x58000010, 16);

  intmsk = (volatile unsigned long *)ioremap(0x4a000008, 32);

  printk("-----------------drive button init ok----------------\n");

  return 0;

  }

  static void __exit exit_drive(void)

  {

  misc_deregister(&misc);

  printk("-----------------drive button exit ok----------------\n");

  }

  module_init(init_drive);

  module_exit(exit_drive);

  MODULE_LICENSE("GPL");

  //-------------------------------------应用程序------------------------------------------------

  #include

  #include

  #include

  #include // open() close()

  #include // read() write()

  #define DEVICE_NAME "/dev/driver_adc"

  //------------------------------------- main ---------------------------------------------

  int main(int argc, char **argv)

  {

  int fd,ret;

  int val;

  fd = open(DEVICE_NAME, O_RDWR);

  if (fd == -1)

  {

  printf("can't open device mknod %s c zhu ci \n",DEVICE_NAME);

  return 0;

  }

  while(1)

  {

  read(fd,&val,sizeof(val));

  printf("------------------app--------------------\n");

  printf("val=%d\n",val);

  sleep(3);

  }

  // close

  ret = close(fd);

  if (ret == -1)

  {

  printf("app close error!!!!!!!!!!\n");

  return 0;

  }

  return 0;

  }// end main

  感谢chen4013874的分享!


  供货情况:

  天嵌科技提供专业嵌入式板卡和行业解决方案。如有需要,可以联系天嵌科技的销售人员。

  销售电话:020-38219416 38373101

  技术支持:020-38219416转807 820

  网址:http://www.embedsky.com


本文转载自:http://www.embedsky.com/index.php?s=/News/show/id/391.html

共有 人打赏支持
天嵌科技
粉丝 4
博文 135
码字总数 40355
作品 0
广州
S3C2440 ADC采集数据花费时间和理论值不一致

我在使用TQ2440 ADC采集外部传感器数据时,设定预分频值为49,即0x31,理论上AD转换所花时间根据公式计算是5us(PCLK是50MHz,没改过)。我用四通道循环采数据,每通道采集1000个数据,那理论...

小虾m米i
2015/12/22
38
0
基于platform总线的中断(按键)字符设备驱动设计

1、platform简介 为了理解platform总线设备驱动模型的实际运用,我首先分析了基于S3C2410的看门狗驱动实现过程,我本着将自己学过的知识在温习一遍的态度,完成了基于platform平台总线的外部...

长平狐
2012/09/03
268
0
NUC970平台触摸屏驱动移植

原理概述 1.首先要区分lcd和触摸屏,lcd是一个屏幕,触摸屏是贴在lcd上的两层膜。 2.四线电阻触摸屏的原理:触摸屏就是上下两层膜,比如上层代表x轴(XM:负端,XP:正端),下层代表y轴(Y...

诸葛一帆丶
2017/02/15
0
0
hi3518e ADC 连续采样并获取电压值

对于hi3518e 主控芯片内部ADC采样的描述有位牛人描述的很到位。 https://blog.csdn.net/u013738338/article/details/78602986 那个大哥从datasheet出发深入浅出地将hi3518e ADC采样过程描述地...

huang_165
05/25
0
0
linux触摸屏驱动

版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127 一.触摸屏理论概述 对于触摸屏驱动,我们主要需要掌握触摸屏驱动代码和应用层测试代码。下面讲的是基于Mini2440的触摸屏驱动,...

So_care_about_y
2017/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

弹性工作制的魔咒

简评:你找到了一份完美的工作 —— 可以提前离开公司,还可以在晚上从家里回复邮件。既然如此,你为什么还会有那么强的负罪感呢? 或许是弹性工作制魔咒在作祟。 很多享受弹性工作制的人会始...

极光推送
6分钟前
0
0
KAFKA介绍(分布式架构)

Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统术语: Kafka将消息以...

明理萝
12分钟前
0
1
os::NodeHandle::subscribe回调函数绑定对象

void Foo::callback(const std_msgs::Empty::ConstPtr& message){}Foo foo_object;ros::Subscriber sub = handle.subscribe("my_topic", 1, &Foo::callback, &foo_object); 参考: ht......

itfanr
13分钟前
0
0
React16.4 开发简书项目 从零基础入门到实战

React16.4 开发简书项目 从零基础入门到实战 关注我的订阅号下载 React16.4 开发简书项目 从零基础入门到实战

蜗牛奔跑
16分钟前
0
0
day57-20180815-流利阅读笔记-待学习

社恐怎么办?这个漫画或许能治愈你 毛西 2018-08-15 1.今日导读 近日,芬兰漫画家卡罗利娜·科尔霍宁创作的绘本《芬兰人的噩梦》在中国大火。一时间书中的主人公马蒂成为了人们茶余饭后热议的...

aibinxiao
20分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部