And Now for something completely Random
What else is new
A few days ago when answering another question, I was suprised that we did not have a T4.x GPIO structure defined in imxrt.h....
So I did a quick and dirty:
Code:
typedef struct {
volatile uint32_t DR; // 00
volatile uint32_t GDIR; // 04
volatile uint32_t PSR; // 08
volatile uint32_t ICR1; // 0C
volatile uint32_t ICR2; // 10
volatile uint32_t IMR; // 14
volatile uint32_t ICR; // 18
volatile uint32_t EDGE_SEL; // 1C
uint32_t UNUSED[25]; // 20 - 83
volatile uint32_t DR_SET; // 84
volatile uint32_t DR_CLEAR; // 88
volatile uint32_t DR_TOGGLE; // 8C
} IMXRT_GPIO_t;
#define IMXRT_GPIO1S (*(IMXRT_GPIO_t *)0x401B8000)
#define IMXRT_GPIO2S (*(IMXRT_GPIO_t *)0x401BC000)
#define IMXRT_GPIO3S (*(IMXRT_GPIO_t *)0x401C0000)
#define IMXRT_GPIO4S (*(IMXRT_GPIO_t *)0x401C4000)
#define IMXRT_GPIO5S (*(IMXRT_GPIO_t *)0x400C0000)
#define IMXRT_GPIO6S (*(IMXRT_GPIO_t *)0x42000000)
#define IMXRT_GPIO7S (*(IMXRT_GPIO_t *)0x42004000)
#define IMXRT_GPIO8S (*(IMXRT_GPIO_t *)0x42008000)
#define IMXRT_GPIO9S (*(IMXRT_GPIO_t *)0x4200C000)
I did a quick and dirty to verify that unused of 25 was correct, plus blink an LED...
Code:
void setup() {
while (!Serial);
Serial.begin(115200);
delay(2);
IMXRT_GPIO_t *pgpio = nullptr;
Serial.println((uint32_t)(&(pgpio->DR_SET)), HEX);
pinMode(13, OUTPUT);
}
void loop() {
IMXRT_GPIO7S.DR_TOGGLE = (1<<3);
delay(250);
}
And my LED is blinking...
Question is, is this something we should do a PR for?
And if So, Should I also go through and change the defines like this:
Code:
#define GPIO2_DR (IMXRT_GPIO2.offset000)
#define GPIO2_GDIR (IMXRT_GPIO2.offset004)
#define GPIO2_PSR (IMXRT_GPIO2.offset008)
#define GPIO2_ICR1 (IMXRT_GPIO2.offset00C)
#define GPIO2_ICR2 (IMXRT_GPIO2.offset010)
#define GPIO2_IMR (IMXRT_GPIO2.offset014)
#define GPIO2_ISR (IMXRT_GPIO2.offset018)
#define GPIO2_EDGE_SEL (IMXRT_GPIO2.offset01C)
#define GPIO2_DR_SET (IMXRT_GPIO2.offset084)
#define GPIO2_DR_CLEAR (IMXRT_GPIO2.offset088)
#define GPIO2_DR_TOGGLE (IMXRT_GPIO2.offset08C)
To more like:
Code:
#define DR (IMXRT_GPIO1.DR)
#define GPIO1_DR (IMXRT_GPIO1.DR)
#define GPIO1_GDIR (IMXRT_GPIO1.GDIR)
#define GPIO1_PSR (IMXRT_GPIO1.PSR)
#define GPIO1_ICR1 (IMXRT_GPIO1.ICR1)
#define GPIO1_ICR2 (IMXRT_GPIO1.ICR2)
#define GPIO1_IMR (IMXRT_GPIO1.IMR)
#define GPIO1_ISR (IMXRT_GPIO1.ISR)
#define GPIO1_EDGE_SEL (IMXRT_GPIO1.EDGE_SEL)
#define GPIO1_DR_SET (IMXRT_GPIO1.DR_SET)
#define GPIO1_DR_CLEAR (IMXRT_GPIO1.DR_CLEAR)
#define GPIO1_DR_TOGGLE (IMXRT_GPIO1.DR_TOGGLE)