瀏覽代碼

Merge pull request #498 from KurtE/IMXRT_GPIO_t

T4.x Create Struct for IMXRT_GPIO
main
Paul Stoffregen 4 年之前
父節點
當前提交
297ff517f7
沒有連結到貢獻者的電子郵件帳戶。
共有 2 個檔案被更改,包括 143 行新增127 行删除
  1. +124
    -108
      teensy4/imxrt.h
  2. +19
    -19
      teensy4/interrupt.c

+ 124
- 108
teensy4/imxrt.h 查看文件

@@ -5330,114 +5330,130 @@ typedef struct {
#define PGC_CPU_SR_PSR ((uint32_t)(1<<0))

// 12.5.1: page 961
#define IMXRT_GPIO1 (*(IMXRT_REGISTER32_t *)0x401B8000)
#define GPIO1_DR (IMXRT_GPIO1.offset000)
#define GPIO1_GDIR (IMXRT_GPIO1.offset004)
#define GPIO1_PSR (IMXRT_GPIO1.offset008)
#define GPIO1_ICR1 (IMXRT_GPIO1.offset00C)
#define GPIO1_ICR2 (IMXRT_GPIO1.offset010)
#define GPIO1_IMR (IMXRT_GPIO1.offset014)
#define GPIO1_ISR (IMXRT_GPIO1.offset018)
#define GPIO1_EDGE_SEL (IMXRT_GPIO1.offset01C)
#define GPIO1_DR_SET (IMXRT_GPIO1.offset084)
#define GPIO1_DR_CLEAR (IMXRT_GPIO1.offset088)
#define GPIO1_DR_TOGGLE (IMXRT_GPIO1.offset08C)
#define IMXRT_GPIO2 (*(IMXRT_REGISTER32_t *)0x401BC000)
#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)
#define IMXRT_GPIO3 (*(IMXRT_REGISTER32_t *)0x401C0000)
#define GPIO3_DR (IMXRT_GPIO3.offset000)
#define GPIO3_GDIR (IMXRT_GPIO3.offset004)
#define GPIO3_PSR (IMXRT_GPIO3.offset008)
#define GPIO3_ICR1 (IMXRT_GPIO3.offset00C)
#define GPIO3_ICR2 (IMXRT_GPIO3.offset010)
#define GPIO3_IMR (IMXRT_GPIO3.offset014)
#define GPIO3_ISR (IMXRT_GPIO3.offset018)
#define GPIO3_EDGE_SEL (IMXRT_GPIO3.offset01C)
#define GPIO3_DR_SET (IMXRT_GPIO3.offset084)
#define GPIO3_DR_CLEAR (IMXRT_GPIO3.offset088)
#define GPIO3_DR_TOGGLE (IMXRT_GPIO3.offset08C)
#define IMXRT_GPIO4 (*(IMXRT_REGISTER32_t *)0x401C4000)
#define GPIO4_DR (IMXRT_GPIO4.offset000)
#define GPIO4_GDIR (IMXRT_GPIO4.offset004)
#define GPIO4_PSR (IMXRT_GPIO4.offset008)
#define GPIO4_ICR1 (IMXRT_GPIO4.offset00C)
#define GPIO4_ICR2 (IMXRT_GPIO4.offset010)
#define GPIO4_IMR (IMXRT_GPIO4.offset014)
#define GPIO4_ISR (IMXRT_GPIO4.offset018)
#define GPIO4_EDGE_SEL (IMXRT_GPIO4.offset01C)
#define GPIO4_DR_SET (IMXRT_GPIO4.offset084)
#define GPIO4_DR_CLEAR (IMXRT_GPIO4.offset088)
#define GPIO4_DR_TOGGLE (IMXRT_GPIO4.offset08C)
#define IMXRT_GPIO5 (*(IMXRT_REGISTER32_t *)0x400C0000)
#define GPIO5_DR (IMXRT_GPIO5.offset000)
#define GPIO5_GDIR (IMXRT_GPIO5.offset004)
#define GPIO5_PSR (IMXRT_GPIO5.offset008)
#define GPIO5_ICR1 (IMXRT_GPIO5.offset00C)
#define GPIO5_ICR2 (IMXRT_GPIO5.offset010)
#define GPIO5_IMR (IMXRT_GPIO5.offset014)
#define GPIO5_ISR (IMXRT_GPIO5.offset018)
#define GPIO5_EDGE_SEL (IMXRT_GPIO5.offset01C)
#define GPIO5_DR_SET (IMXRT_GPIO5.offset084)
#define GPIO5_DR_CLEAR (IMXRT_GPIO5.offset088)
#define GPIO5_DR_TOGGLE (IMXRT_GPIO5.offset08C)
#define IMXRT_GPIO6 (*(IMXRT_REGISTER32_t *)0x42000000)
#define GPIO6_DR (IMXRT_GPIO6.offset000)
#define GPIO6_GDIR (IMXRT_GPIO6.offset004)
#define GPIO6_PSR (IMXRT_GPIO6.offset008)
#define GPIO6_ICR1 (IMXRT_GPIO6.offset00C)
#define GPIO6_ICR2 (IMXRT_GPIO6.offset010)
#define GPIO6_IMR (IMXRT_GPIO6.offset014)
#define GPIO6_ISR (IMXRT_GPIO6.offset018)
#define GPIO6_EDGE_SEL (IMXRT_GPIO6.offset01C)
#define GPIO6_DR_SET (IMXRT_GPIO6.offset084)
#define GPIO6_DR_CLEAR (IMXRT_GPIO6.offset088)
#define GPIO6_DR_TOGGLE (IMXRT_GPIO6.offset08C)
#define IMXRT_GPIO7 (*(IMXRT_REGISTER32_t *)0x42004000)
#define GPIO7_DR (IMXRT_GPIO7.offset000)
#define GPIO7_GDIR (IMXRT_GPIO7.offset004)
#define GPIO7_PSR (IMXRT_GPIO7.offset008)
#define GPIO7_ICR1 (IMXRT_GPIO7.offset00C)
#define GPIO7_ICR2 (IMXRT_GPIO7.offset010)
#define GPIO7_IMR (IMXRT_GPIO7.offset014)
#define GPIO7_ISR (IMXRT_GPIO7.offset018)
#define GPIO7_EDGE_SEL (IMXRT_GPIO7.offset01C)
#define GPIO7_DR_SET (IMXRT_GPIO7.offset084)
#define GPIO7_DR_CLEAR (IMXRT_GPIO7.offset088)
#define GPIO7_DR_TOGGLE (IMXRT_GPIO7.offset08C)
#define IMXRT_GPIO8 (*(IMXRT_REGISTER32_t *)0x42008000)
#define GPIO8_DR (IMXRT_GPIO8.offset000)
#define GPIO8_GDIR (IMXRT_GPIO8.offset004)
#define GPIO8_PSR (IMXRT_GPIO8.offset008)
#define GPIO8_ICR1 (IMXRT_GPIO8.offset00C)
#define GPIO8_ICR2 (IMXRT_GPIO8.offset010)
#define GPIO8_IMR (IMXRT_GPIO8.offset014)
#define GPIO8_ISR (IMXRT_GPIO8.offset018)
#define GPIO8_EDGE_SEL (IMXRT_GPIO8.offset01C)
#define GPIO8_DR_SET (IMXRT_GPIO8.offset084)
#define GPIO8_DR_CLEAR (IMXRT_GPIO8.offset088)
#define GPIO8_DR_TOGGLE (IMXRT_GPIO8.offset08C)
#define IMXRT_GPIO9 (*(IMXRT_REGISTER32_t *)0x4200C000)
#define GPIO9_DR (IMXRT_GPIO9.offset000)
#define GPIO9_GDIR (IMXRT_GPIO9.offset004)
#define GPIO9_PSR (IMXRT_GPIO9.offset008)
#define GPIO9_ICR1 (IMXRT_GPIO9.offset00C)
#define GPIO9_ICR2 (IMXRT_GPIO9.offset010)
#define GPIO9_IMR (IMXRT_GPIO9.offset014)
#define GPIO9_ISR (IMXRT_GPIO9.offset018)
#define GPIO9_EDGE_SEL (IMXRT_GPIO9.offset01C)
#define GPIO9_DR_SET (IMXRT_GPIO9.offset084)
#define GPIO9_DR_CLEAR (IMXRT_GPIO9.offset088)
#define GPIO9_DR_TOGGLE (IMXRT_GPIO9.offset08C)
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_GPIO1 (*(IMXRT_GPIO_t *)0x401B8000)
#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)
#define IMXRT_GPIO2 (*(IMXRT_GPIO_t *)0x401BC000)
#define GPIO2_DR (IMXRT_GPIO2.DR)
#define GPIO2_GDIR (IMXRT_GPIO2.GDIR)
#define GPIO2_PSR (IMXRT_GPIO2.PSR)
#define GPIO2_ICR1 (IMXRT_GPIO2.ICR1)
#define GPIO2_ICR2 (IMXRT_GPIO2.ICR2)
#define GPIO2_IMR (IMXRT_GPIO2.IMR)
#define GPIO2_ISR (IMXRT_GPIO2.ISR)
#define GPIO2_EDGE_SEL (IMXRT_GPIO2.EDGE_SEL)
#define GPIO2_DR_SET (IMXRT_GPIO2.DR_SET)
#define GPIO2_DR_CLEAR (IMXRT_GPIO2.DR_CLEAR)
#define GPIO2_DR_TOGGLE (IMXRT_GPIO2.DR_TOGGLE)
#define IMXRT_GPIO3 (*(IMXRT_GPIO_t *)0x401C0000)
#define GPIO3_DR (IMXRT_GPIO3.DR)
#define GPIO3_GDIR (IMXRT_GPIO3.GDIR)
#define GPIO3_PSR (IMXRT_GPIO3.PSR)
#define GPIO3_ICR1 (IMXRT_GPIO3.ICR1)
#define GPIO3_ICR2 (IMXRT_GPIO3.ICR2)
#define GPIO3_IMR (IMXRT_GPIO3.IMR)
#define GPIO3_ISR (IMXRT_GPIO3.ISR)
#define GPIO3_EDGE_SEL (IMXRT_GPIO3.EDGE_SEL)
#define GPIO3_DR_SET (IMXRT_GPIO3.DR_SET)
#define GPIO3_DR_CLEAR (IMXRT_GPIO3.DR_CLEAR)
#define GPIO3_DR_TOGGLE (IMXRT_GPIO3.DR_TOGGLE)
#define IMXRT_GPIO4 (*(IMXRT_GPIO_t *)0x401C4000)
#define GPIO4_DR (IMXRT_GPIO4.DR)
#define GPIO4_GDIR (IMXRT_GPIO4.GDIR)
#define GPIO4_PSR (IMXRT_GPIO4.PSR)
#define GPIO4_ICR1 (IMXRT_GPIO4.ICR1)
#define GPIO4_ICR2 (IMXRT_GPIO4.ICR2)
#define GPIO4_IMR (IMXRT_GPIO4.IMR)
#define GPIO4_ISR (IMXRT_GPIO4.ISR)
#define GPIO4_EDGE_SEL (IMXRT_GPIO4.EDGE_SEL)
#define GPIO4_DR_SET (IMXRT_GPIO4.DR_SET)
#define GPIO4_DR_CLEAR (IMXRT_GPIO4.DR_CLEAR)
#define GPIO4_DR_TOGGLE (IMXRT_GPIO4.DR_TOGGLE)
#define IMXRT_GPIO5 (*(IMXRT_GPIO_t *)0x400C0000)
#define GPIO5_DR (IMXRT_GPIO5.DR)
#define GPIO5_GDIR (IMXRT_GPIO5.GDIR)
#define GPIO5_PSR (IMXRT_GPIO5.PSR)
#define GPIO5_ICR1 (IMXRT_GPIO5.ICR1)
#define GPIO5_ICR2 (IMXRT_GPIO5.ICR2)
#define GPIO5_IMR (IMXRT_GPIO5.IMR)
#define GPIO5_ISR (IMXRT_GPIO5.ISR)
#define GPIO5_EDGE_SEL (IMXRT_GPIO5.EDGE_SEL)
#define GPIO5_DR_SET (IMXRT_GPIO5.DR_SET)
#define GPIO5_DR_CLEAR (IMXRT_GPIO5.DR_CLEAR)
#define GPIO5_DR_TOGGLE (IMXRT_GPIO5.DR_TOGGLE)
#define IMXRT_GPIO6 (*(IMXRT_GPIO_t *)0x42000000)
#define GPIO6_DR (IMXRT_GPIO6.DR)
#define GPIO6_GDIR (IMXRT_GPIO6.GDIR)
#define GPIO6_PSR (IMXRT_GPIO6.PSR)
#define GPIO6_ICR1 (IMXRT_GPIO6.ICR1)
#define GPIO6_ICR2 (IMXRT_GPIO6.ICR2)
#define GPIO6_IMR (IMXRT_GPIO6.IMR)
#define GPIO6_ISR (IMXRT_GPIO6.ISR)
#define GPIO6_EDGE_SEL (IMXRT_GPIO6.EDGE_SEL)
#define GPIO6_DR_SET (IMXRT_GPIO6.DR_SET)
#define GPIO6_DR_CLEAR (IMXRT_GPIO6.DR_CLEAR)
#define GPIO6_DR_TOGGLE (IMXRT_GPIO6.DR_TOGGLE)
#define IMXRT_GPIO7 (*(IMXRT_GPIO_t *)0x42004000)
#define GPIO7_DR (IMXRT_GPIO7.DR)
#define GPIO7_GDIR (IMXRT_GPIO7.GDIR)
#define GPIO7_PSR (IMXRT_GPIO7.PSR)
#define GPIO7_ICR1 (IMXRT_GPIO7.ICR1)
#define GPIO7_ICR2 (IMXRT_GPIO7.ICR2)
#define GPIO7_IMR (IMXRT_GPIO7.IMR)
#define GPIO7_ISR (IMXRT_GPIO7.ISR)
#define GPIO7_EDGE_SEL (IMXRT_GPIO7.EDGE_SEL)
#define GPIO7_DR_SET (IMXRT_GPIO7.DR_SET)
#define GPIO7_DR_CLEAR (IMXRT_GPIO7.DR_CLEAR)
#define GPIO7_DR_TOGGLE (IMXRT_GPIO7.DR_TOGGLE)
#define IMXRT_GPIO8 (*(IMXRT_GPIO_t *)0x42008000)
#define GPIO8_DR (IMXRT_GPIO8.DR)
#define GPIO8_GDIR (IMXRT_GPIO8.GDIR)
#define GPIO8_PSR (IMXRT_GPIO8.PSR)
#define GPIO8_ICR1 (IMXRT_GPIO8.ICR1)
#define GPIO8_ICR2 (IMXRT_GPIO8.ICR2)
#define GPIO8_IMR (IMXRT_GPIO8.IMR)
#define GPIO8_ISR (IMXRT_GPIO8.ISR)
#define GPIO8_EDGE_SEL (IMXRT_GPIO8.EDGE_SEL)
#define GPIO8_DR_SET (IMXRT_GPIO8.DR_SET)
#define GPIO8_DR_CLEAR (IMXRT_GPIO8.DR_CLEAR)
#define GPIO8_DR_TOGGLE (IMXRT_GPIO8.DR_TOGGLE)
#define IMXRT_GPIO9 (*(IMXRT_GPIO_t *)0x4200C000)
#define GPIO9_DR (IMXRT_GPIO9.DR)
#define GPIO9_GDIR (IMXRT_GPIO9.GDIR)
#define GPIO9_PSR (IMXRT_GPIO9.PSR)
#define GPIO9_ICR1 (IMXRT_GPIO9.ICR1)
#define GPIO9_ICR2 (IMXRT_GPIO9.ICR2)
#define GPIO9_IMR (IMXRT_GPIO9.IMR)
#define GPIO9_ISR (IMXRT_GPIO9.ISR)
#define GPIO9_EDGE_SEL (IMXRT_GPIO9.EDGE_SEL)
#define GPIO9_DR_SET (IMXRT_GPIO9.DR_SET)
#define GPIO9_DR_CLEAR (IMXRT_GPIO9.DR_CLEAR)
#define GPIO9_DR_TOGGLE (IMXRT_GPIO9.DR_TOGGLE)

// 52.7: page 2957
#define IMXRT_GPT1 (*(IMXRT_REGISTER32_t *)0x401EC000)

+ 19
- 19
teensy4/interrupt.c 查看文件

@@ -2,14 +2,14 @@
#include "pins_arduino.h"
#include "debug/printf.h"

#define DR 0
#define GDIR 1
#define PSR 2
#define ICR1 3
#define ICR2 4
#define IMR 5
#define ISR 6
#define EDGE 7
#define DR_INDEX 0
#define GDIR_INDEX 1
#define PSR_INDEX 2
#define ICR1_INDEX 3
#define ICR2_INDEX 4
#define IMR_INDEX 5
#define ISR_INDEX 6
#define EDGE_INDEX 7

static void dummy_isr() {};
typedef void (*voidFuncPtr)(void);
@@ -31,9 +31,9 @@ voidFuncPtr isr_table_gpio4[CORE_MAX_PIN_PORT4+1] = { [0 ... CORE_MAX_PIN_PORT4]
FASTRUN static inline __attribute__((always_inline))
inline void irq_anyport(volatile uint32_t *gpio, voidFuncPtr *table)
{
uint32_t status = gpio[ISR] & gpio[IMR];
uint32_t status = gpio[ISR_INDEX] & gpio[IMR_INDEX];
if (status) {
gpio[ISR] = status;
gpio[ISR_INDEX] = status;
while (status) {
uint32_t index = __builtin_ctz(status);
table[index]();
@@ -100,25 +100,25 @@ void attachInterrupt(uint8_t pin, void (*function)(void), int mode)
}

// TODO: global interrupt disable to protect these read-modify-write accesses?
gpio[IMR] &= ~mask; // disable interrupt
gpio[IMR_INDEX] &= ~mask; // disable interrupt
*mux = 5; // pin is GPIO
gpio[GDIR] &= ~mask; // pin to input mode
gpio[GDIR_INDEX] &= ~mask; // pin to input mode
uint32_t index = __builtin_ctz(mask);
table[index] = function;
if (mode == CHANGE) {
gpio[EDGE] |= mask;
gpio[EDGE_INDEX] |= mask;
} else {
gpio[EDGE] &= ~mask;
gpio[EDGE_INDEX] &= ~mask;
if (index < 15) {
uint32_t shift = index * 2;
gpio[ICR1] = (gpio[ICR1] & ~(3 << shift)) | (icr << shift);
gpio[ICR1_INDEX] = (gpio[ICR1_INDEX] & ~(3 << shift)) | (icr << shift);
} else {
uint32_t shift = (index - 16) * 2;
gpio[ICR2] = (gpio[ICR2] & ~(3 << shift)) | (icr << shift);
gpio[ICR2_INDEX] = (gpio[ICR2_INDEX] & ~(3 << shift)) | (icr << shift);
}
}
gpio[ISR] = mask; // clear any prior pending interrupt
gpio[IMR] |= mask; // enable interrupt
gpio[ISR_INDEX] = mask; // clear any prior pending interrupt
gpio[IMR_INDEX] |= mask; // enable interrupt
}

void detachInterrupt(uint8_t pin)
@@ -126,5 +126,5 @@ void detachInterrupt(uint8_t pin)
if (pin >= CORE_NUM_DIGITAL) return;
volatile uint32_t *gpio = portOutputRegister(pin);
uint32_t mask = digitalPinToBitMask(pin);
gpio[IMR] &= ~mask;
gpio[IMR_INDEX] &= ~mask;
}

Loading…
取消
儲存