Library to access LPC17xx peripherals. It uses static inline functions, constant propagation and dead code elimination to be as fast as possible.
Dependents: Chua-VGA Wolfram-1D-VGA WolframRnd-1D-VGA Basin-VGA ... more
gpio.h@0:7a91348b4a02, 2011-07-03 (annotated)
- Committer:
- Ivop
- Date:
- Sun Jul 03 17:11:55 2011 +0000
- Revision:
- 0:7a91348b4a02
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ivop | 0:7a91348b4a02 | 1 | /* Copyright (C) 2010, 2011 by Ivo van Poorten <ivop@euronet.nl> |
Ivop | 0:7a91348b4a02 | 2 | * This file is licensed under the terms of the GNU Lesser |
Ivop | 0:7a91348b4a02 | 3 | * General Public License, version 3. |
Ivop | 0:7a91348b4a02 | 4 | */ |
Ivop | 0:7a91348b4a02 | 5 | |
Ivop | 0:7a91348b4a02 | 6 | #ifndef FASTLIB_GPIO_H |
Ivop | 0:7a91348b4a02 | 7 | #define FASTLIB_GPIO_H |
Ivop | 0:7a91348b4a02 | 8 | |
Ivop | 0:7a91348b4a02 | 9 | #include "fastlib/common.h" |
Ivop | 0:7a91348b4a02 | 10 | |
Ivop | 0:7a91348b4a02 | 11 | static inline volatile uint32_t *fl_gpio_get_base(const int port) { |
Ivop | 0:7a91348b4a02 | 12 | switch (port) { |
Ivop | 0:7a91348b4a02 | 13 | case 0: return (volatile uint32_t *) 0x2009c000; |
Ivop | 0:7a91348b4a02 | 14 | case 1: return (volatile uint32_t *) 0x2009c020; |
Ivop | 0:7a91348b4a02 | 15 | case 2: return (volatile uint32_t *) 0x2009c040; |
Ivop | 0:7a91348b4a02 | 16 | case 3: return (volatile uint32_t *) 0x2009c060; |
Ivop | 0:7a91348b4a02 | 17 | case 4: return (volatile uint32_t *) 0x2009c080; |
Ivop | 0:7a91348b4a02 | 18 | default: return (volatile uint32_t *) 0; |
Ivop | 0:7a91348b4a02 | 19 | } |
Ivop | 0:7a91348b4a02 | 20 | } |
Ivop | 0:7a91348b4a02 | 21 | |
Ivop | 0:7a91348b4a02 | 22 | #define FL_GPIO_OVERALL_INT_STATUS ((volatile uint32_t *) 0x40028080) |
Ivop | 0:7a91348b4a02 | 23 | |
Ivop | 0:7a91348b4a02 | 24 | #define FL_GPIO_PORT0_RISE_INT_STATUS ((volatile uint32_t *) 0x40028084) |
Ivop | 0:7a91348b4a02 | 25 | #define FL_GPIO_PORT0_FALL_INT_STATUS ((volatile uint32_t *) 0x40028088) |
Ivop | 0:7a91348b4a02 | 26 | #define FL_GPIO_PORT0_INT_CLEAR ((volatile uint32_t *) 0x4002808C) |
Ivop | 0:7a91348b4a02 | 27 | #define FL_GPIO_PORT0_RISE_INT ((volatile uint32_t *) 0x40028090) |
Ivop | 0:7a91348b4a02 | 28 | #define FL_GPIO_PORT0_FALL_INT ((volatile uint32_t *) 0x40028094) |
Ivop | 0:7a91348b4a02 | 29 | |
Ivop | 0:7a91348b4a02 | 30 | #define FL_GPIO_PORT2_RISE_INT_STATUS ((volatile uint32_t *) 0x400280A4) |
Ivop | 0:7a91348b4a02 | 31 | #define FL_GPIO_PORT2_FALL_INT_STATUS ((volatile uint32_t *) 0x400280A8) |
Ivop | 0:7a91348b4a02 | 32 | #define FL_GPIO_PORT2_INT_CLEAR ((volatile uint32_t *) 0x400280AC) |
Ivop | 0:7a91348b4a02 | 33 | #define FL_GPIO_PORT2_RISE_INT ((volatile uint32_t *) 0x400280B0) |
Ivop | 0:7a91348b4a02 | 34 | #define FL_GPIO_PORT2_FALL_INT ((volatile uint32_t *) 0x400280B4) |
Ivop | 0:7a91348b4a02 | 35 | |
Ivop | 0:7a91348b4a02 | 36 | /* dir: 0=input, 1=output */ |
Ivop | 0:7a91348b4a02 | 37 | static inline void fl_gpio_set_direction(const unsigned port, const unsigned int bitmask, const unsigned dir) { |
Ivop | 0:7a91348b4a02 | 38 | if (dir) *(fl_gpio_get_base(port)) |= bitmask; |
Ivop | 0:7a91348b4a02 | 39 | else *(fl_gpio_get_base(port)) &= ~bitmask; |
Ivop | 0:7a91348b4a02 | 40 | } |
Ivop | 0:7a91348b4a02 | 41 | |
Ivop | 0:7a91348b4a02 | 42 | static inline void fl_gpio_set_value(const unsigned port, const unsigned bitmask) { |
Ivop | 0:7a91348b4a02 | 43 | *(fl_gpio_get_base(port) + 6) = bitmask; |
Ivop | 0:7a91348b4a02 | 44 | } |
Ivop | 0:7a91348b4a02 | 45 | |
Ivop | 0:7a91348b4a02 | 46 | static inline void fl_gpio_clear_value(const unsigned port, const unsigned bitmask) { |
Ivop | 0:7a91348b4a02 | 47 | *(fl_gpio_get_base(port) + 7) = bitmask; |
Ivop | 0:7a91348b4a02 | 48 | } |
Ivop | 0:7a91348b4a02 | 49 | |
Ivop | 0:7a91348b4a02 | 50 | static inline uint32_t fl_gpio_get_value(const unsigned port, const unsigned bitmask) { |
Ivop | 0:7a91348b4a02 | 51 | return *(fl_gpio_get_base(port) + 5); |
Ivop | 0:7a91348b4a02 | 52 | } |
Ivop | 0:7a91348b4a02 | 53 | |
Ivop | 0:7a91348b4a02 | 54 | static inline void fl_gpio_set_mask(const unsigned port, const unsigned bitmask) { |
Ivop | 0:7a91348b4a02 | 55 | *(fl_gpio_get_base(port) + 4) |= bitmask; |
Ivop | 0:7a91348b4a02 | 56 | } |
Ivop | 0:7a91348b4a02 | 57 | |
Ivop | 0:7a91348b4a02 | 58 | static inline void fl_gpio_clear_mask(const unsigned port, const unsigned bitmask) { |
Ivop | 0:7a91348b4a02 | 59 | *(fl_gpio_get_base(port) + 4) &= ~bitmask; |
Ivop | 0:7a91348b4a02 | 60 | } |
Ivop | 0:7a91348b4a02 | 61 | |
Ivop | 0:7a91348b4a02 | 62 | /* interrupts only on port 0 or 2 */ |
Ivop | 0:7a91348b4a02 | 63 | |
Ivop | 0:7a91348b4a02 | 64 | /* return: 0 = none, !0 = at least one */ |
Ivop | 0:7a91348b4a02 | 65 | static inline int fl_gpio_port_interrupt_status(const unsigned port) { |
Ivop | 0:7a91348b4a02 | 66 | return *FL_GPIO_OVERALL_INT_STATUS & (1U<<port); |
Ivop | 0:7a91348b4a02 | 67 | } |
Ivop | 0:7a91348b4a02 | 68 | |
Ivop | 0:7a91348b4a02 | 69 | static inline void fl_gpio_interrupt_enable(const unsigned port, const unsigned bitmask, const unsigned edge) { |
Ivop | 0:7a91348b4a02 | 70 | if (port == 0) { |
Ivop | 0:7a91348b4a02 | 71 | if (edge == FL_RISE) *FL_GPIO_PORT0_RISE_INT |= bitmask; |
Ivop | 0:7a91348b4a02 | 72 | else *FL_GPIO_PORT0_FALL_INT |= bitmask; |
Ivop | 0:7a91348b4a02 | 73 | } else { |
Ivop | 0:7a91348b4a02 | 74 | if (edge == FL_RISE) *FL_GPIO_PORT2_RISE_INT |= bitmask; |
Ivop | 0:7a91348b4a02 | 75 | else *FL_GPIO_PORT2_FALL_INT |= bitmask; |
Ivop | 0:7a91348b4a02 | 76 | } |
Ivop | 0:7a91348b4a02 | 77 | } |
Ivop | 0:7a91348b4a02 | 78 | |
Ivop | 0:7a91348b4a02 | 79 | static inline void fl_gpio_interrupt_disable(const unsigned port, const unsigned bitmask, const unsigned edge) { |
Ivop | 0:7a91348b4a02 | 80 | if (port == 0) { |
Ivop | 0:7a91348b4a02 | 81 | if (edge == FL_RISE) *FL_GPIO_PORT0_RISE_INT &= ~bitmask; |
Ivop | 0:7a91348b4a02 | 82 | else *FL_GPIO_PORT0_FALL_INT &= ~bitmask; |
Ivop | 0:7a91348b4a02 | 83 | } else { |
Ivop | 0:7a91348b4a02 | 84 | if (edge == FL_RISE) *FL_GPIO_PORT2_RISE_INT &= ~bitmask; |
Ivop | 0:7a91348b4a02 | 85 | else *FL_GPIO_PORT2_FALL_INT &= ~bitmask; |
Ivop | 0:7a91348b4a02 | 86 | } |
Ivop | 0:7a91348b4a02 | 87 | } |
Ivop | 0:7a91348b4a02 | 88 | |
Ivop | 0:7a91348b4a02 | 89 | static inline uint32_t fl_gpio_interrupt_status(const unsigned port, const unsigned bitmask, const unsigned edge) { |
Ivop | 0:7a91348b4a02 | 90 | if (port == 0) { |
Ivop | 0:7a91348b4a02 | 91 | if (edge == FL_RISE) return *FL_GPIO_PORT0_RISE_INT_STATUS & bitmask; |
Ivop | 0:7a91348b4a02 | 92 | else return *FL_GPIO_PORT0_FALL_INT_STATUS & bitmask; |
Ivop | 0:7a91348b4a02 | 93 | } else { |
Ivop | 0:7a91348b4a02 | 94 | if (edge == FL_RISE) return *FL_GPIO_PORT2_RISE_INT_STATUS & bitmask; |
Ivop | 0:7a91348b4a02 | 95 | else return *FL_GPIO_PORT2_FALL_INT_STATUS & bitmask; |
Ivop | 0:7a91348b4a02 | 96 | } |
Ivop | 0:7a91348b4a02 | 97 | } |
Ivop | 0:7a91348b4a02 | 98 | |
Ivop | 0:7a91348b4a02 | 99 | static inline void fl_gpio_interrupt_clear(const unsigned port, const unsigned bitmask) { |
Ivop | 0:7a91348b4a02 | 100 | if (port == 0) *FL_GPIO_PORT0_INT_CLEAR = bitmask; |
Ivop | 0:7a91348b4a02 | 101 | else *FL_GPIO_PORT2_INT_CLEAR = bitmask; |
Ivop | 0:7a91348b4a02 | 102 | } |
Ivop | 0:7a91348b4a02 | 103 | |
Ivop | 0:7a91348b4a02 | 104 | #endif |