#include "imxrt.h"
struct PadDesc
{
volatile uint32_t *dr;
volatile uint32_t *gdir;
volatile uint32_t *dr_set;
volatile uint32_t *dr_clear;
volatile uint32_t *mux;
volatile uint32_t *pad;
uint32_t mask;
uint8_t mux_alt;
};
#define PAD_DESC(name, gpio_num, bit_idx, alt) \
static constexpr PadDesc PADDESC_##name = { \
&GPIO##gpio_num##_DR, &GPIO##gpio_num##_GDIR, \
&GPIO##gpio_num##_DR_SET, &GPIO##gpio_num##_DR_CLEAR, \
&IOMUXC_SW_MUX_CTL_PAD_##name, &IOMUXC_SW_PAD_CTL_PAD_##name, \
(1u << (bit_idx)), (alt) \
}
static inline void PinModePadOutput(const PadDesc &p)
{
*p.mux = p.mux_alt;
*p.gdir |= p.mask;
}
static inline void PinModePadInput(const PadDesc &p)
{
*p.mux = p.mux_alt;
*p.gdir &= ~p.mask;
}
static inline void DigitalWritePadFast(const PadDesc &p, bool high)
{
if (high) *p.dr_set = p.mask;
else *p.dr_clear = p.mask;
}
static inline bool DigitalReadPadFast(const PadDesc &p)
{
return (*p.dr & p.mask) != 0;
}
#define _CONCAT(a,b) a##b
#define CONCAT(a,b) _CONCAT(a,b)
#define PINMODE_PAD_OUTPUT(name) PinModePadOutput(CONCAT(PADDESC_, name))
#define PINMODE_PAD_INPUT(name) PinModePadInput(CONCAT(PADDESC_, name))
#define DIGITALWRITE_PAD(name, val) DigitalWritePadFast(CONCAT(PADDESC_, name), (val))
#define DIGITALREAD_PAD(name) DigitalReadPadFast(CONCAT(PADDESC_, name))
PAD_DESC(GPIO_AD_B0_00, 6, 0, 5);
PAD_DESC(GPIO_AD_B0_01, 6, 1, 5);
PAD_DESC(GPIO_AD_B0_02, 6, 2, 5);
PAD_DESC(GPIO_AD_B0_03, 6, 3, 5);
PAD_DESC(GPIO_AD_B0_04, 6, 4, 5);
PAD_DESC(GPIO_AD_B0_05, 6, 5, 5);
PAD_DESC(GPIO_AD_B0_06, 6, 6, 5);
PAD_DESC(GPIO_AD_B0_07, 6, 7, 5);
PAD_DESC(GPIO_AD_B0_08, 6, 8, 5);
PAD_DESC(GPIO_AD_B0_09, 6, 9, 5);
PAD_DESC(GPIO_AD_B0_10, 6, 10, 5);
PAD_DESC(GPIO_AD_B0_11, 6, 11, 5);
PAD_DESC(GPIO_AD_B0_12, 6, 12, 5);
PAD_DESC(GPIO_AD_B0_13, 6, 13, 5);
PAD_DESC(GPIO_AD_B0_14, 6, 14, 5);
PAD_DESC(GPIO_AD_B0_15, 6, 15, 5);
PAD_DESC(GPIO_AD_B1_00, 6, 16, 5);
PAD_DESC(GPIO_AD_B1_01, 6, 17, 5);
PAD_DESC(GPIO_AD_B1_02, 6, 18, 5);
PAD_DESC(GPIO_AD_B1_03, 6, 19, 5);
PAD_DESC(GPIO_AD_B1_04, 6, 20, 5);
PAD_DESC(GPIO_AD_B1_05, 6, 21, 5);
PAD_DESC(GPIO_AD_B1_06, 6, 22, 5);
PAD_DESC(GPIO_AD_B1_07, 6, 23, 5);
PAD_DESC(GPIO_AD_B1_08, 6, 24, 5);
PAD_DESC(GPIO_AD_B1_09, 6, 25, 5);
PAD_DESC(GPIO_AD_B1_10, 6, 26, 5);
PAD_DESC(GPIO_AD_B1_11, 6, 27, 5);
PAD_DESC(GPIO_AD_B1_12, 6, 28, 5);
PAD_DESC(GPIO_AD_B1_13, 6, 29, 5);
PAD_DESC(GPIO_AD_B1_14, 6, 30, 5);
PAD_DESC(GPIO_AD_B1_15, 6, 31, 5);
PAD_DESC(GPIO_B0_00, 7, 0, 5);
PAD_DESC(GPIO_B0_01, 7, 1, 5);
PAD_DESC(GPIO_B0_02, 7, 2, 5);
PAD_DESC(GPIO_B0_03, 7, 3, 5);
PAD_DESC(GPIO_B0_04, 7, 4, 5);
PAD_DESC(GPIO_B0_05, 7, 5, 5);
PAD_DESC(GPIO_B0_06, 7, 6, 5);
PAD_DESC(GPIO_B0_07, 7, 7, 5);
PAD_DESC(GPIO_B0_08, 7, 8, 5);
PAD_DESC(GPIO_B0_09, 7, 9, 5);
PAD_DESC(GPIO_B0_10, 7, 10, 5);
PAD_DESC(GPIO_B0_11, 7, 11, 5);
PAD_DESC(GPIO_B0_12, 7, 12, 5);
PAD_DESC(GPIO_B0_13, 7, 13, 5);
PAD_DESC(GPIO_B0_14, 7, 14, 5);
PAD_DESC(GPIO_B0_15, 7, 15, 5);
PAD_DESC(GPIO_B1_00, 7, 16, 5);
PAD_DESC(GPIO_B1_01, 7, 17, 5);
PAD_DESC(GPIO_B1_02, 7, 18, 5);
PAD_DESC(GPIO_B1_03, 7, 19, 5);
PAD_DESC(GPIO_B1_04, 7, 20, 5);
PAD_DESC(GPIO_B1_05, 7, 21, 5);
PAD_DESC(GPIO_B1_06, 7, 22, 5);
PAD_DESC(GPIO_B1_07, 7, 23, 5);
PAD_DESC(GPIO_B1_08, 7, 24, 5);
PAD_DESC(GPIO_B1_09, 7, 25, 5);
PAD_DESC(GPIO_B1_10, 7, 26, 5);
PAD_DESC(GPIO_B1_11, 7, 27, 5);
PAD_DESC(GPIO_B1_12, 7, 28, 5);
PAD_DESC(GPIO_B1_13, 7, 29, 5);
PAD_DESC(GPIO_B1_14, 7, 30, 5);
PAD_DESC(GPIO_B1_15, 7, 31, 5);
PAD_DESC(GPIO_SD_B0_00, 8, 12, 5);
PAD_DESC(GPIO_SD_B0_01, 8, 13, 5);
PAD_DESC(GPIO_SD_B0_02, 8, 14, 5);
PAD_DESC(GPIO_SD_B0_03, 8, 15, 5);
PAD_DESC(GPIO_SD_B0_04, 8, 16, 5);
PAD_DESC(GPIO_SD_B0_05, 8, 17, 5);
PAD_DESC(GPIO_SD_B1_00, 8, 0, 5);
PAD_DESC(GPIO_SD_B1_01, 8, 1, 5);
PAD_DESC(GPIO_SD_B1_02, 8, 2, 5);
PAD_DESC(GPIO_SD_B1_03, 8, 3, 5);
PAD_DESC(GPIO_SD_B1_04, 8, 4, 5);
PAD_DESC(GPIO_SD_B1_05, 8, 5, 5);
PAD_DESC(GPIO_SD_B1_06, 8, 6, 5);
PAD_DESC(GPIO_SD_B1_07, 8, 7, 5);
PAD_DESC(GPIO_SD_B1_08, 8, 8, 5);
PAD_DESC(GPIO_SD_B1_09, 8, 9, 5);
PAD_DESC(GPIO_SD_B1_10, 8,10, 5);
PAD_DESC(GPIO_SD_B1_11, 8,11, 5);