找回密码
 立即注册
收起左侧

TQ2440 adc+中断 驱动

6
回复
5170
查看
[复制链接]
累计签到:82 天
连续签到:1 天
来源: Qt文章 2016-3-24 15:22:39 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  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

回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-3-25 15:32:41 显示全部楼层
多谢分享,终于把这个问题给解决了,太谢谢楼主了!
回复 支持 反对

使用道具 举报

累计签到:6 天
连续签到:1 天
2016-3-26 14:37:04 显示全部楼层
急需的东西,终于在这找到了
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2016-3-29 10:44:24 显示全部楼层
现成的源码,好省事!
回复 支持 反对

使用道具 举报

尚未签到

2016-3-29 11:28:22 显示全部楼层
好帖就是要顶起来~
已学习,感谢!
回复 支持 反对

使用道具 举报

累计签到:82 天
连续签到:1 天
2016-3-30 15:48:51 显示全部楼层
sally_cheng 发表于 2016-3-25 15:32
多谢分享,终于把这个问题给解决了,太谢谢楼主了!

很高兴能帮到你
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-3-30 16:33:53 显示全部楼层
多谢楼主,分享不错!!!
好贴子大家顶
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了