当前位置:  技术问答>linux和unix

s3c2440触摸屏驱动

    来源: 互联网  发布时间:2017-01-18

    本文导语:  刚开始学习驱动,测试的时候发现第一次打开没问题,但第2次打开却没反应了. 大家帮忙看看可能是什么原因 下面是部分代码: static int s3c2410_ts_open(struct inode *inode, struct file *filp) {     TS_DEV *devp;          devp...

刚开始学习驱动,测试的时候发现第一次打开没问题,但第2次打开却没反应了.
大家帮忙看看可能是什么原因
下面是部分代码:
static int s3c2410_ts_open(struct inode *inode, struct file *filp)
{
    TS_DEV *devp;
    
    devp = container_of(inode->i_cdev, TS_DEV, cdev);
    
    filp->private_data = devp;
    
    /* 创建等待队列和环形缓冲区 */
    
    devp->head = devp->tail = 0;
    devp->penStatus = PEN_UP;
    init_waitqueue_head(&(devp->wq));
    
    /* 注册中断 */
    
    if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED,    /* 共享中断 */ 
        "s3c2410_action", &(devp->cdev))) {
        printk(KERN_ERR "Could not allocate ts IRQ_ADCn");
        return -EIO;
    }
    if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
        "s3c241_updown", &(devp->cdev))) {
        printk(KERN_ERR "Could not allocate ts IRQ_TCn");
        return -EIO;    
    }
    
    DPRINTK("ts openedn");
    
    return 0;
}
static int s3c2410_ts_release(struct inode *inode, struct file *filp)
{
    TS_DEV *devp = filp->private_data;
    
    disable_irq(IRQ_ADC);
    disable_irq(IRQ_TC);
    free_irq(IRQ_TC,&(devp->cdev));
    free_irq(IRQ_ADC,&(devp->cdev));
    
    DPRINTK("ts releasedn");
    
    return 0;
}
static int __init s3c2410_ts_init(void)
{
    int ret;
    adc_clock = clk_get(NULL, "adc");
    if (!adc_clock) {
        printk(KERN_ERR "Faild to get adc clock sourcen");
        return -ENOENT;
    }
    clk_enable(adc_clock);
    
    base_addr = ioremap(S3C2410_PA_ADC, 0x20);
    if (base_addr == NULL) {
        printk(KERN_ERR "Fiald to remap register blockn");
        return -ENOMEM;
    }
    
    /* Config GPIOs */
    s3c2410_ts_connect();
    
    iowrite32(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF),
             base_addr+S3C2410_ADCCON);
    iowrite32(0xffff,  base_addr+S3C2410_ADCDLY);
    iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
    
    /* Register char device */
    
    if (alloc_chrdev_region(&tsdev_number, 0, 1, DEVICE_NAME) cdev, &tsdev_fops);
    tsdev->cdev.owner = THIS_MODULE;
    
    ret = cdev_add(&tsdev->cdev, tsdev_number, 1);
    if (ret) {
        printk(KERN_ERR "Bad cdevn");
        return ret;
    }
    
    device_create(tsdev_class, NULL, tsdev_number, 0, "my-ts");
    
    DPRINTK("Loading Module my-ts Success..n");
    
    return 0;
}
static void __exit s3c2410_ts_exit(void)
{
    if (adc_clock) {
        clk_disable(adc_clock);
        clk_put(adc_clock);
        adc_clock = 0;
    }
    
    /* Unregister devce */
    
    unregister_chrdev_region(tsdev_number, 1);
    device_destroy(tsdev_class, tsdev_number);
    cdev_del(&tsdev->cdev);
    kfree(tsdev);
    class_destroy(tsdev_class); 
    
    iounmap(base_addr);
    
    DPRINTK("Unloading Module my-ts Success..n");
}

在重新加载模块后第一次打开发现它在打开ADC转换中断后不再相应ADC转换中断
iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, 
             base_addr+S3C2410_ADCCON);
同样第2次打开,触摸屏中断IRQ_TC和ADC中断IRQ_ADC都不响应
只有重启系统后第一次打开没任何问题
打开设备后系统中断如下:
[root@FriendlyARM driver]# cat /proc/interrupts 
           CPU0
 30:      25085         s3c  S3C2410 Timer Tick
 32:          0         s3c  s3c2410-lcd
 33:          0         s3c  s3c-mci
 37:         21         s3c  s3c-mci
 42:          0         s3c  ohci_hcd:usb1
 43:          0         s3c  s3c2440-i2c
 51:       2637     s3c-ext  eth0
 60:          0     s3c-ext  s3c-mci
 70:         99   s3c-uart0  s3c2440-uart
 71:        214   s3c-uart0  s3c2440-uart
 79:          4     s3c-adc  s3c241_updown
 80:         68     s3c-adc  adc, s3c2410_action
 83:          0           -  s3c2410-wdt
Err:          0

79和80分别是IRQ_TC和IRQ_ADC

|
IRQ_ADC  的中断有没有设置成共享中断

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • S3C2440接NRF24L01无线模块Linux驱动
  • s3c2440 PS/2键盘的驱动文件在哪儿啊?
  • 自己搞不定了,向大家请教s3c2440的RTC驱动
  • s3c2440 u-boot地址问题
  • 请问s3c2440的a/d输入电压值范围是多少啊?谢谢
  • 有用S3C2440搞过3G的吗?
  • s3c2440的虚拟地址和实际地址是如何转化的
  • 我在S3C2440上配置RT3070时遇到 unknown symbol in module
  • s3c2440移植双网卡遇到的问题
  • 为什么我用S3C2440去控制18B20,reset总是不成功,温度出来不是00就是ff
  • ARM s3c2440串口硬件流控
  • s3c2440与fpga,framebuffer
  • S3C2440 访问IDE硬盘,为何读回的数据都是0?
  • 操作系统 iis7站长之家
  • S3C2440开发板上EINT11/GPG3对应的硬件中断号是多少??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3