00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00017 #include "sceptre.h"
00018
00019
00028 static void irq_vic_default_handler(void) __irq
00029 {
00030
00031
00032
00033
00034 VICVectAddr = 0;
00035 while (1);
00036 }
00037
00038
00042 void irq_vic_init(void)
00043 {
00044 uint32_t i = 0;
00045 uint32_t *p_vect_addr;
00046 uint32_t *p_vect_cntl;
00047
00048
00049 VICIntEnClr = 0xffffffff;
00050 VICVectAddr = 0;
00051 VICIntSelect = 0;
00052
00053
00054 for (i=0; i<VIC_SIZE; i++)
00055 {
00056 p_vect_addr = (uint32_t *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
00057 p_vect_cntl = (uint32_t *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
00058 *p_vect_addr = 0;
00059 *p_vect_cntl = 0;
00060 }
00061
00062
00063 VICDefVectAddr = (uint32_t)irq_vic_default_handler;
00064 }
00065
00066
00079 bool_t irq_install(uint32_t number, void *p_handler)
00080 {
00081 uint32_t i;
00082 uint32_t *p_vect_addr;
00083 uint32_t *p_vect_cntl;
00084
00085 VICIntEnClr = 1<<number;
00086
00087 for (i=0; i<VIC_SIZE; i++)
00088 {
00089
00090 p_vect_addr = (uint32_t *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
00091 p_vect_cntl = (uint32_t *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
00092 if (*p_vect_addr==(uint32_t)NULL)
00093 {
00094
00095 *p_vect_addr = (uint32_t)p_handler;
00096 *p_vect_cntl = (uint32_t)(IRQ_SLOT_EN | number);
00097 break;
00098 }
00099 }
00100
00101 if (i==VIC_SIZE)
00102 {
00103 return false;
00104 }
00105
00106 VICIntEnable = 1<<number;
00107 return true;
00108 }
00109
00110
00121 bool_t irq_uninstall(uint32_t number)
00122 {
00123 uint32_t i;
00124 uint32_t *p_vect_addr;
00125 uint32_t *p_vect_cntl;
00126
00127 VICIntEnClr = 1<<number;
00128
00129 for (i=0; i<VIC_SIZE; i++)
00130 {
00131
00132 p_vect_addr = (uint32_t *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + i*4);
00133 p_vect_cntl = (uint32_t *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + i*4);
00134 if ((*p_vect_cntl&~IRQ_SLOT_EN)==number)
00135 {
00136
00137 *p_vect_addr = (uint32_t)NULL;
00138 *p_vect_cntl &= ~IRQ_SLOT_EN;
00139 break;
00140 }
00141 }
00142
00143 if (i==VIC_SIZE)
00144 {
00145 return false;
00146 }
00147
00148 VICIntEnable = 1<<number;
00149 return true;
00150 }
00151