当前位置: 技术问答>linux和unix
s3c2440触摸屏驱动
来源: 互联网 发布时间:2017-01-18
本文导语: 刚开始学习驱动,测试的时候发现第一次打开没问题,但第2次打开却没反应了. 大家帮忙看看可能是什么原因 下面是部分代码: static int s3c2410_ts_open(struct inode *inode, struct file *filp) { TS_DEV *devp; devp...
刚开始学习驱动,测试的时候发现第一次打开没问题,但第2次打开却没反应了.
大家帮忙看看可能是什么原因
下面是部分代码:
在重新加载模块后第一次打开发现它在打开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
大家帮忙看看可能是什么原因
下面是部分代码:
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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。