Skip to content

Commit 31d65aa

Browse files
recalcikartben
authored andcommitted
drivers: pinctrl: wch_20x_30x_afio: fix afio remap
- Enable AFIO clock prior to remap configuration - Consolidate remap logic in a single conditional block - Correct USART1 remap detection by checking pcfr_id - Apply changes to pinctrl_wch_afio.c Signed-off-by: Jianxiong Gu <jianxiong.gu@outlook.com>
1 parent ed4222e commit 31d65aa

File tree

2 files changed

+30
-23
lines changed

2 files changed

+30
-23
lines changed

drivers/pinctrl/pinctrl_wch_20x_30x_afio.c

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
3333
uint8_t pcfr_id = FIELD_GET(CH32V20X_V30X_PINCTRL_PCFR_ID_MASK, pins->config);
3434
uint8_t remap = FIELD_GET(CH32V20X_V30X_PINCTRL_RM_MASK, pins->config);
3535
GPIO_TypeDef *regs = wch_afio_pinctrl_regs[port];
36-
uint32_t pcfr = pcfr_id == 0 ? AFIO->PCFR1 : AFIO->PCFR2;
3736
uint8_t cfg = 0;
3837

3938
if (pins->output_high || pins->output_low) {
@@ -72,19 +71,21 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
7271
}
7372
}
7473

75-
pcfr |= remap << bit0;
74+
if (remap != 0) {
75+
RCC->APB2PCENR |= RCC_AFIOEN;
7676

77-
if (pcfr_id == 0) {
78-
AFIO->PCFR1 = pcfr;
79-
} else {
80-
AFIO->PCFR2 = pcfr;
81-
}
82-
83-
if (bit0 == CH32V20X_V30X_PINMUX_USART1_RM) {
84-
pcfr = AFIO->PCFR2;
85-
pcfr |= ((uint32_t)((remap >> 1) & 1)
86-
<< (CH32V20X_V30X_PINMUX_USART1_RM1 & 0x1F));
87-
AFIO->PCFR2 = pcfr;
77+
if (pcfr_id == 0 && bit0 == CH32V20X_V30X_PINMUX_USART1_RM) {
78+
AFIO->PCFR1 |= ((uint32_t)((remap >> 0) & 1)
79+
<< (CH32V20X_V30X_PINMUX_USART1_RM & 0x1F));
80+
AFIO->PCFR2 |= ((uint32_t)((remap >> 1) & 1)
81+
<< (CH32V20X_V30X_PINMUX_USART1_RM1 & 0x1F));
82+
} else {
83+
if (pcfr_id == 0) {
84+
AFIO->PCFR1 |= (uint32_t)remap << bit0;
85+
} else {
86+
AFIO->PCFR2 |= (uint32_t)remap << bit0;
87+
}
88+
}
8889
}
8990
}
9091

drivers/pinctrl/pinctrl_wch_afio.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
2828
uint8_t bit0 = (pins->config >> CH32V003_PINCTRL_RM_BASE_SHIFT) & 0x1F;
2929
uint8_t remap = (pins->config >> CH32V003_PINCTRL_RM_SHIFT) & 0x3;
3030
GPIO_TypeDef *regs = wch_afio_pinctrl_regs[port];
31-
uint32_t pcfr1 = AFIO->PCFR1;
3231
uint8_t cfg = 0;
3332

3433
if (pins->output_high || pins->output_low) {
@@ -62,16 +61,23 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
6261
}
6362
}
6463

65-
if (bit0 == CH32V003_PINMUX_I2C1_RM) {
66-
pcfr1 |= ((remap & 1) << CH32V003_PINMUX_I2C1_RM) |
67-
(((remap >> 1) & 1) << CH32V003_PINMUX_I2C1_RM1);
68-
} else if (bit0 == CH32V003_PINMUX_USART1_RM) {
69-
pcfr1 |= ((remap & 1) << CH32V003_PINMUX_USART1_RM) |
70-
(((remap >> 1) & 1) << CH32V003_PINMUX_USART1_RM1);
71-
} else {
72-
pcfr1 |= remap << bit0;
64+
if (remap != 0) {
65+
RCC->APB2PCENR |= RCC_AFIOEN;
66+
67+
if (bit0 == CH32V003_PINMUX_I2C1_RM) {
68+
AFIO->PCFR1 |= ((uint32_t)((remap >> 0) & 1)
69+
<< CH32V003_PINMUX_I2C1_RM) |
70+
((uint32_t)((remap >> 1) & 1)
71+
<< CH32V003_PINMUX_I2C1_RM1);
72+
} else if (bit0 == CH32V003_PINMUX_USART1_RM) {
73+
AFIO->PCFR1 |= ((uint32_t)((remap >> 0) & 1)
74+
<< CH32V003_PINMUX_USART1_RM) |
75+
((uint32_t)((remap >> 1) & 1)
76+
<< CH32V003_PINMUX_USART1_RM1);
77+
} else {
78+
AFIO->PCFR1 |= (uint32_t)remap << bit0;
79+
}
7380
}
74-
AFIO->PCFR1 = pcfr1;
7581
}
7682

7783
return 0;

0 commit comments

Comments
 (0)