Chinaunix首页 | 论坛 | 博客
  • 博客访问: 714025
  • 博文数量: 96
  • 博客积分: 2110
  • 博客等级: 大尉
  • 技术积分: 1018
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 19:36
文章分类

全部博文(96)

文章存档

2013年(2)

2012年(17)

2011年(77)

分类: LINUX

2011-03-06 12:51:47

最近在研究GPIO方式的键盘,对于GPIO的中断有一些混淆和误解。

S3c2440 支持多达40个内部中断源和20个外部中断源,分别使用内部终端屏蔽寄存器INTMSK和外部中断寄存器MSK进行屏蔽控制。其中,外部中断源通过 GPIO以复用的方式成为内部中断源的一部分。

但是我们清楚,INTMSK是一个32位的寄存器,最多只能支持32中断,它是如何对应这 么多中断的呢?

首先我们先看INTMSK对应的位。
INTERRUPT MASK (INTMSK) REGISTER (Continued)
INT_ADC [31] 0 = Service available, 1 = Masked 1
INT_RTC [30] 0 = Service available, 1 = Masked 1
INT_SPI1 [29] 0 = Service available, 1 = Masked 1
INT_UART0 [28] 0 = Service available, 1 = Masked 1
INT_IIC [27] 0 = Service available, 1 = Masked 1
INT_USBH [26] 0 = Service available, 1 = Masked 1
INT_USBD [25] 0 = Service available, 1 = Masked 1
INT_NFCON [24] 0 = Service available, 1 = Masked 1
INT_UART1 [23] 0 = Service available, 1 = Masked 1
INT_SPI0 [22] 0 = Service available, 1 = Masked 1
INT_SDI [21] 0 = Service available, 1 = Masked 1
INT_DMA3 [20] 0 = Service available, 1 = Masked 1
INT_DMA2 [19] 0 = Service available, 1 = Masked 1
INT_DMA1 [18] 0 = Service available, 1 = Masked 1
INT_DMA0 [17] 0 = Service available, 1 = Masked 1
INT_LCD [16] 0 = Service available, 1 = Masked 1
INT_UART2 [15] 0 = Service available, 1 = Masked 1
INT_TIMER4 [14] 0 = Service available, 1 = Masked 1
INT_TIMER3 [13] 0 = Service available, 1 = Masked 1
INT_TIMER2 [12] 0 = Service available, 1 = Masked 1
INT_TIMER1 [11] 0 = Service available, 1 = Masked 1
INT_TIMER0 [10] 0 = Service available, 1 = Masked 1
INT_WDT_AC97 [9] 0 = Service available, 1 = Masked 1
INT_TICK [8] 0 = Service available, 1 = Masked 1
nBATT_FLT [7] 0 = Service available, 1 = Masked 1
INT_CAM [6] 0 = Service available, 1 = Masked 1
EINT8_23 [5] 0 = Service available, 1 = Masked 1
EINT4_7 [4] 0 = Service available, 1 = Masked 1
EINT3 [3] 0 = Service available, 1 = Masked 1
EINT2 [2] 0 = Service available, 1 = Masked 1
EINT1 [1] 0 = Service available, 1 = Masked 1
EINT0 [0] 0 = Service available, 1 = Masked 1

我们发现INTMSK的第5,6位对应了 EINT4_7, EINT8_23,20个外部中断,也就是所,这20个GPIO引脚只能触发这两个中断。
但是当中断到来时,我们如果判断是由 哪一个GPIO引脚触发的呢?这个时候我们可以通过查询EINTMASK来判断中断源。
EINTMASK Bit Deion
EINT23 [23] 0 = enable interrupt 1= masked
EINT22 [22] 0 = enable interrupt 1= masked
EINT21 [21] 0 = enable interrupt 1= masked
EINT20 [20] 0 = enable interrupt 1= masked
EINT19 [19] 0 = enable interrupt 1= masked
EINT18 [18] 0 = enable interrupt 1= masked
EINT17 [17] 0 = enable interrupt 1= masked
EINT16 [16] 0 = enable interrupt 1= masked
EINT15 [15] 0 = enable interrupt 1= masked
EINT14 [14] 0 = enable interrupt 1= masked
EINT13 [13] 0 = enable interrupt 1= masked
EINT12 [12] 0 = enable interrupt 1= masked
EINT11 [11] 0 = enable interrupt 1= masked
EINT10 [10] 0 = enable interrupt 1= masked
EINT9 [9] 0 = enable interrupt 1= masked
EINT8 [8] 0 = enable interrupt 1= masked
EINT7 [7] 0 = enable interrupt 1= masked
EINT6 [6] 0 = enable interrupt 1= masked
EINT5 [5] 0 = enable interrupt 1= masked
EINT4 [4] 0 = enable interrupt 1= masked
Reserved [3:0] Reserved
但是还有一个疑问,不是说60个 中断源吗?除去24个外部中断源应该还有60-24 -(32-6)=10个内部中断源啊。他们在哪呢?

其实这里涉及到了子中断源的概 念。
Sub Sources Deions Source
INT_AC97 AC97 interrupt             INT_WDT_AC97
INT_WDT Watchdoc interrupt      INT_WDT_AC97
INT_CAM_P P-port capture interrupt in camera interface       INT_CAM
INT_CAM_C C-port capture interrupt in camera interface       INT_CAM
INT_ADC_S ADC interrupt                                                      INT_ADC
INT_TC Touch screen interrupt (pen up/down)                    INT_ADC
INT_ERR2 UART2 error interrupt                                        INT_UART2
INT_TXD2 UART2 transmit interrupt                        INT_UART2
INT_RXD2 UART2 receive interrupt                          INT_UART2
INT_ERR1 UART1 error interrupt                             INT_UART1
INT_TXD1 UART1 transmit interrupt I                        NT_UART1
INT_RXD1 UART1 receive interrupt                          INT_UART1
INT_ERR0 UART0 error interrupt                              INT_UART0
INT_TXD0 UART0 transmit interrupt                         INT_UART0
INT_RXD0 UART0 receive interrupt                         NT_UART0

这里对应了15个子中断源,其实我们明白了INT_WDT_AC97, INT_CAM, INT_ADC, , INT_UART0, INT_UART1, INT_UART2不能算真正的中断源,真 正的中断源应该是那15个中断源,这样中断源的个数就是32 - 6(外部中断) - 6(子中断源) + 24 + 15 = 59, 而并非60。
阅读(1615) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~