Skip to content

Commit d865a9c

Browse files
committed
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 05c3775 commit d865a9c

File tree

2 files changed

+30
-27
lines changed

2 files changed

+30
-27
lines changed

drivers/pinctrl/pinctrl_wch_20x_30x_afio.c

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

3635
if (pins->output_high || pins->output_low) {
@@ -69,19 +68,21 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
6968
}
7069
}
7170

72-
pcfr |= remap << bit0;
71+
if (remap != 0) {
72+
RCC->APB2PCENR |= RCC_AFIOEN;
7373

74-
if (pcfr_id == 0) {
75-
AFIO->PCFR1 = pcfr;
76-
} else {
77-
AFIO->PCFR2 = pcfr;
78-
}
79-
80-
if (bit0 == CH32V20X_V30X_PINMUX_USART1_RM) {
81-
pcfr = AFIO->PCFR2;
82-
pcfr |= ((uint32_t)((remap >> 1) & 1)
83-
<< (CH32V20X_V30X_PINMUX_USART1_RM1 & 0x1F));
84-
AFIO->PCFR2 = pcfr;
74+
if (pcfr_id == 0 && bit0 == CH32V20X_V30X_PINMUX_USART1_RM) {
75+
AFIO->PCFR1 |= ((uint32_t)((remap >> 0) & 1)
76+
<< (CH32V20X_V30X_PINMUX_USART1_RM & 0x1F));
77+
AFIO->PCFR2 |= ((uint32_t)((remap >> 1) & 1)
78+
<< (CH32V20X_V30X_PINMUX_USART1_RM1 & 0x1F));
79+
} else {
80+
if (pcfr_id == 0) {
81+
AFIO->PCFR1 |= (uint32_t)remap << bit0;
82+
} else {
83+
AFIO->PCFR2 |= (uint32_t)remap << bit0;
84+
}
85+
}
8586
}
8687
}
8788

drivers/pinctrl/pinctrl_wch_afio.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,8 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
2525
uint8_t bit0 = (pins->config >> CH32V003_PINCTRL_RM_BASE_SHIFT) & 0x1F;
2626
uint8_t remap = (pins->config >> CH32V003_PINCTRL_RM_SHIFT) & 0x3;
2727
GPIO_TypeDef *regs = wch_afio_pinctrl_regs[port];
28-
uint32_t pcfr1 = AFIO->PCFR1;
2928
uint8_t cfg = 0;
3029

31-
if (remap != 0) {
32-
RCC->APB2PCENR |= RCC_AFIOEN;
33-
}
34-
3530
if (pins->output_high || pins->output_low) {
3631
cfg |= (pins->slew_rate + 1);
3732
if (pins->drive_open_drain) {
@@ -63,16 +58,23 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
6358
}
6459
}
6560

66-
if (bit0 == CH32V003_PINMUX_I2C1_RM) {
67-
pcfr1 |= ((remap & 1) << CH32V003_PINMUX_I2C1_RM) |
68-
(((remap >> 1) & 1) << CH32V003_PINMUX_I2C1_RM1);
69-
} else if (bit0 == CH32V003_PINMUX_USART1_RM) {
70-
pcfr1 |= ((remap & 1) << CH32V003_PINMUX_USART1_RM) |
71-
(((remap >> 1) & 1) << CH32V003_PINMUX_USART1_RM1);
72-
} else {
73-
pcfr1 |= remap << bit0;
61+
if (remap != 0) {
62+
RCC->APB2PCENR |= RCC_AFIOEN;
63+
64+
if (bit0 == CH32V003_PINMUX_I2C1_RM) {
65+
AFIO->PCFR1 |= ((uint32_t)((remap >> 0) & 1)
66+
<< CH32V003_PINMUX_I2C1_RM) |
67+
((uint32_t)((remap >> 1) & 1)
68+
<< CH32V003_PINMUX_I2C1_RM1);
69+
} else if (bit0 == CH32V003_PINMUX_USART1_RM) {
70+
AFIO->PCFR1 |= ((uint32_t)((remap >> 0) & 1)
71+
<< CH32V003_PINMUX_USART1_RM) |
72+
((uint32_t)((remap >> 1) & 1)
73+
<< CH32V003_PINMUX_USART1_RM1);
74+
} else {
75+
AFIO->PCFR1 |= (uint32_t)remap << bit0;
76+
}
7477
}
75-
AFIO->PCFR1 = pcfr1;
7678
}
7779

7880
return 0;

0 commit comments

Comments
 (0)