]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/arm/mach-lpc17xx/libs/hal/hal.c
7f7124116b0bbe2afdcedfb272f14ff51ae07c14
[sysless.git] / arch / arm / mach-lpc17xx / libs / hal / hal.c
1 #include <stdio.h>
2 #include <cpu_def.h>
3 #include <LPC17xx.h>
4
5 #define IRQ_TABLE_SIZE  (16+33)
6
7 __attribute__ ((section(".irqarea")))
8 irq_handler_t *irq_handler_table_start[IRQ_TABLE_SIZE];
9 void *irq_context_table_start[IRQ_TABLE_SIZE];
10
11 void **irq_context_table = irq_context_table_start;
12 irq_handler_t **irq_handler_table = irq_handler_table_start;
13 unsigned int irq_table_size = IRQ_TABLE_SIZE; 
14
15 void disable_irq(unsigned int irqnum)
16 {
17   NVIC_DisableIRQ(irqnum);
18 }
19 void enable_irq(unsigned int irqnum)
20 {
21   NVIC_EnableIRQ(irqnum);
22 }
23
24 int
25 request_irq(unsigned int irqnum, irq_handler_t *handler, unsigned long flags,
26             const char *name, void *context)
27 {
28   unsigned int irqidx=irq_irqnum2irqidx(irqnum);
29   
30   if (irqidx>=irq_table_size) 
31     return -1;
32   
33   disable_irq(irqnum);
34   irq_handler_table[irqidx]=handler;
35   irq_context_table[irqidx]=context;
36   enable_irq(irqnum);
37   
38   return 0;
39 }
40
41 void free_irq(unsigned int irqnum, void *context)
42 {
43   unsigned int irqidx=irq_irqnum2irqidx(irqnum);
44
45   if (irqidx>=irq_table_size) 
46     return;
47   
48   disable_irq(irqnum);
49   irq_handler_table[irqidx]=NULL;
50   irq_context_table[irqidx]=NULL;
51 }