/** @defgroup gpio_defines General Purpose I/O Defines

@brief <b>Defined Constants and Types for the LPC43xx General Purpose I/O</b>

@ingroup LPC43xx_defines

@version 1.0.0

@author @htmlonly &copy; @endhtmlonly 2012 Michael Ossmann <mike@ossmann.com>

@date 10 March 2013

LGPL License Terms @ref lgpl_license
 */
/*
 * This file is part of the libopencm3 project.
 *
 * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
 * Copyright (C) 2012 Michael Ossmann <mike@ossmann.com>
 *
 * This library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef LPC43XX_GPIO_H
#define LPC43XX_GPIO_H

/**@{*/

#include <libopencm3/cm3/common.h>
#include <libopencm3/lpc43xx/memorymap.h>

/* --- Convenience macros -------------------------------------------------- */

/* GPIO port base addresses (for convenience) */
#define GPIO0                           (GPIO_PORT_BASE + 0x2000)
#define GPIO1                           (GPIO_PORT_BASE + 0x2004)
#define GPIO2                           (GPIO_PORT_BASE + 0x2008)
#define GPIO3                           (GPIO_PORT_BASE + 0x200C)
#define GPIO4                           (GPIO_PORT_BASE + 0x2010)
#define GPIO5                           (GPIO_PORT_BASE + 0x2014)
#define GPIO6                           (GPIO_PORT_BASE + 0x2018)
#define GPIO7                           (GPIO_PORT_BASE + 0x201C)

/* GPIO number definitions (for convenience) */
#define GPIOPIN0                        (1 << 0)
#define GPIOPIN1                        (1 << 1)
#define GPIOPIN2                        (1 << 2)
#define GPIOPIN3                        (1 << 3)
#define GPIOPIN4                        (1 << 4)
#define GPIOPIN5                        (1 << 5)
#define GPIOPIN6                        (1 << 6)
#define GPIOPIN7                        (1 << 7)
#define GPIOPIN8                        (1 << 8)
#define GPIOPIN9                        (1 << 9)
#define GPIOPIN10                       (1 << 10)
#define GPIOPIN11                       (1 << 11)
#define GPIOPIN12                       (1 << 12)
#define GPIOPIN13                       (1 << 13)
#define GPIOPIN14                       (1 << 14)
#define GPIOPIN15                       (1 << 15)
#define GPIOPIN16                       (1 << 16)
#define GPIOPIN17                       (1 << 17)
#define GPIOPIN18                       (1 << 18)
#define GPIOPIN19                       (1 << 19)
#define GPIOPIN20                       (1 << 20)
#define GPIOPIN21                       (1 << 21)
#define GPIOPIN22                       (1 << 22)
#define GPIOPIN23                       (1 << 23)
#define GPIOPIN24                       (1 << 24)
#define GPIOPIN25                       (1 << 25)
#define GPIOPIN26                       (1 << 26)
#define GPIOPIN27                       (1 << 27)
#define GPIOPIN28                       (1 << 28)
#define GPIOPIN29                       (1 << 29)
#define GPIOPIN30                       (1 << 30)
#define GPIOPIN31                       (1 << 31)

/* --- GPIO registers ------------------------------------------------------ */

/* GPIO pin interrupts */

/* Pin Interrupt Mode register */
#define GPIO_PIN_INTERRUPT_ISEL         MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x000)

/* Pin interrupt level (rising edge) interrupt enable register */
#define GPIO_PIN_INTERRUPT_IENR         MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x004)

/* Pin interrupt level (rising edge) interrupt set register */
#define GPIO_PIN_INTERRUPT_SIENR        MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x008)

/* Pin interrupt level (rising edge interrupt) clear register */
#define GPIO_PIN_INTERRUPT_CIENR        MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x00C)

/* Pin interrupt active level (falling edge) interrupt enable register */
#define GPIO_PIN_INTERRUPT_IENF         MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x010)

/* Pin interrupt active level (falling edge) interrupt set register */
#define GPIO_PIN_INTERRUPT_SIENF        MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x014)

/* Pin interrupt active level (falling edge) interrupt clear register */
#define GPIO_PIN_INTERRUPT_CIENF        MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x018)

/* Pin interrupt rising edge register */
#define GPIO_PIN_INTERRUPT_RISE         MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x01C)

/* Pin interrupt falling edge register */
#define GPIO_PIN_INTERRUPT_FALL         MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x020)

/* Pin interrupt status register */
#define GPIO_PIN_INTERRUPT_IST          MMIO32(GPIO_PIN_INTERRUPT_BASE + 0x024)

/* GPIO GROUP0 interrupt */

/* GPIO grouped interrupt control register */
#define GPIO_GROUP0_INTERRUPT_CTRL \
			MMIO32(GPIO_GROUP0_INTERRUPT_BASE + 0x000)

/* GPIO grouped interrupt port [0..7] polarity register */
#define GPIO_GROUP0_INTERRUPT_PORT_POL(x) \
			MMIO32(GPIO_GROUP0_INTERRUPT_BASE + 0x020 + ((x)*4))

/* GPIO grouped interrupt port [0..7] enable register */
#define GPIO_GROUP0_INTERRUPT_PORT_ENA(x) \
			MMIO32(GPIO_GROUP0_INTERRUPT_BASE + 0x040 + ((x)*4))

/* GPIO GROUP1 interrupt */

/* GPIO grouped interrupt control register */
#define GPIO_GROUP1_INTERRUPT_CTRL \
			MMIO32(GPIO_GROUP1_INTERRUPT_BASE + 0x000)

/* GPIO grouped interrupt port [0..7] polarity register */
#define GPIO_GROUP1_INTERRUPT_PORT_POL(x) \
			MMIO32(GPIO_GROUP1_INTERRUPT_BASE + 0x020 + ((x)*4))

/* GPIO grouped interrupt port [0..7] enable register */
#define GPIO_GROUP1_INTERRUPT_PORT_ENA(x) \
			MMIO32(GPIO_GROUP1_INTERRUPT_BASE + 0x040 + ((x)*4))

/* Byte pin registers port 0; pins PIO0_0 to PIO0_31 (R/W) */
#define GPIO_B0                         (GPIO_PORT_BASE + 0x0000)
#define GPIO_B1                         (GPIO_PORT_BASE + 0x0001)
#define GPIO_B2                         (GPIO_PORT_BASE + 0x0002)
#define GPIO_B3                         (GPIO_PORT_BASE + 0x0003)
#define GPIO_B4                         (GPIO_PORT_BASE + 0x0004)
#define GPIO_B5                         (GPIO_PORT_BASE + 0x0005)
#define GPIO_B6                         (GPIO_PORT_BASE + 0x0006)
#define GPIO_B7                         (GPIO_PORT_BASE + 0x0007)
#define GPIO_B8                         (GPIO_PORT_BASE + 0x0008)
#define GPIO_B9                         (GPIO_PORT_BASE + 0x0009)
#define GPIO_B10                        (GPIO_PORT_BASE + 0x000A)
#define GPIO_B11                        (GPIO_PORT_BASE + 0x000B)
#define GPIO_B12                        (GPIO_PORT_BASE + 0x000C)
#define GPIO_B13                        (GPIO_PORT_BASE + 0x000D)
#define GPIO_B14                        (GPIO_PORT_BASE + 0x000E)
#define GPIO_B15                        (GPIO_PORT_BASE + 0x000F)
#define GPIO_B16                        (GPIO_PORT_BASE + 0x0010)
#define GPIO_B17                        (GPIO_PORT_BASE + 0x0011)
#define GPIO_B18                        (GPIO_PORT_BASE + 0x0012)
#define GPIO_B19                        (GPIO_PORT_BASE + 0x0013)
#define GPIO_B20                        (GPIO_PORT_BASE + 0x0014)
#define GPIO_B21                        (GPIO_PORT_BASE + 0x0015)
#define GPIO_B22                        (GPIO_PORT_BASE + 0x0016)
#define GPIO_B23                        (GPIO_PORT_BASE + 0x0017)
#define GPIO_B24                        (GPIO_PORT_BASE + 0x0018)
#define GPIO_B25                        (GPIO_PORT_BASE + 0x0019)
#define GPIO_B26                        (GPIO_PORT_BASE + 0x001A)
#define GPIO_B27                        (GPIO_PORT_BASE + 0x001B)
#define GPIO_B28                        (GPIO_PORT_BASE + 0x001C)
#define GPIO_B29                        (GPIO_PORT_BASE + 0x001D)
#define GPIO_B30                        (GPIO_PORT_BASE + 0x001E)
#define GPIO_B31                        (GPIO_PORT_BASE + 0x001F)

/* Byte pin registers port 1 (R/W) */
#define GPIO_B32                        (GPIO_PORT_BASE + 0x0020)
#define GPIO_B33                        (GPIO_PORT_BASE + 0x0021)
#define GPIO_B34                        (GPIO_PORT_BASE + 0x0022)
#define GPIO_B35                        (GPIO_PORT_BASE + 0x0023)
#define GPIO_B36                        (GPIO_PORT_BASE + 0x0024)
#define GPIO_B37                        (GPIO_PORT_BASE + 0x0025)
#define GPIO_B38                        (GPIO_PORT_BASE + 0x0026)
#define GPIO_B39                        (GPIO_PORT_BASE + 0x0027)
#define GPIO_B40                        (GPIO_PORT_BASE + 0x0028)
#define GPIO_B41                        (GPIO_PORT_BASE + 0x0029)
#define GPIO_B42                        (GPIO_PORT_BASE + 0x002A)
#define GPIO_B43                        (GPIO_PORT_BASE + 0x002B)
#define GPIO_B44                        (GPIO_PORT_BASE + 0x002C)
#define GPIO_B45                        (GPIO_PORT_BASE + 0x002D)
#define GPIO_B46                        (GPIO_PORT_BASE + 0x002E)
#define GPIO_B47                        (GPIO_PORT_BASE + 0x002F)
#define GPIO_B48                        (GPIO_PORT_BASE + 0x0030)
#define GPIO_B49                        (GPIO_PORT_BASE + 0x0031)
#define GPIO_B50                        (GPIO_PORT_BASE + 0x0032)
#define GPIO_B51                        (GPIO_PORT_BASE + 0x0033)
#define GPIO_B52                        (GPIO_PORT_BASE + 0x0034)
#define GPIO_B53                        (GPIO_PORT_BASE + 0x0035)
#define GPIO_B54                        (GPIO_PORT_BASE + 0x0036)
#define GPIO_B55                        (GPIO_PORT_BASE + 0x0037)
#define GPIO_B56                        (GPIO_PORT_BASE + 0x0038)
#define GPIO_B57                        (GPIO_PORT_BASE + 0x0039)
#define GPIO_B58                        (GPIO_PORT_BASE + 0x003A)
#define GPIO_B59                        (GPIO_PORT_BASE + 0x003B)
#define GPIO_B60                        (GPIO_PORT_BASE + 0x003C)
#define GPIO_B61                        (GPIO_PORT_BASE + 0x003D)
#define GPIO_B62                        (GPIO_PORT_BASE + 0x003E)
#define GPIO_B63                        (GPIO_PORT_BASE + 0x003F)

/* Byte pin registers port 2 (R/W) */
#define GPIO_B64                        (GPIO_PORT_BASE + 0x0040)
#define GPIO_B65                        (GPIO_PORT_BASE + 0x0041)
#define GPIO_B66                        (GPIO_PORT_BASE + 0x0042)
#define GPIO_B67                        (GPIO_PORT_BASE + 0x0043)
#define GPIO_B68                        (GPIO_PORT_BASE + 0x0044)
#define GPIO_B69                        (GPIO_PORT_BASE + 0x0045)
#define GPIO_B70                        (GPIO_PORT_BASE + 0x0046)
#define GPIO_B71                        (GPIO_PORT_BASE + 0x0047)
#define GPIO_B72                        (GPIO_PORT_BASE + 0x0048)
#define GPIO_B73                        (GPIO_PORT_BASE + 0x0049)
#define GPIO_B74                        (GPIO_PORT_BASE + 0x004A)
#define GPIO_B75                        (GPIO_PORT_BASE + 0x004B)
#define GPIO_B76                        (GPIO_PORT_BASE + 0x004C)
#define GPIO_B77                        (GPIO_PORT_BASE + 0x004D)
#define GPIO_B78                        (GPIO_PORT_BASE + 0x004E)
#define GPIO_B79                        (GPIO_PORT_BASE + 0x004F)
#define GPIO_B80                        (GPIO_PORT_BASE + 0x0050)
#define GPIO_B81                        (GPIO_PORT_BASE + 0x0051)
#define GPIO_B82                        (GPIO_PORT_BASE + 0x0052)
#define GPIO_B83                        (GPIO_PORT_BASE + 0x0053)
#define GPIO_B84                        (GPIO_PORT_BASE + 0x0054)
#define GPIO_B85                        (GPIO_PORT_BASE + 0x0055)
#define GPIO_B86                        (GPIO_PORT_BASE + 0x0056)
#define GPIO_B87                        (GPIO_PORT_BASE + 0x0057)
#define GPIO_B88                        (GPIO_PORT_BASE + 0x0058)
#define GPIO_B89                        (GPIO_PORT_BASE + 0x0059)
#define GPIO_B90                        (GPIO_PORT_BASE + 0x005A)
#define GPIO_B91                        (GPIO_PORT_BASE + 0x005B)
#define GPIO_B92                        (GPIO_PORT_BASE + 0x005C)
#define GPIO_B93                        (GPIO_PORT_BASE + 0x005D)
#define GPIO_B94                        (GPIO_PORT_BASE + 0x005E)
#define GPIO_B95                        (GPIO_PORT_BASE + 0x005F)

/* Byte pin registers port 3 (R/W) */
#define GPIO_B96                        (GPIO_PORT_BASE + 0x0060)
#define GPIO_B97                        (GPIO_PORT_BASE + 0x0061)
#define GPIO_B98                        (GPIO_PORT_BASE + 0x0062)
#define GPIO_B99                        (GPIO_PORT_BASE + 0x0063)
#define GPIO_B100                       (GPIO_PORT_BASE + 0x0064)
#define GPIO_B101                       (GPIO_PORT_BASE + 0x0065)
#define GPIO_B102                       (GPIO_PORT_BASE + 0x0066)
#define GPIO_B103                       (GPIO_PORT_BASE + 0x0067)
#define GPIO_B104                       (GPIO_PORT_BASE + 0x0068)
#define GPIO_B105                       (GPIO_PORT_BASE + 0x0069)
#define GPIO_B106                       (GPIO_PORT_BASE + 0x006A)
#define GPIO_B107                       (GPIO_PORT_BASE + 0x006B)
#define GPIO_B108                       (GPIO_PORT_BASE + 0x006C)
#define GPIO_B109                       (GPIO_PORT_BASE + 0x006D)
#define GPIO_B110                       (GPIO_PORT_BASE + 0x006E)
#define GPIO_B111                       (GPIO_PORT_BASE + 0x006F)
#define GPIO_B112                       (GPIO_PORT_BASE + 0x0070)
#define GPIO_B113                       (GPIO_PORT_BASE + 0x0071)
#define GPIO_B114                       (GPIO_PORT_BASE + 0x0072)
#define GPIO_B115                       (GPIO_PORT_BASE + 0x0073)
#define GPIO_B116                       (GPIO_PORT_BASE + 0x0074)
#define GPIO_B117                       (GPIO_PORT_BASE + 0x0075)
#define GPIO_B118                       (GPIO_PORT_BASE + 0x0076)
#define GPIO_B119                       (GPIO_PORT_BASE + 0x0077)
#define GPIO_B120                       (GPIO_PORT_BASE + 0x0078)
#define GPIO_B121                       (GPIO_PORT_BASE + 0x0079)
#define GPIO_B122                       (GPIO_PORT_BASE + 0x007A)
#define GPIO_B123                       (GPIO_PORT_BASE + 0x007B)
#define GPIO_B124                       (GPIO_PORT_BASE + 0x007C)
#define GPIO_B125                       (GPIO_PORT_BASE + 0x007D)
#define GPIO_B126                       (GPIO_PORT_BASE + 0x007E)
#define GPIO_B127                       (GPIO_PORT_BASE + 0x007F)

/* Byte pin registers port 4 (R/W) */
#define GPIO_B128                       (GPIO_PORT_BASE + 0x0080)
#define GPIO_B129                       (GPIO_PORT_BASE + 0x0081)
#define GPIO_B130                       (GPIO_PORT_BASE + 0x0082)
#define GPIO_B131                       (GPIO_PORT_BASE + 0x0083)
#define GPIO_B132                       (GPIO_PORT_BASE + 0x0084)
#define GPIO_B133                       (GPIO_PORT_BASE + 0x0085)
#define GPIO_B134                       (GPIO_PORT_BASE + 0x0086)
#define GPIO_B135                       (GPIO_PORT_BASE + 0x0087)
#define GPIO_B136                       (GPIO_PORT_BASE + 0x0088)
#define GPIO_B137                       (GPIO_PORT_BASE + 0x0089)
#define GPIO_B138                       (GPIO_PORT_BASE + 0x008A)
#define GPIO_B139                       (GPIO_PORT_BASE + 0x008B)
#define GPIO_B140                       (GPIO_PORT_BASE + 0x008C)
#define GPIO_B141                       (GPIO_PORT_BASE + 0x008D)
#define GPIO_B142                       (GPIO_PORT_BASE + 0x008E)
#define GPIO_B143                       (GPIO_PORT_BASE + 0x008F)
#define GPIO_B144                       (GPIO_PORT_BASE + 0x0090)
#define GPIO_B145                       (GPIO_PORT_BASE + 0x0091)
#define GPIO_B146                       (GPIO_PORT_BASE + 0x0092)
#define GPIO_B147                       (GPIO_PORT_BASE + 0x0093)
#define GPIO_B148                       (GPIO_PORT_BASE + 0x0094)
#define GPIO_B149                       (GPIO_PORT_BASE + 0x0095)
#define GPIO_B150                       (GPIO_PORT_BASE + 0x0096)
#define GPIO_B151                       (GPIO_PORT_BASE + 0x0097)
#define GPIO_B152                       (GPIO_PORT_BASE + 0x0098)
#define GPIO_B153                       (GPIO_PORT_BASE + 0x0099)
#define GPIO_B154                       (GPIO_PORT_BASE + 0x009A)
#define GPIO_B155                       (GPIO_PORT_BASE + 0x009B)
#define GPIO_B156                       (GPIO_PORT_BASE + 0x009C)
#define GPIO_B157                       (GPIO_PORT_BASE + 0x009D)
#define GPIO_B158                       (GPIO_PORT_BASE + 0x009E)
#define GPIO_B159                       (GPIO_PORT_BASE + 0x009F)

/* Byte pin registers port 5 (R/W) */
#define GPIO_B160                       (GPIO_PORT_BASE + 0x00A0)
#define GPIO_B161                       (GPIO_PORT_BASE + 0x00A1)
#define GPIO_B162                       (GPIO_PORT_BASE + 0x00A2)
#define GPIO_B163                       (GPIO_PORT_BASE + 0x00A3)
#define GPIO_B164                       (GPIO_PORT_BASE + 0x00A4)
#define GPIO_B165                       (GPIO_PORT_BASE + 0x00A5)
#define GPIO_B166                       (GPIO_PORT_BASE + 0x00A6)
#define GPIO_B167                       (GPIO_PORT_BASE + 0x00A7)
#define GPIO_B168                       (GPIO_PORT_BASE + 0x00A8)
#define GPIO_B169                       (GPIO_PORT_BASE + 0x00A9)
#define GPIO_B170                       (GPIO_PORT_BASE + 0x00AA)
#define GPIO_B171                       (GPIO_PORT_BASE + 0x00AB)
#define GPIO_B172                       (GPIO_PORT_BASE + 0x00AC)
#define GPIO_B173                       (GPIO_PORT_BASE + 0x00AD)
#define GPIO_B174                       (GPIO_PORT_BASE + 0x00AE)
#define GPIO_B175                       (GPIO_PORT_BASE + 0x00AF)
#define GPIO_B176                       (GPIO_PORT_BASE + 0x00B0)
#define GPIO_B177                       (GPIO_PORT_BASE + 0x00B1)
#define GPIO_B178                       (GPIO_PORT_BASE + 0x00B2)
#define GPIO_B179                       (GPIO_PORT_BASE + 0x00B3)
#define GPIO_B180                       (GPIO_PORT_BASE + 0x00B4)
#define GPIO_B181                       (GPIO_PORT_BASE + 0x00B5)
#define GPIO_B182                       (GPIO_PORT_BASE + 0x00B6)
#define GPIO_B183                       (GPIO_PORT_BASE + 0x00B7)
#define GPIO_B184                       (GPIO_PORT_BASE + 0x00B8)
#define GPIO_B185                       (GPIO_PORT_BASE + 0x00B9)
#define GPIO_B186                       (GPIO_PORT_BASE + 0x00BA)
#define GPIO_B187                       (GPIO_PORT_BASE + 0x00BB)
#define GPIO_B188                       (GPIO_PORT_BASE + 0x00BC)
#define GPIO_B189                       (GPIO_PORT_BASE + 0x00BD)
#define GPIO_B190                       (GPIO_PORT_BASE + 0x00BE)
#define GPIO_B191                       (GPIO_PORT_BASE + 0x00BF)

/* Byte pin registers port 6 (R/W) */
#define GPIO_B192                       (GPIO_PORT_BASE + 0x00C0)
#define GPIO_B193                       (GPIO_PORT_BASE + 0x00C1)
#define GPIO_B194                       (GPIO_PORT_BASE + 0x00C2)
#define GPIO_B195                       (GPIO_PORT_BASE + 0x00C3)
#define GPIO_B196                       (GPIO_PORT_BASE + 0x00C4)
#define GPIO_B197                       (GPIO_PORT_BASE + 0x00C5)
#define GPIO_B198                       (GPIO_PORT_BASE + 0x00C6)
#define GPIO_B199                       (GPIO_PORT_BASE + 0x00C7)
#define GPIO_B200                       (GPIO_PORT_BASE + 0x00C8)
#define GPIO_B201                       (GPIO_PORT_BASE + 0x00C9)
#define GPIO_B202                       (GPIO_PORT_BASE + 0x00CA)
#define GPIO_B203                       (GPIO_PORT_BASE + 0x00CB)
#define GPIO_B204                       (GPIO_PORT_BASE + 0x00CC)
#define GPIO_B205                       (GPIO_PORT_BASE + 0x00CD)
#define GPIO_B206                       (GPIO_PORT_BASE + 0x00CE)
#define GPIO_B207                       (GPIO_PORT_BASE + 0x00CF)
#define GPIO_B208                       (GPIO_PORT_BASE + 0x00D0)
#define GPIO_B209                       (GPIO_PORT_BASE + 0x00D1)
#define GPIO_B210                       (GPIO_PORT_BASE + 0x00D2)
#define GPIO_B211                       (GPIO_PORT_BASE + 0x00D3)
#define GPIO_B212                       (GPIO_PORT_BASE + 0x00D4)
#define GPIO_B213                       (GPIO_PORT_BASE + 0x00D5)
#define GPIO_B214                       (GPIO_PORT_BASE + 0x00D6)
#define GPIO_B215                       (GPIO_PORT_BASE + 0x00D7)
#define GPIO_B216                       (GPIO_PORT_BASE + 0x00D8)
#define GPIO_B217                       (GPIO_PORT_BASE + 0x00D9)
#define GPIO_B218                       (GPIO_PORT_BASE + 0x00DA)
#define GPIO_B219                       (GPIO_PORT_BASE + 0x00DB)
#define GPIO_B220                       (GPIO_PORT_BASE + 0x00DC)
#define GPIO_B221                       (GPIO_PORT_BASE + 0x00DD)
#define GPIO_B222                       (GPIO_PORT_BASE + 0x00DE)
#define GPIO_B223                       (GPIO_PORT_BASE + 0x00DF)

/* Byte pin registers port 7 (R/W) */
#define GPIO_B224                       (GPIO_PORT_BASE + 0x00E0)
#define GPIO_B225                       (GPIO_PORT_BASE + 0x00E1)
#define GPIO_B226                       (GPIO_PORT_BASE + 0x00E2)
#define GPIO_B227                       (GPIO_PORT_BASE + 0x00E3)
#define GPIO_B228                       (GPIO_PORT_BASE + 0x00E4)
#define GPIO_B229                       (GPIO_PORT_BASE + 0x00E5)
#define GPIO_B230                       (GPIO_PORT_BASE + 0x00E6)
#define GPIO_B231                       (GPIO_PORT_BASE + 0x00E7)
#define GPIO_B232                       (GPIO_PORT_BASE + 0x00E8)
#define GPIO_B233                       (GPIO_PORT_BASE + 0x00E9)
#define GPIO_B234                       (GPIO_PORT_BASE + 0x00EA)
#define GPIO_B235                       (GPIO_PORT_BASE + 0x00EB)
#define GPIO_B236                       (GPIO_PORT_BASE + 0x00EC)
#define GPIO_B237                       (GPIO_PORT_BASE + 0x00ED)
#define GPIO_B238                       (GPIO_PORT_BASE + 0x00EE)
#define GPIO_B239                       (GPIO_PORT_BASE + 0x00EF)
#define GPIO_B240                       (GPIO_PORT_BASE + 0x00F0)
#define GPIO_B241                       (GPIO_PORT_BASE + 0x00F1)
#define GPIO_B242                       (GPIO_PORT_BASE + 0x00F2)
#define GPIO_B243                       (GPIO_PORT_BASE + 0x00F3)
#define GPIO_B244                       (GPIO_PORT_BASE + 0x00F4)
#define GPIO_B245                       (GPIO_PORT_BASE + 0x00F5)
#define GPIO_B246                       (GPIO_PORT_BASE + 0x00F6)
#define GPIO_B247                       (GPIO_PORT_BASE + 0x00F7)
#define GPIO_B248                       (GPIO_PORT_BASE + 0x00F8)
#define GPIO_B249                       (GPIO_PORT_BASE + 0x00F9)
#define GPIO_B250                       (GPIO_PORT_BASE + 0x00FA)
#define GPIO_B251                       (GPIO_PORT_BASE + 0x00FB)
#define GPIO_B252                       (GPIO_PORT_BASE + 0x00FC)
#define GPIO_B253                       (GPIO_PORT_BASE + 0x00FD)
#define GPIO_B254                       (GPIO_PORT_BASE + 0x00FE)
#define GPIO_B255                       (GPIO_PORT_BASE + 0x00FF)

/* Word pin registers port 0 (R/W) */
#define GPIO_W0                         (GPIO_PORT_BASE + 0x1000)
#define GPIO_W1                         (GPIO_PORT_BASE + 0x1004)
#define GPIO_W2                         (GPIO_PORT_BASE + 0x1008)
#define GPIO_W3                         (GPIO_PORT_BASE + 0x100C)
#define GPIO_W4                         (GPIO_PORT_BASE + 0x1010)
#define GPIO_W5                         (GPIO_PORT_BASE + 0x1014)
#define GPIO_W6                         (GPIO_PORT_BASE + 0x1018)
#define GPIO_W7                         (GPIO_PORT_BASE + 0x101C)
#define GPIO_W8                         (GPIO_PORT_BASE + 0x1020)
#define GPIO_W9                         (GPIO_PORT_BASE + 0x1024)
#define GPIO_W10                        (GPIO_PORT_BASE + 0x1028)
#define GPIO_W11                        (GPIO_PORT_BASE + 0x102C)
#define GPIO_W12                        (GPIO_PORT_BASE + 0x1030)
#define GPIO_W13                        (GPIO_PORT_BASE + 0x1034)
#define GPIO_W14                        (GPIO_PORT_BASE + 0x1038)
#define GPIO_W15                        (GPIO_PORT_BASE + 0x103C)
#define GPIO_W16                        (GPIO_PORT_BASE + 0x1040)
#define GPIO_W17                        (GPIO_PORT_BASE + 0x1044)
#define GPIO_W18                        (GPIO_PORT_BASE + 0x1048)
#define GPIO_W19                        (GPIO_PORT_BASE + 0x104C)
#define GPIO_W20                        (GPIO_PORT_BASE + 0x1050)
#define GPIO_W21                        (GPIO_PORT_BASE + 0x1054)
#define GPIO_W22                        (GPIO_PORT_BASE + 0x1058)
#define GPIO_W23                        (GPIO_PORT_BASE + 0x105C)
#define GPIO_W24                        (GPIO_PORT_BASE + 0x1060)
#define GPIO_W25                        (GPIO_PORT_BASE + 0x1064)
#define GPIO_W26                        (GPIO_PORT_BASE + 0x1068)
#define GPIO_W27                        (GPIO_PORT_BASE + 0x106C)
#define GPIO_W28                        (GPIO_PORT_BASE + 0x1070)
#define GPIO_W29                        (GPIO_PORT_BASE + 0x1074)
#define GPIO_W30                        (GPIO_PORT_BASE + 0x1078)
#define GPIO_W31                        (GPIO_PORT_BASE + 0x107C)

/* Word pin registers port 1 (R/W) */
#define GPIO_W32                        (GPIO_PORT_BASE + 0x1080)
#define GPIO_W33                        (GPIO_PORT_BASE + 0x1084)
#define GPIO_W34                        (GPIO_PORT_BASE + 0x1088)
#define GPIO_W35                        (GPIO_PORT_BASE + 0x108C)
#define GPIO_W36                        (GPIO_PORT_BASE + 0x1090)
#define GPIO_W37                        (GPIO_PORT_BASE + 0x1094)
#define GPIO_W38                        (GPIO_PORT_BASE + 0x1098)
#define GPIO_W39                        (GPIO_PORT_BASE + 0x109C)
#define GPIO_W40                        (GPIO_PORT_BASE + 0x10A0)
#define GPIO_W41                        (GPIO_PORT_BASE + 0x10A4)
#define GPIO_W42                        (GPIO_PORT_BASE + 0x10A8)
#define GPIO_W43                        (GPIO_PORT_BASE + 0x10AC)
#define GPIO_W44                        (GPIO_PORT_BASE + 0x10B0)
#define GPIO_W45                        (GPIO_PORT_BASE + 0x10B4)
#define GPIO_W46                        (GPIO_PORT_BASE + 0x10B8)
#define GPIO_W47                        (GPIO_PORT_BASE + 0x10BC)
#define GPIO_W48                        (GPIO_PORT_BASE + 0x10C0)
#define GPIO_W49                        (GPIO_PORT_BASE + 0x10C4)
#define GPIO_W50                        (GPIO_PORT_BASE + 0x10C8)
#define GPIO_W51                        (GPIO_PORT_BASE + 0x10CC)
#define GPIO_W52                        (GPIO_PORT_BASE + 0x10D0)
#define GPIO_W53                        (GPIO_PORT_BASE + 0x10D4)
#define GPIO_W54                        (GPIO_PORT_BASE + 0x10D8)
#define GPIO_W55                        (GPIO_PORT_BASE + 0x10DC)
#define GPIO_W56                        (GPIO_PORT_BASE + 0x10E0)
#define GPIO_W57                        (GPIO_PORT_BASE + 0x10E4)
#define GPIO_W58                        (GPIO_PORT_BASE + 0x10E8)
#define GPIO_W59                        (GPIO_PORT_BASE + 0x10EC)
#define GPIO_W60                        (GPIO_PORT_BASE + 0x10F0)
#define GPIO_W61                        (GPIO_PORT_BASE + 0x10F4)
#define GPIO_W62                        (GPIO_PORT_BASE + 0x10F8)
#define GPIO_W63                        (GPIO_PORT_BASE + 0x10FC)

/* Word pin registers port 2 (R/W) */
#define GPIO_W64                        (GPIO_PORT_BASE + 0x1100)
#define GPIO_W65                        (GPIO_PORT_BASE + 0x1104)
#define GPIO_W66                        (GPIO_PORT_BASE + 0x1108)
#define GPIO_W67                        (GPIO_PORT_BASE + 0x110C)
#define GPIO_W68                        (GPIO_PORT_BASE + 0x1110)
#define GPIO_W69                        (GPIO_PORT_BASE + 0x1114)
#define GPIO_W70                        (GPIO_PORT_BASE + 0x1118)
#define GPIO_W71                        (GPIO_PORT_BASE + 0x111C)
#define GPIO_W72                        (GPIO_PORT_BASE + 0x1120)
#define GPIO_W73                        (GPIO_PORT_BASE + 0x1124)
#define GPIO_W74                        (GPIO_PORT_BASE + 0x1128)
#define GPIO_W75                        (GPIO_PORT_BASE + 0x112C)
#define GPIO_W76                        (GPIO_PORT_BASE + 0x1130)
#define GPIO_W77                        (GPIO_PORT_BASE + 0x1134)
#define GPIO_W78                        (GPIO_PORT_BASE + 0x1138)
#define GPIO_W79                        (GPIO_PORT_BASE + 0x113C)
#define GPIO_W80                        (GPIO_PORT_BASE + 0x1140)
#define GPIO_W81                        (GPIO_PORT_BASE + 0x1144)
#define GPIO_W82                        (GPIO_PORT_BASE + 0x1148)
#define GPIO_W83                        (GPIO_PORT_BASE + 0x114C)
#define GPIO_W84                        (GPIO_PORT_BASE + 0x1150)
#define GPIO_W85                        (GPIO_PORT_BASE + 0x1154)
#define GPIO_W86                        (GPIO_PORT_BASE + 0x1158)
#define GPIO_W87                        (GPIO_PORT_BASE + 0x115C)
#define GPIO_W88                        (GPIO_PORT_BASE + 0x1160)
#define GPIO_W89                        (GPIO_PORT_BASE + 0x1164)
#define GPIO_W90                        (GPIO_PORT_BASE + 0x1168)
#define GPIO_W91                        (GPIO_PORT_BASE + 0x116C)
#define GPIO_W92                        (GPIO_PORT_BASE + 0x1170)
#define GPIO_W93                        (GPIO_PORT_BASE + 0x1174)
#define GPIO_W94                        (GPIO_PORT_BASE + 0x1178)
#define GPIO_W95                        (GPIO_PORT_BASE + 0x117C)

/* Word pin registers port 3 (R/W) */
#define GPIO_W96                        (GPIO_PORT_BASE + 0x1180)
#define GPIO_W97                        (GPIO_PORT_BASE + 0x1184)
#define GPIO_W98                        (GPIO_PORT_BASE + 0x1188)
#define GPIO_W99                        (GPIO_PORT_BASE + 0x118C)
#define GPIO_W100                       (GPIO_PORT_BASE + 0x1190)
#define GPIO_W101                       (GPIO_PORT_BASE + 0x1194)
#define GPIO_W102                       (GPIO_PORT_BASE + 0x1198)
#define GPIO_W103                       (GPIO_PORT_BASE + 0x119C)
#define GPIO_W104                       (GPIO_PORT_BASE + 0x11A0)
#define GPIO_W105                       (GPIO_PORT_BASE + 0x11A4)
#define GPIO_W106                       (GPIO_PORT_BASE + 0x11A8)
#define GPIO_W107                       (GPIO_PORT_BASE + 0x11AC)
#define GPIO_W108                       (GPIO_PORT_BASE + 0x11B0)
#define GPIO_W109                       (GPIO_PORT_BASE + 0x11B4)
#define GPIO_W110                       (GPIO_PORT_BASE + 0x11B8)
#define GPIO_W111                       (GPIO_PORT_BASE + 0x11BC)
#define GPIO_W112                       (GPIO_PORT_BASE + 0x11C0)
#define GPIO_W113                       (GPIO_PORT_BASE + 0x11C4)
#define GPIO_W114                       (GPIO_PORT_BASE + 0x11C8)
#define GPIO_W115                       (GPIO_PORT_BASE + 0x11CC)
#define GPIO_W116                       (GPIO_PORT_BASE + 0x11D0)
#define GPIO_W117                       (GPIO_PORT_BASE + 0x11D4)
#define GPIO_W118                       (GPIO_PORT_BASE + 0x11D8)
#define GPIO_W119                       (GPIO_PORT_BASE + 0x11DC)
#define GPIO_W120                       (GPIO_PORT_BASE + 0x11E0)
#define GPIO_W121                       (GPIO_PORT_BASE + 0x11E4)
#define GPIO_W122                       (GPIO_PORT_BASE + 0x11E8)
#define GPIO_W123                       (GPIO_PORT_BASE + 0x11EC)
#define GPIO_W124                       (GPIO_PORT_BASE + 0x11F0)
#define GPIO_W125                       (GPIO_PORT_BASE + 0x11F4)
#define GPIO_W126                       (GPIO_PORT_BASE + 0x11F8)
#define GPIO_W127                       (GPIO_PORT_BASE + 0x11FC)

/* Word pin registers port 4 (R/W) */
#define GPIO_W128                       (GPIO_PORT_BASE + 0x1200)
#define GPIO_W129                       (GPIO_PORT_BASE + 0x1204)
#define GPIO_W130                       (GPIO_PORT_BASE + 0x1208)
#define GPIO_W131                       (GPIO_PORT_BASE + 0x120C)
#define GPIO_W132                       (GPIO_PORT_BASE + 0x1210)
#define GPIO_W133                       (GPIO_PORT_BASE + 0x1214)
#define GPIO_W134                       (GPIO_PORT_BASE + 0x1218)
#define GPIO_W135                       (GPIO_PORT_BASE + 0x121C)
#define GPIO_W136                       (GPIO_PORT_BASE + 0x1220)
#define GPIO_W137                       (GPIO_PORT_BASE + 0x1224)
#define GPIO_W138                       (GPIO_PORT_BASE + 0x1228)
#define GPIO_W139                       (GPIO_PORT_BASE + 0x122C)
#define GPIO_W140                       (GPIO_PORT_BASE + 0x1230)
#define GPIO_W141                       (GPIO_PORT_BASE + 0x1234)
#define GPIO_W142                       (GPIO_PORT_BASE + 0x1238)
#define GPIO_W143                       (GPIO_PORT_BASE + 0x123C)
#define GPIO_W144                       (GPIO_PORT_BASE + 0x1240)
#define GPIO_W145                       (GPIO_PORT_BASE + 0x1244)
#define GPIO_W146                       (GPIO_PORT_BASE + 0x1248)
#define GPIO_W147                       (GPIO_PORT_BASE + 0x124C)
#define GPIO_W148                       (GPIO_PORT_BASE + 0x1250)
#define GPIO_W149                       (GPIO_PORT_BASE + 0x1254)
#define GPIO_W150                       (GPIO_PORT_BASE + 0x1258)
#define GPIO_W151                       (GPIO_PORT_BASE + 0x125C)
#define GPIO_W152                       (GPIO_PORT_BASE + 0x1260)
#define GPIO_W153                       (GPIO_PORT_BASE + 0x1264)
#define GPIO_W154                       (GPIO_PORT_BASE + 0x1268)
#define GPIO_W155                       (GPIO_PORT_BASE + 0x126C)
#define GPIO_W156                       (GPIO_PORT_BASE + 0x1270)
#define GPIO_W157                       (GPIO_PORT_BASE + 0x1274)
#define GPIO_W158                       (GPIO_PORT_BASE + 0x1278)
#define GPIO_W159                       (GPIO_PORT_BASE + 0x127C)

/* Word pin registers port 5 (R/W) */
#define GPIO_W160                       (GPIO_PORT_BASE + 0x1280)
#define GPIO_W161                       (GPIO_PORT_BASE + 0x1284)
#define GPIO_W162                       (GPIO_PORT_BASE + 0x1288)
#define GPIO_W163                       (GPIO_PORT_BASE + 0x128C)
#define GPIO_W164                       (GPIO_PORT_BASE + 0x1290)
#define GPIO_W165                       (GPIO_PORT_BASE + 0x1294)
#define GPIO_W166                       (GPIO_PORT_BASE + 0x1298)
#define GPIO_W167                       (GPIO_PORT_BASE + 0x129C)
#define GPIO_W168                       (GPIO_PORT_BASE + 0x12A0)
#define GPIO_W169                       (GPIO_PORT_BASE + 0x12A4)
#define GPIO_W170                       (GPIO_PORT_BASE + 0x12A8)
#define GPIO_W171                       (GPIO_PORT_BASE + 0x12AC)
#define GPIO_W172                       (GPIO_PORT_BASE + 0x12B0)
#define GPIO_W173                       (GPIO_PORT_BASE + 0x12B4)
#define GPIO_W174                       (GPIO_PORT_BASE + 0x12B8)
#define GPIO_W175                       (GPIO_PORT_BASE + 0x12BC)
#define GPIO_W176                       (GPIO_PORT_BASE + 0x12C0)
#define GPIO_W177                       (GPIO_PORT_BASE + 0x12C4)
#define GPIO_W178                       (GPIO_PORT_BASE + 0x12C8)
#define GPIO_W179                       (GPIO_PORT_BASE + 0x12CC)
#define GPIO_W180                       (GPIO_PORT_BASE + 0x12D0)
#define GPIO_W181                       (GPIO_PORT_BASE + 0x12D4)
#define GPIO_W182                       (GPIO_PORT_BASE + 0x12D8)
#define GPIO_W183                       (GPIO_PORT_BASE + 0x12DC)
#define GPIO_W184                       (GPIO_PORT_BASE + 0x12E0)
#define GPIO_W185                       (GPIO_PORT_BASE + 0x12E4)
#define GPIO_W186                       (GPIO_PORT_BASE + 0x12E8)
#define GPIO_W187                       (GPIO_PORT_BASE + 0x12EC)
#define GPIO_W188                       (GPIO_PORT_BASE + 0x12F0)
#define GPIO_W189                       (GPIO_PORT_BASE + 0x12F4)
#define GPIO_W190                       (GPIO_PORT_BASE + 0x12F8)
#define GPIO_W191                       (GPIO_PORT_BASE + 0x12FC)

/* Word pin registers port 6 (R/W) */
#define GPIO_W192                       (GPIO_PORT_BASE + 0x1300)
#define GPIO_W193                       (GPIO_PORT_BASE + 0x1304)
#define GPIO_W194                       (GPIO_PORT_BASE + 0x1308)
#define GPIO_W195                       (GPIO_PORT_BASE + 0x130C)
#define GPIO_W196                       (GPIO_PORT_BASE + 0x1310)
#define GPIO_W197                       (GPIO_PORT_BASE + 0x1314)
#define GPIO_W198                       (GPIO_PORT_BASE + 0x1318)
#define GPIO_W199                       (GPIO_PORT_BASE + 0x131C)
#define GPIO_W200                       (GPIO_PORT_BASE + 0x1320)
#define GPIO_W201                       (GPIO_PORT_BASE + 0x1324)
#define GPIO_W202                       (GPIO_PORT_BASE + 0x1328)
#define GPIO_W203                       (GPIO_PORT_BASE + 0x132C)
#define GPIO_W204                       (GPIO_PORT_BASE + 0x1330)
#define GPIO_W205                       (GPIO_PORT_BASE + 0x1334)
#define GPIO_W206                       (GPIO_PORT_BASE + 0x1338)
#define GPIO_W207                       (GPIO_PORT_BASE + 0x133C)
#define GPIO_W208                       (GPIO_PORT_BASE + 0x1340)
#define GPIO_W209                       (GPIO_PORT_BASE + 0x1344)
#define GPIO_W210                       (GPIO_PORT_BASE + 0x1348)
#define GPIO_W211                       (GPIO_PORT_BASE + 0x134C)
#define GPIO_W212                       (GPIO_PORT_BASE + 0x1350)
#define GPIO_W213                       (GPIO_PORT_BASE + 0x1354)
#define GPIO_W214                       (GPIO_PORT_BASE + 0x1358)
#define GPIO_W215                       (GPIO_PORT_BASE + 0x135C)
#define GPIO_W216                       (GPIO_PORT_BASE + 0x1360)
#define GPIO_W217                       (GPIO_PORT_BASE + 0x1364)
#define GPIO_W218                       (GPIO_PORT_BASE + 0x1368)
#define GPIO_W219                       (GPIO_PORT_BASE + 0x136C)
#define GPIO_W220                       (GPIO_PORT_BASE + 0x1370)
#define GPIO_W221                       (GPIO_PORT_BASE + 0x1374)
#define GPIO_W222                       (GPIO_PORT_BASE + 0x1378)
#define GPIO_W223                       (GPIO_PORT_BASE + 0x137C)

/* Word pin registers port 7 (R/W) */
#define GPIO_W224                       (GPIO_PORT_BASE + 0x1380)
#define GPIO_W225                       (GPIO_PORT_BASE + 0x1384)
#define GPIO_W226                       (GPIO_PORT_BASE + 0x1388)
#define GPIO_W227                       (GPIO_PORT_BASE + 0x138C)
#define GPIO_W228                       (GPIO_PORT_BASE + 0x1390)
#define GPIO_W229                       (GPIO_PORT_BASE + 0x1394)
#define GPIO_W230                       (GPIO_PORT_BASE + 0x1398)
#define GPIO_W231                       (GPIO_PORT_BASE + 0x139C)
#define GPIO_W232                       (GPIO_PORT_BASE + 0x13A0)
#define GPIO_W233                       (GPIO_PORT_BASE + 0x13A4)
#define GPIO_W234                       (GPIO_PORT_BASE + 0x13A8)
#define GPIO_W235                       (GPIO_PORT_BASE + 0x13AC)
#define GPIO_W236                       (GPIO_PORT_BASE + 0x13B0)
#define GPIO_W237                       (GPIO_PORT_BASE + 0x13B4)
#define GPIO_W238                       (GPIO_PORT_BASE + 0x13B8)
#define GPIO_W239                       (GPIO_PORT_BASE + 0x13BC)
#define GPIO_W240                       (GPIO_PORT_BASE + 0x13C0)
#define GPIO_W241                       (GPIO_PORT_BASE + 0x13C4)
#define GPIO_W242                       (GPIO_PORT_BASE + 0x13C8)
#define GPIO_W243                       (GPIO_PORT_BASE + 0x13CC)
#define GPIO_W244                       (GPIO_PORT_BASE + 0x13D0)
#define GPIO_W245                       (GPIO_PORT_BASE + 0x13D4)
#define GPIO_W246                       (GPIO_PORT_BASE + 0x13D8)
#define GPIO_W247                       (GPIO_PORT_BASE + 0x13DC)
#define GPIO_W248                       (GPIO_PORT_BASE + 0x13E0)
#define GPIO_W249                       (GPIO_PORT_BASE + 0x13E4)
#define GPIO_W250                       (GPIO_PORT_BASE + 0x13E8)
#define GPIO_W251                       (GPIO_PORT_BASE + 0x13EC)
#define GPIO_W252                       (GPIO_PORT_BASE + 0x13F0)
#define GPIO_W253                       (GPIO_PORT_BASE + 0x13F4)
#define GPIO_W254                       (GPIO_PORT_BASE + 0x13F8)
#define GPIO_W255                       (GPIO_PORT_BASE + 0x13FC)

/* GPIO data direction register (GPIOn_DIR) */
#define GPIO_DIR(port)                  MMIO32((port) + 0x00)
#define GPIO0_DIR                       GPIO_DIR(GPIO0)
#define GPIO1_DIR                       GPIO_DIR(GPIO1)
#define GPIO2_DIR                       GPIO_DIR(GPIO2)
#define GPIO3_DIR                       GPIO_DIR(GPIO3)
#define GPIO4_DIR                       GPIO_DIR(GPIO4)
#define GPIO5_DIR                       GPIO_DIR(GPIO5)
#define GPIO6_DIR                       GPIO_DIR(GPIO6)
#define GPIO7_DIR                       GPIO_DIR(GPIO7)

/* GPIO fast mask register (GPIOn_MASK) */
#define GPIO_MASK(port)                 MMIO32((port) + 0x80)
#define GPIO0_MASK                      GPIO_MASK(GPIO0)
#define GPIO1_MASK                      GPIO_MASK(GPIO1)
#define GPIO2_MASK                      GPIO_MASK(GPIO2)
#define GPIO3_MASK                      GPIO_MASK(GPIO3)
#define GPIO4_MASK                      GPIO_MASK(GPIO4)
#define GPIO5_MASK                      GPIO_MASK(GPIO5)
#define GPIO6_MASK                      GPIO_MASK(GPIO6)
#define GPIO7_MASK                      GPIO_MASK(GPIO7)

/* GPIO port pin value register (GPIOn_PIN) */
#define GPIO_PIN(port)                  MMIO32((port) + 0x100)
#define GPIO0_PIN                       GPIO_PIN(GPIO0)
#define GPIO1_PIN                       GPIO_PIN(GPIO1)
#define GPIO2_PIN                       GPIO_PIN(GPIO2)
#define GPIO3_PIN                       GPIO_PIN(GPIO3)
#define GPIO4_PIN                       GPIO_PIN(GPIO4)
#define GPIO5_PIN                       GPIO_PIN(GPIO5)
#define GPIO6_PIN                       GPIO_PIN(GPIO6)
#define GPIO7_PIN                       GPIO_PIN(GPIO7)

/* GPIO port masked pin value register (GPIOn_MPIN) */
#define GPIO_MPIN(port)                 MMIO32((port) + 0x180)
#define GPIO0_MPIN                      GPIO_MPIN(GPIO0)
#define GPIO1_MPIN                      GPIO_MPIN(GPIO1)
#define GPIO2_MPIN                      GPIO_MPIN(GPIO2)
#define GPIO3_MPIN                      GPIO_MPIN(GPIO3)
#define GPIO4_MPIN                      GPIO_MPIN(GPIO4)
#define GPIO5_MPIN                      GPIO_MPIN(GPIO5)
#define GPIO6_MPIN                      GPIO_MPIN(GPIO6)
#define GPIO7_MPIN                      GPIO_MPIN(GPIO7)

/* GPIO port output set register (GPIOn_SET) */
#define GPIO_SET(port)                  MMIO32((port) + 0x200)
#define GPIO0_SET                       GPIO_SET(GPIO0)
#define GPIO1_SET                       GPIO_SET(GPIO1)
#define GPIO2_SET                       GPIO_SET(GPIO2)
#define GPIO3_SET                       GPIO_SET(GPIO3)
#define GPIO4_SET                       GPIO_SET(GPIO4)
#define GPIO5_SET                       GPIO_SET(GPIO5)
#define GPIO6_SET                       GPIO_SET(GPIO6)
#define GPIO7_SET                       GPIO_SET(GPIO7)

/* GPIO port output clear register (GPIOn_CLR) */
#define GPIO_CLR(port)                  MMIO32((port) + 0x280)
#define GPIO0_CLR                       GPIO_CLR(GPIO0)
#define GPIO1_CLR                       GPIO_CLR(GPIO1)
#define GPIO2_CLR                       GPIO_CLR(GPIO2)
#define GPIO3_CLR                       GPIO_CLR(GPIO3)
#define GPIO4_CLR                       GPIO_CLR(GPIO4)
#define GPIO5_CLR                       GPIO_CLR(GPIO5)
#define GPIO6_CLR                       GPIO_CLR(GPIO6)
#define GPIO7_CLR                       GPIO_CLR(GPIO7)

/* GPIO port toggle register (GPIOn_NOT) */
#define GPIO_NOT(port)                  MMIO32((port) + 0x300)
#define GPIO0_NOT                       GPIO_NOT(GPIO0)
#define GPIO1_NOT                       GPIO_NOT(GPIO1)
#define GPIO2_NOT                       GPIO_NOT(GPIO2)
#define GPIO3_NOT                       GPIO_NOT(GPIO3)
#define GPIO4_NOT                       GPIO_NOT(GPIO4)
#define GPIO5_NOT                       GPIO_NOT(GPIO5)
#define GPIO6_NOT                       GPIO_NOT(GPIO6)
#define GPIO7_NOT                       GPIO_NOT(GPIO7)

/* TODO interrupts */

BEGIN_DECLS

void gpio_set(uint32_t gpioport, uint32_t gpios);
void gpio_clear(uint32_t gpioport, uint32_t gpios);
void gpio_toggle(uint32_t gpioport, uint32_t gpios);

END_DECLS

/**@}*/

#endif
