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*10465441SEvalZerovoid 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*10465441SEvalZerovoid 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*10465441SEvalZerovoid 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*10465441SEvalZerovoid 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*10465441SEvalZerovoid 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