irq.c (858B)
1 /* IRQ Controller */ 2 #include "irq.h" 3 #include "types.h" 4 5 irq 6 irq_new(void) 7 { 8 irq i; 9 i.status = 0; 10 i.mask = 0; 11 return i; 12 } 13 14 void 15 irq_write(irq* i, u32 a, u32 v) 16 { 17 v <<= (a & 3) * 8; 18 19 if(a & 4) 20 i->mask = v; 21 else 22 i->status &= v; 23 } 24 25 u32 26 irq_load(irq* i, u32 a) 27 { 28 u32 ret = 0; 29 30 if (a & 4) 31 ret = i->mask; 32 else 33 ret = i->status; 34 35 ret |= 0x1F800000; 36 ret >>= (a & 3) * 8; 37 38 printf("[IRQ] Read: 0x%08x 0x%08x --- PAD TEMP\n", a, ret); 39 40 return ret; 41 42 } 43 44 void 45 irq_set_register(irq* i, u32 which, u32 v) 46 { 47 switch(which) 48 { 49 case IRQ_STATUS_REG: 50 i->status = v; 51 break; 52 case IRQ_MASK_REG: 53 i->mask = v; 54 break; 55 } 56 } 57 58 u32 59 irq_get_reg(irq* i, u32 which) 60 { 61 switch(which) 62 { 63 case IRQ_STATUS_REG: 64 return i->status; 65 case IRQ_MASK_REG: 66 return i->mask; 67 } 68 69 return 0; 70 }