Skip to content

Commit d1e3192

Browse files
committed
[Nuvoton] Free up peripheral pins in peripheral free-up HAL API
Without free-up of peripheral pins, peripheral pins of the same peripheral may share by multiple ports after port iteration, and this peripheral may fail with pin interference.
1 parent ef7b41b commit d1e3192

37 files changed

+402
-88
lines changed

targets/TARGET_NUVOTON/TARGET_M2351/analogin_api.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ void analogin_init(analogin_t *obj, PinName pin)
5353
MBED_ASSERT(modinit != NULL);
5454
MBED_ASSERT(modinit->modname == (int) obj->adc);
5555

56+
obj->pin = pin;
57+
5658
// Wire pinout
5759
pinmap_pinout(pin, PinMap_ADC);
5860

targets/TARGET_NUVOTON/TARGET_M2351/analogout_api.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ void analogout_init(dac_t *obj, PinName pin)
5353
uint32_t chn = NU_MODSUBINDEX(obj->dac);
5454
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
5555

56+
obj->pin = pin;
57+
5658
/* Wire pinout */
5759
pinmap_pinout(pin, PinMap_DAC);
5860

@@ -127,7 +129,7 @@ void analogout_free(dac_t *obj)
127129

128130
/* Mark channel free */
129131
dac_modinit_mask[modidx] &= ~(1 << chn);
130-
132+
131133
/* Close channel */
132134
DAC_Close(dac_base, chn);
133135

@@ -142,6 +144,10 @@ void analogout_free(dac_t *obj)
142144
*/
143145
CLK_DisableModuleClock_S(modinit->clkidx);
144146
}
147+
148+
/* Free up pin */
149+
gpio_set(obj->pin);
150+
obj->pin = NC;
145151
}
146152

147153
void analogout_write(dac_t *obj, float value)

targets/TARGET_NUVOTON/TARGET_M2351/i2c_api.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
103103
MBED_ASSERT(modinit != NULL);
104104
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
105105

106+
obj->i2c.pin_sda = sda;
107+
obj->i2c.pin_scl = scl;
108+
106109
pinmap_pinout(sda, PinMap_I2C_SDA);
107110
pinmap_pinout(scl, PinMap_I2C_SCL);
108111

targets/TARGET_NUVOTON/TARGET_M2351/objects.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,32 @@ struct port_s {
4242

4343
struct analogin_s {
4444
ADCName adc;
45+
PinName pin;
4546
};
4647

4748
struct dac_s {
4849
DACName dac;
50+
PinName pin;
4951
};
5052

5153
struct serial_s {
5254
UARTName uart;
53-
55+
PinName pin_tx;
56+
PinName pin_rx;
57+
PinName pin_rts;
58+
PinName pin_cts;
59+
5460
uint32_t baudrate;
5561
uint32_t databits;
5662
uint32_t parity;
5763
uint32_t stopbits;
58-
64+
5965
void (*vec)(void);
6066
uint32_t irq_handler;
6167
uint32_t irq_id;
6268
uint32_t irq_en;
6369
uint32_t inten_msk;
64-
70+
6571
// Async transfer related fields
6672
DMAUsage dma_usage_tx;
6773
DMAUsage dma_usage_rx;
@@ -78,7 +84,7 @@ struct spi_s {
7884
PinName pin_mosi;
7985
PinName pin_sclk;
8086
PinName pin_ssel;
81-
87+
8288
// Async transfer related fields
8389
DMAUsage dma_usage;
8490
int dma_chn_id_tx;
@@ -90,6 +96,8 @@ struct spi_s {
9096

9197
struct i2c_s {
9298
I2CName i2c;
99+
PinName pin_sda;
100+
PinName pin_scl;
93101
int slaveaddr_state;
94102

95103
uint32_t tran_ctrl;
@@ -108,6 +116,7 @@ struct i2c_s {
108116

109117
struct pwmout_s {
110118
PWMName pwm;
119+
PinName pin;
111120
uint32_t period_us;
112121
uint32_t pulsewidth_us;
113122
};

targets/TARGET_NUVOTON/TARGET_M2351/pwmout_api.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
6868
MBED_ASSERT(modinit != NULL);
6969
MBED_ASSERT(modinit->modname == (int) obj->pwm);
7070

71+
obj->pin = pin;
72+
7173
// Wire pinout
7274
pinmap_pinout(pin, PinMap_PWM);
7375

@@ -132,6 +134,10 @@ void pwmout_free(pwmout_t* obj)
132134
// Mark this module to be deinited.
133135
int i = modinit - pwm_modinit_tab;
134136
pwm_modinit_mask &= ~(1 << i);
137+
138+
// Free up pins
139+
gpio_set(obj->pin);
140+
obj->pin = NC;
135141
}
136142

137143
void pwmout_write(pwmout_t* obj, float value)

targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,15 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
200200

201201
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
202202

203-
if (! var->ref_cnt) {
204-
pinmap_pinout(tx, PinMap_UART_TX);
205-
pinmap_pinout(rx, PinMap_UART_RX);
203+
obj->serial.pin_tx = tx;
204+
obj->serial.pin_rx = rx;
205+
obj->serial.pin_rts = NC;
206+
obj->serial.pin_cts = NC;
207+
208+
pinmap_pinout(tx, PinMap_UART_TX);
209+
pinmap_pinout(rx, PinMap_UART_RX);
206210

211+
if (! var->ref_cnt) {
207212
/* Select IP clock source
208213
*
209214
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
@@ -316,6 +321,16 @@ void serial_free(serial_t *obj)
316321
int i = modinit - uart_modinit_tab;
317322
uart_modinit_mask &= ~(1 << i);
318323
}
324+
325+
// Free up pins
326+
gpio_set(obj->serial.pin_tx);
327+
gpio_set(obj->serial.pin_rx);
328+
gpio_set(obj->serial.pin_rts);
329+
gpio_set(obj->serial.pin_cts);
330+
obj->serial.pin_tx = NC;
331+
obj->serial.pin_rx = NC;
332+
obj->serial.pin_rts = NC;
333+
obj->serial.pin_cts = NC;
319334
}
320335

321336
void serial_baud(serial_t *obj, int baudrate)
@@ -362,6 +377,16 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
362377
{
363378
UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
364379

380+
// Free up old rts/cts pins when they are different from new ones
381+
if (obj->serial.pin_rts != rxflow) {
382+
gpio_set(obj->serial.pin_rts);
383+
obj->serial.pin_rts = rxflow;
384+
}
385+
if (obj->serial.pin_cts != txflow) {
386+
gpio_set(obj->serial.pin_cts);
387+
obj->serial.pin_cts = txflow;
388+
}
389+
365390
if (rxflow != NC) {
366391
// Check if RTS pin matches.
367392
uint32_t uart_rts = pinmap_peripheral(rxflow, PinMap_UART_RTS);

targets/TARGET_NUVOTON/TARGET_M2351/spi_api.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
147147
MBED_ASSERT(modinit != NULL);
148148
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
149149

150+
obj->spi.pin_mosi = mosi;
151+
obj->spi.pin_miso = miso;
152+
obj->spi.pin_sclk = sclk;
153+
obj->spi.pin_ssel = ssel;
154+
150155
pinmap_pinout(mosi, PinMap_SPI_MOSI);
151156
pinmap_pinout(miso, PinMap_SPI_MISO);
152157
pinmap_pinout(sclk, PinMap_SPI_SCLK);
@@ -170,12 +175,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
170175
*/
171176
SYS_ResetModule_S(modinit->rsetidx);
172177

173-
obj->spi.pin_mosi = mosi;
174-
obj->spi.pin_miso = miso;
175-
obj->spi.pin_sclk = sclk;
176-
obj->spi.pin_ssel = ssel;
177-
178-
179178
#if DEVICE_SPI_ASYNCH
180179
obj->spi.dma_usage = DMA_USAGE_NEVER;
181180
obj->spi.event = 0;
@@ -224,6 +223,16 @@ void spi_free(spi_t *obj)
224223
// Mark this module to be deinited.
225224
int i = modinit - spi_modinit_tab;
226225
spi_modinit_mask &= ~(1 << i);
226+
227+
// Free up pins
228+
gpio_set(obj->spi.pin_mosi);
229+
gpio_set(obj->spi.pin_miso);
230+
gpio_set(obj->spi.pin_sclk);
231+
gpio_set(obj->spi.pin_ssel);
232+
obj->spi.pin_mosi = NC;
233+
obj->spi.pin_miso = NC;
234+
obj->spi.pin_sclk = NC;
235+
obj->spi.pin_ssel = NC;
227236
}
228237

229238
void spi_format(spi_t *obj, int bits, int mode, int slave)

targets/TARGET_NUVOTON/TARGET_M451/analogin_api.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ void analogin_init(analogin_t *obj, PinName pin)
5353
MBED_ASSERT(modinit != NULL);
5454
MBED_ASSERT(modinit->modname == obj->adc);
5555

56+
obj->pin = pin;
57+
5658
// Wire pinout
5759
pinmap_pinout(pin, PinMap_ADC);
5860

targets/TARGET_NUVOTON/TARGET_M451/analogout_api.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ void analogout_init(dac_t *obj, PinName pin)
5252
uint32_t chn = NU_MODSUBINDEX(obj->dac);
5353
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
5454

55+
obj->pin = pin;
56+
5557
/* Wire pinout */
5658
pinmap_pinout(pin, PinMap_DAC);
5759

@@ -117,6 +119,10 @@ void analogout_free(dac_t *obj)
117119
/* Disable IP clock */
118120
CLK_DisableModuleClock(modinit->clkidx);
119121
}
122+
123+
/* Free up pin */
124+
gpio_set(obj->pin);
125+
obj->pin = NC;
120126
}
121127

122128
void analogout_write(dac_t *obj, float value)

targets/TARGET_NUVOTON/TARGET_M451/can_api.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
5353
MBED_ASSERT(modinit != NULL);
5454
MBED_ASSERT(modinit->modname == obj->can);
5555

56+
obj->pin_rd = rd;
57+
obj->pin_td = td;
58+
5659
pinmap_pinout(td, PinMap_CAN_TD);
5760
pinmap_pinout(rd, PinMap_CAN_RD);
5861

@@ -72,7 +75,7 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
7275
CAN_Open((CAN_T *)NU_MODBASE(obj->can), hz, CAN_NORMAL_MODE);
7376

7477
can_filter(obj, 0, 0, CANStandard, 0);
75-
}
78+
}
7679

7780

7881
void can_init(can_t *obj, PinName rd, PinName td)
@@ -93,6 +96,12 @@ void can_free(can_t *obj)
9396
SYS_ResetModule(modinit->rsetidx);
9497

9598
CLK_DisableModuleClock(modinit->clkidx);
99+
100+
/* Free up pins */
101+
gpio_set(obj->pin_rd);
102+
gpio_set(obj->pin_td);
103+
obj->pin_rd = NC;
104+
obj->pin_td = NC;
96105
}
97106

98107
int can_frequency(can_t *obj, int hz)

targets/TARGET_NUVOTON/TARGET_M451/i2c_api.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
112112
MBED_ASSERT(modinit != NULL);
113113
MBED_ASSERT(modinit->modname == obj->i2c.i2c);
114114

115+
obj->i2c.pin_sda = sda;
116+
obj->i2c.pin_scl = scl;
117+
115118
pinmap_pinout(sda, PinMap_I2C_SDA);
116119
pinmap_pinout(scl, PinMap_I2C_SCL);
117120

targets/TARGET_NUVOTON/TARGET_M451/objects.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ extern "C" {
2828
#endif
2929

3030
struct gpio_irq_s {
31-
//IRQn_Type irq_n;
32-
//uint32_t irq_index;
33-
//uint32_t event;
34-
3531
PinName pin;
3632
uint32_t irq_handler;
3733
uint32_t irq_id;
@@ -45,16 +41,21 @@ struct port_s {
4541

4642
struct analogin_s {
4743
ADCName adc;
48-
//PinName pin;
44+
PinName pin;
4945
};
5046

5147
struct dac_s {
5248
DACName dac;
49+
PinName pin;
5350
};
5451

5552
struct serial_s {
5653
UARTName uart;
57-
54+
PinName pin_tx;
55+
PinName pin_rx;
56+
PinName pin_rts;
57+
PinName pin_cts;
58+
5859
uint32_t baudrate;
5960
uint32_t databits;
6061
uint32_t parity;
@@ -93,7 +94,8 @@ struct spi_s {
9394

9495
struct i2c_s {
9596
I2CName i2c;
96-
//void (*vec)(void);
97+
PinName pin_sda;
98+
PinName pin_scl;
9799
int slaveaddr_state;
98100

99101
uint32_t tran_ctrl;
@@ -111,13 +113,15 @@ struct i2c_s {
111113

112114
struct pwmout_s {
113115
PWMName pwm;
114-
//PinName pin;
116+
PinName pin;
115117
uint32_t period_us;
116118
uint32_t pulsewidth_us;
117119
};
118120

119121
struct can_s {
120122
CANName can;
123+
PinName pin_rd;
124+
PinName pin_td;
121125
char index;
122126
};
123127
#ifdef __cplusplus

targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
6868
MBED_ASSERT(modinit != NULL);
6969
MBED_ASSERT(modinit->modname == obj->pwm);
7070

71+
obj->pin = pin;
72+
7173
// Wire pinout
7274
pinmap_pinout(pin, PinMap_PWM);
7375

@@ -124,6 +126,10 @@ void pwmout_free(pwmout_t* obj)
124126
// Mark this module to be deinited.
125127
int i = modinit - pwm_modinit_tab;
126128
pwm_modinit_mask &= ~(1 << i);
129+
130+
// Free up pins
131+
gpio_set(obj->pin);
132+
obj->pin = NC;
127133
}
128134

129135
void pwmout_write(pwmout_t* obj, float value)

0 commit comments

Comments
 (0)