Changeset 00287cc in mainline for kernel/arch/arm32/src/interrupt.c
- Timestamp:
- 2009-03-12T23:26:32Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 648c9d9
- Parents:
- 3b122e9
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/src/interrupt.c
r3b122e9 r00287cc 36 36 #include <arch/asm.h> 37 37 #include <arch/regutils.h> 38 #include <arch/drivers/gxemul.h> 38 39 #include <ddi/irq.h> 39 #include < arch/machine.h>40 #include <ddi/device.h> 40 41 #include <interrupt.h> 41 42 42 43 /** Initial size of a table holding interrupt handlers. */ 43 44 #define IRQ_COUNT 8 45 46 static irq_t gxemul_timer_irq; 44 47 45 48 /** Disable interrupts. … … 50 53 { 51 54 ipl_t ipl = current_status_reg_read(); 52 55 53 56 current_status_reg_control_write(STATUS_REG_IRQ_DISABLED_BIT | ipl); 54 57 … … 63 66 { 64 67 ipl_t ipl = current_status_reg_read(); 65 68 66 69 current_status_reg_control_write(ipl & ~STATUS_REG_IRQ_DISABLED_BIT); 67 70 68 71 return ipl; 69 72 } … … 89 92 } 90 93 94 /** Starts gxemul Real Time Clock device, which asserts regular interrupts. 95 * 96 * @param frequency Interrupts frequency (0 disables RTC). 97 */ 98 static void gxemul_timer_start(uint32_t frequency) 99 { 100 *((uint32_t *) (gxemul_rtc + GXEMUL_RTC_FREQ_OFFSET)) 101 = frequency; 102 } 103 104 static irq_ownership_t gxemul_timer_claim(irq_t *irq) 105 { 106 return IRQ_ACCEPT; 107 } 108 109 /** Timer interrupt handler. 110 * 111 * @param irq Interrupt information. 112 * @param arg Not used. 113 */ 114 static void gxemul_timer_irq_handler(irq_t *irq) 115 { 116 /* 117 * We are holding a lock which prevents preemption. 118 * Release the lock, call clock() and reacquire the lock again. 119 */ 120 spinlock_unlock(&irq->lock); 121 clock(); 122 spinlock_lock(&irq->lock); 123 124 /* acknowledge tick */ 125 *((uint32_t *) (gxemul_rtc + GXEMUL_RTC_ACK_OFFSET)) 126 = 0; 127 } 128 91 129 /** Initialize basic tables for exception dispatching 92 130 * and starts the timer. … … 95 133 { 96 134 irq_init(IRQ_COUNT, IRQ_COUNT); 97 machine_timer_irq_start(); 135 136 irq_initialize(&gxemul_timer_irq); 137 gxemul_timer_irq.devno = device_assign_devno(); 138 gxemul_timer_irq.inr = GXEMUL_TIMER_IRQ; 139 gxemul_timer_irq.claim = gxemul_timer_claim; 140 gxemul_timer_irq.handler = gxemul_timer_irq_handler; 141 142 irq_register(&gxemul_timer_irq); 143 144 gxemul_timer_start(GXEMUL_TIMER_FREQ); 98 145 } 99 146
Note:
See TracChangeset
for help on using the changeset viewer.