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

Committer:
Ivop
Date:
Sun Jul 03 17:11:55 2011 +0000
Revision:
0:7a91348b4a02

        

Who changed what in which revision?

UserRevisionLine numberNew 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