热度 35
2016-3-24 15:37
996 次阅读|
6 个评论
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 = ~((15) ); //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=(*adcdat00x3ff); 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 |= (114)|(0xff6)|(23);//设置分频倍数0xff,设置输入通道为2 //*intmsk |= (131)| (15)|(18); *adccon |= 0X1; //开始转换 wait_event_interruptible(adc_waitq, ev_press); ev_press = 0; /* while( !(*adccon 0x8000) ) //等待转换结束 ; val=(*adcdat00x3ff); */ *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