⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsp_irq_asm.s

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 S
字号:
/* * Cirrus EP7312 Intererrupt handler * * Copyright (c) 2002 by Jay Monkman <jtm@smoothsmoothie.com> *	 * Copyright (c) 2002 by Charlie Steader <charlies@poliac.com> * *  The license and distribution terms for this file may be *  found in the file LICENSE in this distribution or at * *  http://www.rtems.com/license/LICENSE. * * *  $Id: bsp_irq_asm.S,v 1.1.2.1 2003/09/04 18:43:47 joel Exp $*/#define __asm__#include "irq.h"	#define VECTOR_TABLE 0x40	/*  * Function to obtain, execute an IT handler and acknowledge the IT  */	.globl ExecuteITHandlerExecuteITHandler :/* * Look at interrupt status register to determine source. * From source, determine offset into expanded vector table * and load handler address into r0. */  ldr   r1, =0x80000000 /* close to interrupt status/mask registers 1 */  ldr   r2, =0x80001000 /* close to interrupt status/mask registers 2 */  ldr   r3, =0x80002000 /* close to interrupt status/mask registers 3 */  stmdb	  sp!,{r4, r5, r6}/* * INTSR3 */check_dai:  ldr   r4, [r3, #0x240]  ldr   r5, [r3, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */  tst   r6, #0x0001  beq   check_extfiq  ldr	r0, =(VECTOR_TABLE + (4 * 21)) /* load the vector number */  b     get_handler/* * INTSR1 */check_extfiq:  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */  tst   r6, #0x0001  beq   check_bl  ldr	r0, =(VECTOR_TABLE + (4 * 0)) /* load the vector number */  b     get_handlercheck_bl:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0002  beq   check_we  ldr	r0, =(VECTOR_TABLE + (4 * 1)) /* load the vector number */  b     get_handlercheck_we:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0004  beq   check_mc  ldr	r0, =(VECTOR_TABLE + (4 * 2)) /* load the vector number */  b     get_handlercheck_mc:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0008  beq   check_cs  ldr	r0, =(VECTOR_TABLE + (4 * 3)) /* load the vector number */  b     get_handlercheck_cs:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0010  beq   check_e1  ldr	r0, =(VECTOR_TABLE + (4 * 4)) /* load the vector number */  b     get_handlercheck_e1:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0020  beq   check_e2  ldr	r0, =(VECTOR_TABLE + (4 * 5)) /* load the vector number */  b     get_handlercheck_e2:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0040  beq   check_e3  ldr	r0, =(VECTOR_TABLE + (4 * 6)) /* load the vector number */  b     get_handlercheck_e3:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0080  beq   check_tc1  ldr	r0, =(VECTOR_TABLE + (4 * 7)) /* load the vector number */  b     get_handlercheck_tc1:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0100  beq   check_tc2  ldr	r0, =(VECTOR_TABLE + (4 * 8)) /* load the vector number */  b     get_handlercheck_tc2:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0200  beq   check_rtc  ldr	r0, =(VECTOR_TABLE + (4 * 9)) /* load the vector number */  b     get_handlercheck_rtc:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0400  beq   check_tick  ldr	r0, =(VECTOR_TABLE + (4 * 10)) /* load the vector number */  b     get_handlercheck_tick:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0800  beq   check_utx1  ldr	r0, =(VECTOR_TABLE + (4 * 11)) /* load the vector number */  b     get_handlercheck_utx1:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x1000  beq   check_urx1  ldr	r0, =(VECTOR_TABLE + (4 * 12)) /* load the vector number */  b     get_handlercheck_urx1:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x2000  beq   check_ums  ldr	r0, =(VECTOR_TABLE + (4 * 13)) /* load the vector number */  b     get_handlercheck_ums:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x4000  beq   check_sse  ldr	r0, =(VECTOR_TABLE + (4 * 14)) /* load the vector number */  b     get_handlercheck_sse:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r1, #0x240]  ldr   r5, [r1, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x8000  beq   check_kbd  ldr	r0, =(VECTOR_TABLE + (4 * 15)) /* load the vector number */  b     get_handler/* * INTSR2 */check_kbd:  ldr   r4, [r2, #0x240]  ldr   r5, [r2, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */  tst   r6, #0x0001  beq   check_ss2rx  ldr	r0, =(VECTOR_TABLE + (4 * 16)) /* load the vector number */  b     get_handlercheck_ss2rx:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r2, #0x240]  ldr   r5, [r2, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0002  beq   check_ss2tx  ldr	r0, =(VECTOR_TABLE + (4 * 17)) /* load the vector number */  b     get_handlercheck_ss2tx:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r2, #0x240]  ldr   r5, [r2, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x0004  beq   check_utx2  ldr	r0, =(VECTOR_TABLE + (4 * 18)) /* load the vector number */  b     get_handlercheck_utx2:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r2, #0x240]  ldr   r5, [r2, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x1000  beq   check_urx2  ldr	r0, =(VECTOR_TABLE + (4 * 19)) /* load the vector number */  b     get_handlercheck_urx2:#if 0MUST REMEMBER TO UNCOMMENT IF THIS HANDLER MOVES  ldr   r4, [r2, #0x240]  ldr   r5, [r2, #0x280]  and   r6, r4, r5 /* only look at interrupts which are enabled */#endif  tst   r6, #0x2000  beq   IRQ_NoInterrupt  ldr	r0, =(VECTOR_TABLE + (4 * 20)) /* load the vector number */  b     get_handlerget_handler:  ldmia	  sp!,{r4, r5, r6}  ldr	r0, [r0]		/* extract the IT handler @ */  /*   * re-enable interrupts at processor level as the current   * interrupt source is now masked via VEGA logic   *//*  mrs	r1, cpsr  and	r1, r1, #0xFFFFFF3F  msr	cpsr, r1*/  stmdb	  sp!,{lr}  ldr     lr, =IRQ_return         /* prepare the return from handler  */  mov     pc, r0			/* EXECUTE INT HANDLER */IRQ_return:  ldmia sp!,{lr}IRQ_NoInterrupt:  /* return to the "main" interrupt handler */  mov pc, lr

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -