文档章节

tq2440 adc+中断 驱动

天嵌科技
 天嵌科技
发布于 2016/03/24 15:59
字数 771
阅读 18
收藏 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
43
0
基于platform总线的中断(按键)字符设备驱动设计

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

长平狐
2012/09/03
299
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

没有更多内容

加载失败,请刷新页面

加载更多

基于阿里云物联网平台实现的简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入...

阿里云官方博客
15分钟前
1
0
基于阿里云物联网平台,我们这样实现简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入...

阿里云云栖社区
19分钟前
2
0
fedora linux for 龙芯查看实时输出的tomcat日志

软件源带的tomcat版本较低,所以建议从官网下载最新版本。 解压后,执行./startup.sh文件。 查看实时输出的tomcat日志,请使用命令tail -f /usr/share/tomcat/logs/catalina.out。 “/usr/sh...

gugudu
21分钟前
1
0
为什么MySQL数据库要用B+树存储索引?

要回答好这个问题,首先我们要弄懂什么是索引?索引常见的数据结构有哪些?这些数据结构有何优缺点?只有弄懂这些,再去比较,才会知道为啥要用B+树作为MySQL数据库的存储索引了。 一、索引是...

Lienson
22分钟前
1
0
Java重点基础:反射机制

一、什么是反射? Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信...

一个程序员的成长
24分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部