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
用户164119 2016-3-31 09:17
用户3731705 2016-3-30 16:45
用户1871547 2016-3-29 14:19
用户1871598 2016-3-29 11:51
用户1871543 2016-3-29 11:00
用户1871561 2016-3-26 14:59