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-08-23 Bernard first version 9*10465441SEvalZero */ 10*10465441SEvalZero 11*10465441SEvalZero #include <rtthread.h> 12*10465441SEvalZero #include "AT91SAM7S.h" 13*10465441SEvalZero 14*10465441SEvalZero #define MAX_HANDLERS 32 15*10465441SEvalZero 16*10465441SEvalZero extern rt_uint32_t rt_interrupt_nest; 17*10465441SEvalZero 18*10465441SEvalZero rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; 19*10465441SEvalZero rt_uint32_t rt_thread_switch_interrupt_flag; 20*10465441SEvalZero 21*10465441SEvalZero /** 22*10465441SEvalZero * @addtogroup AT91SAM7 23*10465441SEvalZero */ 24*10465441SEvalZero /*@{*/ 25*10465441SEvalZero rt_hw_interrupt_handler(int vector)26*10465441SEvalZerovoid rt_hw_interrupt_handler(int vector) 27*10465441SEvalZero { 28*10465441SEvalZero rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); 29*10465441SEvalZero } 30*10465441SEvalZero 31*10465441SEvalZero /** 32*10465441SEvalZero * This function will initialize hardware interrupt 33*10465441SEvalZero */ rt_hw_interrupt_init()34*10465441SEvalZerovoid rt_hw_interrupt_init() 35*10465441SEvalZero { 36*10465441SEvalZero rt_base_t index; 37*10465441SEvalZero 38*10465441SEvalZero for (index = 0; index < MAX_HANDLERS; index ++) 39*10465441SEvalZero { 40*10465441SEvalZero AT91C_AIC_SVR(index) = (rt_uint32_t)rt_hw_interrupt_handler; 41*10465441SEvalZero } 42*10465441SEvalZero 43*10465441SEvalZero /* init interrupt nest, and context in thread sp */ 44*10465441SEvalZero rt_interrupt_nest = 0; 45*10465441SEvalZero rt_interrupt_from_thread = 0; 46*10465441SEvalZero rt_interrupt_to_thread = 0; 47*10465441SEvalZero rt_thread_switch_interrupt_flag = 0; 48*10465441SEvalZero } 49*10465441SEvalZero 50*10465441SEvalZero /** 51*10465441SEvalZero * This function will mask a interrupt. 52*10465441SEvalZero * @param vector the interrupt number 53*10465441SEvalZero */ rt_hw_interrupt_mask(int vector)54*10465441SEvalZerovoid rt_hw_interrupt_mask(int vector) 55*10465441SEvalZero { 56*10465441SEvalZero /* disable interrupt */ 57*10465441SEvalZero AT91C_AIC_IDCR = 1 << vector; 58*10465441SEvalZero 59*10465441SEvalZero /* clear interrupt */ 60*10465441SEvalZero AT91C_AIC_ICCR = 1 << vector; 61*10465441SEvalZero } 62*10465441SEvalZero 63*10465441SEvalZero /** 64*10465441SEvalZero * This function will un-mask a interrupt. 65*10465441SEvalZero * @param vector the interrupt number 66*10465441SEvalZero */ rt_hw_interrupt_umask(int vector)67*10465441SEvalZerovoid rt_hw_interrupt_umask(int vector) 68*10465441SEvalZero { 69*10465441SEvalZero AT91C_AIC_IECR = 1 << vector; 70*10465441SEvalZero } 71*10465441SEvalZero 72*10465441SEvalZero /** 73*10465441SEvalZero * This function will install a interrupt service routine to a interrupt. 74*10465441SEvalZero * @param vector the interrupt number 75*10465441SEvalZero * @param new_handler the interrupt service routine to be installed 76*10465441SEvalZero * @param old_handler the old interrupt service routine 77*10465441SEvalZero */ rt_hw_interrupt_install(int vector,rt_isr_handler_t new_handler,rt_isr_handler_t * old_handler)78*10465441SEvalZerovoid rt_hw_interrupt_install(int vector, rt_isr_handler_t new_handler, rt_isr_handler_t *old_handler) 79*10465441SEvalZero { 80*10465441SEvalZero if(vector >= 0 && vector < MAX_HANDLERS) 81*10465441SEvalZero { 82*10465441SEvalZero if (*old_handler != RT_NULL) *old_handler = (rt_isr_handler_t)AT91C_AIC_SVR(vector); 83*10465441SEvalZero if (new_handler != RT_NULL) AT91C_AIC_SVR(vector) = (rt_uint32_t)new_handler; 84*10465441SEvalZero } 85*10465441SEvalZero } 86*10465441SEvalZero 87*10465441SEvalZero /*@}*/ 88