From 44faaec56008cdb5baa9d15b91eef0f7eed3b2a0 Mon Sep 17 00:00:00 2001 From: kuwoyuki Date: Mon, 9 Dec 2024 02:36:47 +0600 Subject: [PATCH] chore: refactor pinmux --- include/rtl8710bx.h | 37 ++++++++++++++++++------------------- src/main.c | 6 ++---- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/include/rtl8710bx.h b/include/rtl8710bx.h index cd3a410..e881a99 100644 --- a/include/rtl8710bx.h +++ b/include/rtl8710bx.h @@ -386,7 +386,7 @@ typedef struct { __IO uint32_t OSC32K_REG_CTRL0; /* 0x0274 */ __IO uint32_t OSC32K_REG_CTRL1; /* 0x0278 */ __IO uint32_t THERMAL_METER_CTRL; /* 0x027C */ - __IO uint32_t GPIO_PINMUX_CTRL[24]; /* 0x0280-0x02DC */ + __IO uint32_t GPIO_PINMUX_CTRL[24]; /* 0x0280-0x02DC: Pin Multiplexing */ __IO uint32_t PON_PINMUX_CTRL; /* 0x02E0 */ uint32_t RESERVED5[6]; /* 0x02E4-0x02F8 */ __IO uint32_t FW_PPROTECT_KEY_CTRL; /* 0x02FC */ @@ -394,11 +394,6 @@ typedef struct { __IO uint32_t PESOC_SOC_CTRL; /* 0x0304 */ } PERI_ON_TypeDef; -/* Pin Multiplexing */ -typedef struct { - __IO uint32_t PADCTR[21]; /*Pad control register */ -} PINMUX_TypeDef; - /* * AMEBAZ_TIMER Register Declaration * TIM1 have 6 CCR registers: bit[15:0] is CCR, bit[31:24] is CCMR @@ -1129,7 +1124,6 @@ typedef struct { #define NCO1_REG_BASE 0x40000080 #define BACKUP_REG_BASE 0x40000138 #define NCO2_REG_BASE 0x4000026C -#define PINMUX_REG_BASE 0x40000280 #define GPIO_REG_BASE 0x40001000 #define TIMER_REG_BASE 0x40002000 @@ -1171,7 +1165,6 @@ typedef struct { #define SYSTEM_CTRL ((SYSTEM_CTRL_TypeDef *)SYSTEM_CTRL_BASE) #define PERI_ON ((PERI_ON_TypeDef *)PERI_ON_BASE) -#define PINMUX ((PINMUX_TypeDef *)PINMUX_REG_BASE) #define GPIO ((GPIO_TypeDef *)(GPIO_REG_BASE)) #define GPIOA ((GPIO_Port_TypeDef *)(GPIO_REG_BASE + 0x00)) @@ -1616,7 +1609,7 @@ typedef struct { #define PINMUX_FN_SDIO 0x106 // SDIO function #define PINMUX_FN_PWM 0x107 // PWM #define PINMUX_FN_TIMINPUT 0x107 // PWM -#define PINMUX_FN_SWD 0x108 // SWD/JTAG function +#define PINMUX_FN_SWD 0x108 // SWD/JTAG function #define PINMUX_FN_EXT32K 0x108 #define PINMUX_FN_RTCOUT 0x108 #define PINMUX_FN_I2S 0x109 // I2S function @@ -1633,21 +1626,27 @@ typedef struct { #define PAD_DRV_STRENGTH_6 (0x00000006 << 9) #define PAD_DRV_STRENGTH_7 (0x00000007 << 9) -static inline void PINMUX_Config(uint32_t pin, uint32_t func) { - volatile uint32_t *reg = &PERI_ON->GPIO_PINMUX_CTRL[pin >> 1]; - uint32_t shift = (pin & 1) << 4; - uint32_t mask = 0xFFFF << shift; +#define PINMUX_GET_REG_SHIFT(pin, reg, shift) \ + volatile uint32_t *reg = &PERI_ON->GPIO_PINMUX_CTRL[pin >> 1]; \ + uint32_t shift = (pin & 1) << 4 - *reg = (*reg & ~mask) | (func << shift); +static inline void PINMUX_ConfigMasked(uint32_t pin, uint32_t value, + uint32_t mask) { + PINMUX_GET_REG_SHIFT(pin, reg, shift); + *reg = (*reg & ~(mask << shift)) | (value << shift); +} + +static inline void PINMUX_ConfigFn(uint32_t pin, uint32_t func) { + PINMUX_ConfigMasked(pin, func, 0xFFFF); } static inline void PINMUX_ConfigPadPull(uint8_t pin, uint8_t pull_type) { - uint32_t reg_index = pin >> 1; - uint32_t bit_pos = (pin & 1) << 4; - uint32_t mask = 0xC0U << bit_pos; - volatile uint32_t *pad_ctrl = &PINMUX->PADCTR[reg_index]; + PINMUX_ConfigMasked(pin, pull_type, 0xC0U); +} - *pad_ctrl = (*pad_ctrl & ~mask) | (pull_type << bit_pos); +static inline void PINMUX_Config(uint32_t pin, uint32_t func, + uint8_t pull_type) { + PINMUX_ConfigMasked(pin, func | ((uint32_t)pull_type << 6), 0xFFFF); } /* rtl8711b_gpio.h */ diff --git a/src/main.c b/src/main.c index 661ea41..d78611e 100644 --- a/src/main.c +++ b/src/main.c @@ -18,10 +18,8 @@ int main(void) { PERI_ON->SOC_PERI_FUNC1_EN |= BIT_PERI_GPIO_EN; PERI_ON->PESOC_CLK_CTRL |= APBPeriph_GPIO_CLOCK; - PINMUX_Config(_PA_0, PINMUX_FN_GPIO); - PINMUX_Config(_PA_23, PINMUX_FN_GPIO); - PINMUX_ConfigPadPull(_PA_0, GPIO_PuPd_DOWN); - PINMUX_ConfigPadPull(_PA_23, GPIO_PuPd_NOPULL); + PINMUX_Config(_PA_0, PINMUX_FN_GPIO, GPIO_PuPd_DOWN); + PINMUX_Config(_PA_23, PINMUX_FN_GPIO, GPIO_PuPd_NOPULL); GPIOA->DDR |= (1 << 0) | (1 << 23); // GPIOA->DDR |= (1 << 23);