天嵌 ARM开发社区

 找回密码
 注册
查看: 2166|回复: 3

ad驱动和触摸屏冲突

[复制链接]
imb1900220 发表于 2009-12-16 17:54:38 | 显示全部楼层 |阅读模式
做了一个ad的驱动,并且把采样的值显示在qt中,
但是遇到问题
1、AD采样用的是tq2440开发板上自带的可调电阻,对应的通道是通道2,
最后在qt中显示的时候,实际显示的数值并不是通道2 采样的数据,而是触摸屏的数据,


我在驱动中读取的数值是从DAT0中读取的,看了手册后知道这个是触摸屏的数据采样存储的寄存器,所以把我的AD采样的值给覆盖了,

想知道是不是这样的,
要想真实的显示自己的AD 数值要怎么办

还有,系统自带的触摸屏的驱动是编译在内核中的,是不是一上电启动开发板 触摸屏就会一直占用AD,


想读出通道2的数据,我要怎么办,,这个冲突怎么解决呢
亚瑟王 发表于 2009-12-17 19:21:53 | 显示全部楼层
这个问题已经回答了一遍了,到另外一个地方看答案。
回复

使用道具 举报

lvlei 发表于 2012-3-14 12:32:36 | 显示全部楼层
我也遇到了这个问题,怎么办?
回复

使用道具 举报

lvlei 发表于 2012-3-16 10:46:08 | 显示全部楼层
本人已经解决,程序如下

#include<linux/module.h>
#include<mach/regs-gpio.h>
#include<mach/hardware.h>
#include <linux/device.h>
#include<linux/kernel.h>
#include <linux/fs.h>
#include <asm/irq.h>
#include<linux/sched.h>
#include<linux/timer.h>
#include<linux/init.h>
#include <linux/clk.h>
#include <plat/regs-timer.h>
#include <asm/io.h>
#include <plat/regs-adc.h>
#include<linux/interrupt.h>
#include <asm/uaccess.h>


#define DEVICE_NAME "lvl-adc"
#define ADC_MAJOR 234



static void __iomem *adc_base;
static int adc_data;
static struct clk *adc_clk;
extern struct semaphore ADC_LOCK;
//DEFINE_MUTEX(ADC_LOCK);
static volatile int ev_adc = 0;
static DECLARE_WAIT_QUEUE_HEAD(adc_waitq);

static irqreturn_t adc_irq(int irq, void *dev_id)
{
    if(!ev_adc)
    {
        adc_data = readl(adc_base + S3C2410_ADCDAT0) & 0x3ff;
        ev_adc = 1;
        wake_up_interruptible(&adc_waitq);
    }

    return IRQ_HANDLED;
}

static int lvl_adc_open(struct inode *inode, struct file *file)
{
    int ret;
    ret = request_irq(IRQ_ADC, (void *)adc_irq, IRQF_SHARED, DEVICE_NAME, 1);
    if (ret)
    {  
        printk(KERN_ERR "IRQ%d error %d\n", IRQ_ADC, ret);
        return -EINVAL;
    }
    return 0;
}

static int lvl_adc_close(struct inode *inode, struct file *file)
{
    return 0;
}

static ssize_t lvl_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
        //if (mutex_trylock(&ADC_LOCK) == 0)
        if (down_trylock(&ADC_LOCK) )
        {
            return -EBUSY;
        
    }
    if(!ev_adc)
    {
        if(filp->f_flags & O_NONBLOCK)
        {
            return -EAGAIN;
        }
        else
        {
            unsigned int tmp;
            tmp=(1<<14)|(255<<6)|(1<<4)| (1 << 0);
            writel(tmp, adc_base + S3C2410_ADCCON);
            wait_event_interruptible(adc_waitq, ev_adc);
        }
    }
    ev_adc = 0;
    copy_to_user(buffer, (char *)&adc_data, sizeof(adc_data));
    up(&ADC_LOCK);

    return sizeof(adc_data);
}

static struct file_operations lvl_adc_fops =
{
    .owner      = THIS_MODULE,
    .open       = lvl_adc_open,
    .release    = lvl_adc_close,
    .read      = lvl_adc_read,
};

static struct class *adc_class;
static char __initdata banner[] = "lvlei adc test\n";

static int __init lvl_adc_init(void)
{
    int ret;
    printk(banner);
    ret = register_chrdev(ADC_MAJOR, DEVICE_NAME, &lvl_adc_fops);
    if (ret < 0)
    {
        printk(DEVICE_NAME " can't register major number\n");
        return ret;
    }
    adc_class = class_create(THIS_MODULE, DEVICE_NAME);
    if(IS_ERR(adc_class))
    {
        printk("Err: failed in EmbedSky-adc class. \n");
        return -1;
    }
    device_create(adc_class, NULL, MKDEV(ADC_MAJOR, 0), NULL, DEVICE_NAME);
    adc_base = ioremap(S3C2410_PA_ADC, 0x20);
    printk(DEVICE_NAME " initialized\n");
    adc_clk = clk_get(NULL, "adc");
    if (!adc_clk)
    {
        printk(KERN_ERR "failed to find adc clock source\n");
        return -ENOENT;
    }
    clk_enable(adc_clk);
    return 0;
}

static void __exit lvl_adc_exit(void)
{
   
    unregister_chrdev(ADC_MAJOR, DEVICE_NAME);
    device_destroy(adc_class,  MKDEV(ADC_MAJOR, 0));
    class_destroy(adc_class);
    iounmap(adc_base);
    if (adc_clk)
    {
        clk_disable(adc_clk);     
        clk_put(adc_clk);
        adc_clk = NULL;
    }
}
//EXPORT_SYMBOL(ADC_LOCK);

module_init(lvl_adc_init);
module_exit(lvl_adc_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("lv lei");
MODULE_DESCRIPTION("my2440 adc driver");








#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>

int main(void)
{
    int fd,ret,val;
    char i;
    fd = open("/dev/lvl-adc", O_RDWR);
    if(fd < 0)
    {
        printf("Open ADC Device Faild!\n");
        exit(1);
    }
    else
    {
        
        for (i=f0;i<50;i++)
        {
            ret=read(fd, &val, sizeof(val));
            if (ret==sizeof(val))
            printf ("val= %d\n",val);
            usleep(500000);
        }
        ret= close(fd);
        printf("close adc driver test\n");
    }
    return 0;
}
































回复

使用道具 举报

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

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-5-4 10:05 , Processed in 2.036857 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表