xref: /nrf52832-nimble/rt-thread/libcpu/arm/s3c44b0/interrupt.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2006-09-06     XuXinming    first version
9*10465441SEvalZero  * 2006-09-15     Bernard      add interrupt bank 0..3 for more effective
10*10465441SEvalZero  *                             in irq trap
11*10465441SEvalZero  */
12*10465441SEvalZero 
13*10465441SEvalZero #include <rtthread.h>
14*10465441SEvalZero #include "s3c44b0.h"
15*10465441SEvalZero 
16*10465441SEvalZero #define MAX_HANDLERS	26
17*10465441SEvalZero 
18*10465441SEvalZero extern rt_uint32_t rt_interrupt_nest;
19*10465441SEvalZero 
20*10465441SEvalZero /* exception and interrupt handler table */
21*10465441SEvalZero rt_isr_handler_t isr_table[MAX_HANDLERS];
22*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread;
23*10465441SEvalZero rt_uint32_t rt_thread_switch_interrupt_flag;
24*10465441SEvalZero 
25*10465441SEvalZero unsigned char interrupt_bank0[256];
26*10465441SEvalZero unsigned char interrupt_bank1[256];
27*10465441SEvalZero unsigned char interrupt_bank2[256];
28*10465441SEvalZero unsigned char interrupt_bank3[256];
29*10465441SEvalZero 
30*10465441SEvalZero /**
31*10465441SEvalZero  * @addtogroup S3C44B0
32*10465441SEvalZero  */
33*10465441SEvalZero /*@{*/
34*10465441SEvalZero 
rt_hw_interrupt_handle(int vector)35*10465441SEvalZero void rt_hw_interrupt_handle(int vector)
36*10465441SEvalZero {
37*10465441SEvalZero 	rt_kprintf("Unhandled interrupt %d occured!!!\n", vector);
38*10465441SEvalZero }
39*10465441SEvalZero 
40*10465441SEvalZero /**
41*10465441SEvalZero  * This function will initialize hardware interrupt
42*10465441SEvalZero  */
rt_hw_interrupt_init()43*10465441SEvalZero void rt_hw_interrupt_init()
44*10465441SEvalZero {
45*10465441SEvalZero 	register int i;
46*10465441SEvalZero 
47*10465441SEvalZero 	/* all interrupt disabled include global bit */
48*10465441SEvalZero 	INTMSK = 0x07ffffff;
49*10465441SEvalZero 
50*10465441SEvalZero 	/* clear pending register */
51*10465441SEvalZero    	I_ISPC = 0x03ffffff;
52*10465441SEvalZero 
53*10465441SEvalZero 	/* non-vector mode IRQ enable */
54*10465441SEvalZero 	INTCON = 0x5;
55*10465441SEvalZero 
56*10465441SEvalZero 	/* all IRQ mode */
57*10465441SEvalZero 	INTMOD = 0x0;
58*10465441SEvalZero 
59*10465441SEvalZero 	/* init exceptions table */
60*10465441SEvalZero 	for(i=0; i<MAX_HANDLERS; i++)
61*10465441SEvalZero 	{
62*10465441SEvalZero 		isr_table[i] = rt_hw_interrupt_handle;
63*10465441SEvalZero 	}
64*10465441SEvalZero 
65*10465441SEvalZero 	for ( i = 0; i < 256; i++)
66*10465441SEvalZero 	{
67*10465441SEvalZero 		interrupt_bank0[i] = 0;
68*10465441SEvalZero 		interrupt_bank1[i] = 0;
69*10465441SEvalZero 		interrupt_bank2[i] = 0;
70*10465441SEvalZero 		interrupt_bank3[i] = 0;
71*10465441SEvalZero 	}
72*10465441SEvalZero 
73*10465441SEvalZero 	/* setup interrupt bank table */
74*10465441SEvalZero 	interrupt_bank0[1]	= 0;
75*10465441SEvalZero 	interrupt_bank0[2]	= 1;
76*10465441SEvalZero 	interrupt_bank0[4]	= 2;
77*10465441SEvalZero 	interrupt_bank0[8]	= 3;
78*10465441SEvalZero 	interrupt_bank0[16]	= 4;
79*10465441SEvalZero 	interrupt_bank0[32]	= 5;
80*10465441SEvalZero 	interrupt_bank0[64]	= 6;
81*10465441SEvalZero 	interrupt_bank0[128]= 7;
82*10465441SEvalZero 
83*10465441SEvalZero 	interrupt_bank1[1]	= 8;
84*10465441SEvalZero 	interrupt_bank1[2]	= 9;
85*10465441SEvalZero 	interrupt_bank1[4]	= 10;
86*10465441SEvalZero 	interrupt_bank1[8]	= 11;
87*10465441SEvalZero 	interrupt_bank1[16]	= 12;
88*10465441SEvalZero 	interrupt_bank1[32]	= 13;
89*10465441SEvalZero 	interrupt_bank1[64]	= 14;
90*10465441SEvalZero 	interrupt_bank1[128]= 15;
91*10465441SEvalZero 
92*10465441SEvalZero 	interrupt_bank2[1]	= 16;
93*10465441SEvalZero 	interrupt_bank2[2]	= 17;
94*10465441SEvalZero 	interrupt_bank2[4]	= 18;
95*10465441SEvalZero 	interrupt_bank2[8]	= 19;
96*10465441SEvalZero 	interrupt_bank2[16]	= 20;
97*10465441SEvalZero 	interrupt_bank2[32]	= 21;
98*10465441SEvalZero 	interrupt_bank2[64]	= 22;
99*10465441SEvalZero 	interrupt_bank2[128]= 23;
100*10465441SEvalZero 
101*10465441SEvalZero 	interrupt_bank3[1]	= 24;
102*10465441SEvalZero 	interrupt_bank3[2]	= 25;
103*10465441SEvalZero 
104*10465441SEvalZero 	/* init interrupt nest, and context in thread sp */
105*10465441SEvalZero 	rt_interrupt_nest = 0;
106*10465441SEvalZero 	rt_interrupt_from_thread = 0;
107*10465441SEvalZero 	rt_interrupt_to_thread = 0;
108*10465441SEvalZero 	rt_thread_switch_interrupt_flag = 0;
109*10465441SEvalZero }
110*10465441SEvalZero 
111*10465441SEvalZero /**
112*10465441SEvalZero  * This function will mask a interrupt.
113*10465441SEvalZero  * @param vector the interrupt number
114*10465441SEvalZero  */
rt_hw_interrupt_mask(int vector)115*10465441SEvalZero void rt_hw_interrupt_mask(int vector)
116*10465441SEvalZero {
117*10465441SEvalZero 	INTMSK |= 1 << vector;
118*10465441SEvalZero }
119*10465441SEvalZero 
120*10465441SEvalZero /**
121*10465441SEvalZero  * This function will un-mask a interrupt.
122*10465441SEvalZero  * @param vector the interrupt number
123*10465441SEvalZero  */
rt_hw_interrupt_umask(int vector)124*10465441SEvalZero void rt_hw_interrupt_umask(int vector)
125*10465441SEvalZero {
126*10465441SEvalZero 	INTMSK &= ~(1 << vector);
127*10465441SEvalZero }
128*10465441SEvalZero 
129*10465441SEvalZero /**
130*10465441SEvalZero  * This function will install a interrupt service routine to a interrupt.
131*10465441SEvalZero  * @param vector the interrupt number
132*10465441SEvalZero  * @param new_handler the interrupt service routine to be installed
133*10465441SEvalZero  * @param old_handler the old interrupt service routine
134*10465441SEvalZero  */
rt_hw_interrupt_install(int vector,rt_isr_handler_t new_handler,rt_isr_handler_t * old_handler)135*10465441SEvalZero void rt_hw_interrupt_install(int vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler)
136*10465441SEvalZero {
137*10465441SEvalZero 	if(vector < MAX_HANDLERS)
138*10465441SEvalZero 	{
139*10465441SEvalZero 		if (old_handler != RT_NULL) *old_handler = isr_table[vector];
140*10465441SEvalZero 		if (new_handler != RT_NULL) isr_table[vector] = new_handler;
141*10465441SEvalZero 	}
142*10465441SEvalZero }
143*10465441SEvalZero 
144*10465441SEvalZero /*@}*/
145