免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4946 | 回复: 10
打印 上一主题 下一主题

如何配置AT91RM9200 PA16/EMDIO/IRQ6 引脚为功能B的IRQ6功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-06 13:23 |只看该作者 |倒序浏览
linux-2.4.27 触摸屏驱动程序
硬件连接如下:触摸屏芯片7843 的中断输出引脚/PENIRQ <-----> PA16/EMDIO/IRQ6
也就是要使用PIOA 的第16线的IRQ功能接受 触摸屏产生的中断信号。
我对这个中断线的配置如下:
AT91C_SYS->PMC_PCER = 1 << AT91C_ID_PIOA; //打开PIOA外围时钟
AT91C_SYS->PIOA_PDR = AT91C_PA16_IRQ6; // 禁止PIOA功能
AT91C_SYS->PIOA_BSR = AT91C_PA16_IRQ6; // 选择功能B,
内核中的触摸屏驱动已经成功编译,中断分配也成功了,分配的中断号为31(AT91C_ID_IRQ6),
但是当执行读取触摸屏文件/dev/touchscreen/0raw,即cat 此文件时,显然打开成功,但用手按下屏幕,此时好像LINUX内核不能接受到产生的中断,因为没有进入中断服务函数ads7843_ts_interrupt,这个函数是在request_irq中指定的,我已经跟踪了这个信息,但此时电平是有正常的,即按下屏时,电平拉低,并且 cat /proc/interrupts 显示的关于这个中断次数也不会变化,总之一句话,内核没有很“正常”的采集到中断信号,而中断信号的产生是正常的,即/PenIrq引脚的电平变化正常,触摸时,电平为低;松开为高;
如果想使用PIOA的16引脚 的IRQ功能的话,应该如何配置 ?我上面的三项可以了吗?已经配置为使用外设功能B了吧?其它地方还要注意吗?就拿使用中断线来说

另外问一下:怎么样才算触摸屏的驱动成功了呢?如果编写一个用户测试程序,利用read读取触摸屏文件/dev/touchscreen/0raw,并打印出读取的值信息,因为read默认要阻塞,如果不按下触摸屏闺将会阻塞,如果按下触摸屏此时应该立即打印出读取的值信息,这样算不算驱动程序已经“好”了呢?

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
2 [报告]
发表于 2007-11-06 14:41 |只看该作者
并且 cat /proc/interrupts 显示的关于这个中断次数也不会变化,而中断信号的产生是正常的

只能说明硬件设置有问题,
仔细跟这些代码附近
AT91C_SYS->PMC_PCER = 1 << AT91C_ID_PIOA; //打开PIOA外围时钟
AT91C_SYS->PIOA_PDR = AT91C_PA16_IRQ6; // 禁止PIOA功能
AT91C_SYS->PIOA_BSR = AT91C_PA16_IRQ6; // 选择功能B,
确保成功设置硬件PIOA

论坛徽章:
0
3 [报告]
发表于 2007-11-06 16:16 |只看该作者
还没有没有其它的建议啊?

论坛徽章:
0
4 [报告]
发表于 2007-11-06 17:40 |只看该作者
我又发现一个问题:向PMC_PCER写任何数据都“没效果”
AT91C_SYS->PMC_PCER = 1 << AT91C_ID_PIOA; //打开PIOA外围时钟
因为我读取PMC_PCSR 的值不会变化,不管如何写入。
再加上
AT91C_SYS->PMC_PCER = 1 << AT91C_ID_IRQ6;此时PCSR的值还不变,
对应的第31位为0,这里应该有问题,应该打开时钟才对啊,不知怎么回事

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
5 [报告]
发表于 2007-11-06 17:46 |只看该作者
能说明一下AT91C_SYS的数据结构吗?

论坛徽章:
0
6 [报告]
发表于 2007-11-06 22:09 |只看该作者
// *****************************************************************************
//              SOFTWARE API DEFINITION  FOR System Peripherals
// *****************************************************************************
typedef struct _AT91S_SYS {
        AT91_REG         AIC_SMR[32];         // Source Mode Register
        AT91_REG         AIC_SVR[32];         // Source Vector Register
        AT91_REG         AIC_IVR;         // IRQ Vector Register
        AT91_REG         AIC_FVR;         // FIQ Vector Register
........
        AT91_REG         PIOA_PER;         // PIO Enable Register
        AT91_REG         PIOA_PDR;         // PIO Disable Register
        AT91_REG         PIOA_PSR;         // PIO Status Register
.......
        AT91_REG         PMC_PCER;         // Peripheral Clock Enable Register
        AT91_REG         PMC_PCDR;         // Peripheral Clock Disable Register
        AT91_REG         PMC_PCSR;         // Peripheral Clock Status Register
........
} AT91S_SYS, *AT91PS_SYS;
typedef volatile unsigned int AT91_REG;
上面的AT91C_SYS是这个结构体的一个指针,它指向的上面定义的寄存器的基地址,这样就可以访问到所有的
寄存器了,我已经跟踪了各个状态寄存器的值,但PMC_PCSR中对应的设置时钟的位并不正确,即外设的时钟没有打开,对于其它寄存器的写入,从它们各自的状态寄存器来看是正常的。不知为什么这个PMC的设置不成功,如果时钟设置不成功的话,那么接受中断很有可以就是问题了,希望大家再指点一下

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
7 [报告]
发表于 2007-11-07 09:53 |只看该作者
再请教一下:
AT91C_SYS->PMC_PCER = 1 << AT91C_ID_PIOA; //打开PIOA外围时钟
AT91C_SYS->PIOA_PDR = AT91C_PA16_IRQ6; // 禁止PIOA功能
AT91C_SYS->PIOA_BSR = AT91C_PA16_IRQ6; // 选择功能B,
typedef volatile unsigned int AT91_REG;
PMC_PCER ,应该只是状态值放在内存里把,那敷值部分是怎么样的呢?
看看硬件连线和程序里面的地址值是否一致

论坛徽章:
0
8 [报告]
发表于 2007-11-07 15:06 |只看该作者
我看到内核中的其它驱动程序可以设置PMC_PCER,并且设置后我读PMC_PCSR,它值会相应的变化,很正常;如 AT91C_SYS->PMC_PCER = 1 << 2 ;
AT91C_SYS->PMC_PCER = 1 << 3 ; ....
就是我的 AT91C_SYS->PMC_PCER = 1 << 31 即设置第31位不成功,不知怎么回事

论坛徽章:
0
9 [报告]
发表于 2008-04-02 17:17 |只看该作者
楼主问题解决了吗,我现在也遇到相同的问题了,求救!

论坛徽章:
0
10 [报告]
发表于 2008-04-08 17:05 |只看该作者
这是我把PB0作为中断,是可以的,供参考
//使能作为输入口
AT91_SYS->PIOB_PER|=AT91C_PIO_PB0;
AT91_SYS->PIOB_IFER|=AT91C_PIO_PB0;
//使能外部时钟控制器
AT91_SYS->PMC_PCER|=0x08;
//使能PB0中断
AT91_SYS->PIOB_IER=AT91C_PIO_PB0;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP