博文

目前显示的是标签为“interrupt”的博文

从下到上分析中断处理

S3C2410中断的定义的中断向量是从16~47.然后外部中断从48~69.70~80.一共有66(80-16)个中断其中70~78 UART是用来与PC进行通信的。 25 #define S3C2410_CPUIRQ_OFFSET (16) 26 27 #define S3C2410_IRQ(x) ((x) + S3C2410_CPUIRQ_OFFSET) 28 29 /* main cpu interrupts */ 30 #define IRQ_EINT0 S3C2410_IRQ(0) /* 16 */ 31 #define IRQ_EINT1 S3C2410_IRQ(1) 32 #define IRQ_EINT2 S3C2410_IRQ(2) 33 #define IRQ_EINT3 S3C2410_IRQ(3) 34 #define IRQ_EINT4t7 S3C2410_IRQ(4) /* 20 */ 35 #define IRQ_EINT8t23 S3C2410_IRQ(5) 36 #define IRQ_RESERVED6 S3C2410_IRQ(6) /* for s3c2410 */ 37 #define IRQ_CAM S3C2410_IRQ(6) /* for s3c2440,s3c2443 */ 38 #define IRQ_BATT_FLT S3C2410_IRQ(7) 39 #define IRQ_TICK S3C2410_IRQ(8) /* 24 */ 40 #define IRQ_WDT S3C2410_IRQ(9) /* WDT/AC97 for s3c2443 */ 41 #define IRQ_TIMER0 S3C2410_IRQ(10) 42 #define IRQ_TIMER1 S3C2410_IRQ(11) 43 #define IRQ_TIMER2 S3C2410_IRQ(12) 44 #define IRQ_TIMER3 S3C2410_IRQ(13) 45 #define...

S3C2410中断处理器模块寄存器详解

图片
      S3C2410的中断异常处理模块有以下寄存器构成: SRCPND, INTMODE, INTMSK, PRIORITY, INTPND, INTOFFSET, SUBSRCPND, INTSUBMSK。 下面具体介绍各个寄存器的功能:        SRCPND(Source Pending Register)寄存器有效位32位,可读写,每一位涉及到一个中断源,SRCPND是主中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了,SRCPND的相应位便被置1,也就是说SRCPND 在 同一时刻可以有若干位同时被置1 ,另外,此寄存器不受中断控制器的优先权逻辑的影响。如果此中断没有被INTMSK寄存器屏蔽或者是快中断(FIQ) 的话,它将被进一步处理。通过写数据到这个寄存器能清除SPCPND相应的位。       INTMODE(Interrupt Mode Register)寄存器有效位为32位,可读写,每一位与SRCPND中各位相对应,它的 作用是指定该位相应的中断源处理模式 (IRQ还是FIQ)。若某位为0,则该位相对应的中断按IRQ模式处理,为1则以FIQ模式进行处理,该寄存器初始化值为0x00000000,即所有中断皆以IRQ模式进行处理。此中断控制器中只有一个中断源能用FIQ mode(在紧急中断下使用FIQ mode),因此INTMODE仅有一位能置1。      INTMSK(Interrupt Mask Register)寄存器有效位为32位,可读写,INTMSK为主中断屏蔽寄存器与SRCPND寄存器对应,它的作用是决定该位相应的中断请求是否被处理。若某位被设置为1,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0则CPU对其进行处理。该寄存器初始化值为 0xFFFFFFFF,既默认情况下所有的中断都是被屏蔽的。       ...

arm-linux中断初始化分析

图片
这篇文档准备简要的分析下arm平台上linux下的中断是如何运行的,本文将先分析初始化时的中断是如何建立的,然后以一个例子来注册一个中断,并详细分析中断触发到调用我们自己的中断例程的整个流程。 本文linux2.6.18的源码和s3c2410的CPU及smdk2410的板子为例来分析代码。 一 中断初始化: 大家都知道arm下规定,在0x00000000或0xffff0000的地址处必须存放一张跳转表, 其格式如下: 上面的这个表我们称之为”异常中断向量表”,表中的IRQ和FIQ位置就是用来存放处理中断函数的地址。至于具体选择在哪一个地址处存放该表, 可由 CPU的协处理器完成 。如s3c2410下由CP15中寄存器1的位13来决定,我们可以通过设置该位来告诉系统我们的向量表在哪。 include/arch/asm-arm/proc-armv/system.h #if __LINUX_ARM_ARCH__ >= 4 //at91rm9200是ARMV4结构 #define vectors_base() ((cr_alignment & CR_V) ? 0xffff0000 : 0) #else #define vectors_base() (0) #endif 可以看到ARMv4以下的版本,该地址固定为0;ARMv4及以上版本,ARM中断向量表的地址由CP15协处理器c1寄存器中V位 (bit[13])控制,V和中断向量表的对应关系如下: V=0    ~    0x00000000~0x0000001C V=1    ~    0xffff0000~0xffff001C 因此,在中断初始化的时候我们要做的就是在IRQ和FIQ的位置处放置我们的中断处理函数地址或跳转语句跳转到我们的中断处理函数。这个过程是在trap_init中完成的,而它由start_kernel()调用。 arch/arm/kernel/traps.c void __init trap_init(void) { unsigned long vectors = CONFIG_VECTORS_BASE;/*跳转表的存放位置(即上面那表的存放位置)*/ /*这些都在entry-armv.S下定义 *stub vector kuser_helper具体指什...