主题 : 2440触摸屏驱动 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 55875
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-09-25
最后登录: 2018-02-08
楼主  发表于: 2011-11-19 11:15

 2440触摸屏驱动

刚开始学习驱动,测试的时候发现第一次打开没问题,但第2次打开却没反应了.
大家帮忙看看可能是什么原因
下面是部分代码:
复制代码
  1. static int s3c2410_ts_open(struct inode *inode, struct file *filp)
  2. {
  3.     TS_DEV *devp;
  4.     
  5.     devp = container_of(inode->i_cdev, TS_DEV, cdev);
  6.     
  7.     filp->private_data = devp;
  8.     
  9.     /* 创建等待队列和环形缓冲区 */
  10.     
  11.     devp->head = devp->tail = 0;
  12.     devp->penStatus = PEN_UP;
  13.     init_waitqueue_head(&(devp->wq));
  14.     
  15.     /* 注册中断 */
  16.     
  17.     if (request_irq(IRQ_ADC, stylus_action, IRQF_SHARED,    /* 共享中断 */
  18.         "s3c2410_action", &(devp->cdev))) {
  19.         printk(KERN_ERR "Could not allocate ts IRQ_ADC\n");
  20.         return -EIO;
  21.     }
  22.     if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
  23.         "s3c241_updown", &(devp->cdev))) {
  24.         printk(KERN_ERR "Could not allocate ts IRQ_TC\n");
  25.         return -EIO;    
  26.     }
  27.     
  28.     DPRINTK("ts opened\n");
  29.     
  30.     return 0;
  31. }
  32. static int s3c2410_ts_release(struct inode *inode, struct file *filp)
  33. {
  34.     TS_DEV *devp = filp->private_data;
  35.     
  36.     disable_irq(IRQ_ADC);
  37.     disable_irq(IRQ_TC);
  38.     free_irq(IRQ_TC,&(devp->cdev));
  39.     free_irq(IRQ_ADC,&(devp->cdev));
  40.     
  41.     DPRINTK("ts released\n");
  42.     
  43.     return 0;
  44. }
  45. static int __init s3c2410_ts_init(void)
  46. {
  47.     int ret;
  48.     adc_clock = clk_get(NULL, "adc");
  49.     if (!adc_clock) {
  50.         printk(KERN_ERR "Faild to get adc clock source\n");
  51.         return -ENOENT;
  52.     }
  53.     clk_enable(adc_clock);
  54.     
  55.     base_addr = ioremap(S3C2410_PA_ADC, 0x20);
  56.     if (base_addr == NULL) {
  57.         printk(KERN_ERR "Fiald to remap register block\n");
  58.         return -ENOMEM;
  59.     }
  60.     
  61.     /* Config GPIOs */
  62.     s3c2410_ts_connect();
  63.     
  64.     iowrite32(S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(0xFF),\
  65.              base_addr+S3C2410_ADCCON);
  66.     iowrite32(0xffff,  base_addr+S3C2410_ADCDLY);
  67.     iowrite32(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
  68.     
  69.     /* Register char device */
  70.     
  71.     if (alloc_chrdev_region(&tsdev_number, 0, 1, DEVICE_NAME) < 0) {
  72.         printk(KERN_DEBUG "Can not register device\n");
  73.         return -1;
  74.     }
  75.     
  76.     tsdev_class = class_create(THIS_MODULE, DEVICE_NAME);
  77.     
  78.     tsdev = kmalloc(sizeof(TS_DEV), GFP_KERNEL);
  79.     if (!tsdev) {
  80.         printk(KERN_ERR "Bad kmalloc\n");
  81.         return -ENOMEM;
  82.     }
  83.     
  84.     cdev_init(&tsdev->cdev, &tsdev_fops);
  85.     tsdev->cdev.owner = THIS_MODULE;
  86.     
  87.     ret = cdev_add(&tsdev->cdev, tsdev_number, 1);
  88.     if (ret) {
  89.         printk(KERN_ERR "Bad cdev\n");
  90.         return ret;
  91.     }
  92.     
  93.     device_create(tsdev_class, NULL, tsdev_number, 0, "my-ts");
  94.     
  95.     DPRINTK("Loading Module my-ts Success..\n");
  96.     
  97.     return 0;
  98. }
  99. static void __exit s3c2410_ts_exit(void)
  100. {
  101.     if (adc_clock) {
  102.         clk_disable(adc_clock);
  103.         clk_put(adc_clock);
  104.         adc_clock = 0;
  105.     }
  106.     
  107.     /* Unregister devce */
  108.     
  109.     unregister_chrdev_region(tsdev_number, 1);
  110.     device_destroy(tsdev_class, tsdev_number);
  111.     cdev_del(&tsdev->cdev);
  112.     kfree(tsdev);
  113.     class_destroy(tsdev_class);
  114.     
  115.     iounmap(base_addr);
  116.     
  117.     DPRINTK("Unloading Module my-ts Success..\n");
  118. }
^很多问题的背后都是简单的原因......
级别: 荣誉会员
UID: 34780
精华: 0
发帖: 1219
金钱: 6230 两
威望: 1246 点
综合积分: 2438 分
注册时间: 2010-12-21
最后登录: 2017-09-18
1楼  发表于: 2011-11-19 13:05
加打印,看看是是运行到哪了,中断有没有发生。。。。等等
级别: 新手上路
UID: 55875
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-09-25
最后登录: 2018-02-08
2楼  发表于: 2011-11-19 13:41

 回 1楼(911gt3) 的帖子

第一次打开没什么问题,是关闭后在打开设备就不行了.
级别: 新手上路
UID: 55875
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
综合积分: 38 分
注册时间: 2011-09-25
最后登录: 2018-02-08
3楼  发表于: 2011-11-19 14:18

 回 1楼(911gt3) 的帖子

在重新加载模块后第一次打开发现它在打开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