mirror of https://github.com/ARMmbed/mbed-os.git
[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.pull/11152/head
parent
ca0846b1e9
commit
c3d7ef8341
|
@ -53,6 +53,8 @@ void analogin_init(analogin_t *obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->adc);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
|
||||
|
|
|
@ -53,6 +53,8 @@ void analogout_init(dac_t *obj, PinName pin)
|
|||
uint32_t chn = NU_MODSUBINDEX(obj->dac);
|
||||
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
/* Wire pinout */
|
||||
pinmap_pinout(pin, PinMap_DAC);
|
||||
|
||||
|
@ -127,7 +129,7 @@ void analogout_free(dac_t *obj)
|
|||
|
||||
/* Mark channel free */
|
||||
dac_modinit_mask[modidx] &= ~(1 << chn);
|
||||
|
||||
|
||||
/* Close channel */
|
||||
DAC_Close(dac_base, chn);
|
||||
|
||||
|
@ -142,6 +144,10 @@ void analogout_free(dac_t *obj)
|
|||
*/
|
||||
CLK_DisableModuleClock_S(modinit->clkidx);
|
||||
}
|
||||
|
||||
/* Free up pin */
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void analogout_write(dac_t *obj, float value)
|
||||
|
|
|
@ -103,6 +103,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
|
||||
|
||||
obj->i2c.pin_sda = sda;
|
||||
obj->i2c.pin_scl = scl;
|
||||
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
|
||||
|
|
|
@ -42,26 +42,32 @@ struct port_s {
|
|||
|
||||
struct analogin_s {
|
||||
ADCName adc;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct dac_s {
|
||||
DACName dac;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct serial_s {
|
||||
UARTName uart;
|
||||
|
||||
PinName pin_tx;
|
||||
PinName pin_rx;
|
||||
PinName pin_rts;
|
||||
PinName pin_cts;
|
||||
|
||||
uint32_t baudrate;
|
||||
uint32_t databits;
|
||||
uint32_t parity;
|
||||
uint32_t stopbits;
|
||||
|
||||
|
||||
void (*vec)(void);
|
||||
uint32_t irq_handler;
|
||||
uint32_t irq_id;
|
||||
uint32_t irq_en;
|
||||
uint32_t inten_msk;
|
||||
|
||||
|
||||
// Async transfer related fields
|
||||
DMAUsage dma_usage_tx;
|
||||
DMAUsage dma_usage_rx;
|
||||
|
@ -78,7 +84,7 @@ struct spi_s {
|
|||
PinName pin_mosi;
|
||||
PinName pin_sclk;
|
||||
PinName pin_ssel;
|
||||
|
||||
|
||||
// Async transfer related fields
|
||||
DMAUsage dma_usage;
|
||||
int dma_chn_id_tx;
|
||||
|
@ -90,6 +96,8 @@ struct spi_s {
|
|||
|
||||
struct i2c_s {
|
||||
I2CName i2c;
|
||||
PinName pin_sda;
|
||||
PinName pin_scl;
|
||||
int slaveaddr_state;
|
||||
|
||||
uint32_t tran_ctrl;
|
||||
|
@ -108,6 +116,7 @@ struct i2c_s {
|
|||
|
||||
struct pwmout_s {
|
||||
PWMName pwm;
|
||||
PinName pin;
|
||||
uint32_t period_us;
|
||||
uint32_t pulsewidth_us;
|
||||
};
|
||||
|
|
|
@ -68,6 +68,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->pwm);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_PWM);
|
||||
|
||||
|
@ -132,6 +134,10 @@ void pwmout_free(pwmout_t* obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - pwm_modinit_tab;
|
||||
pwm_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void pwmout_write(pwmout_t* obj, float value)
|
||||
|
|
|
@ -200,10 +200,15 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
|
||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
obj->serial.pin_tx = tx;
|
||||
obj->serial.pin_rx = rx;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
/* Select IP clock source
|
||||
*
|
||||
* 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)
|
|||
int i = modinit - uart_modinit_tab;
|
||||
uart_modinit_mask &= ~(1 << i);
|
||||
}
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->serial.pin_tx);
|
||||
gpio_set(obj->serial.pin_rx);
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_tx = NC;
|
||||
obj->serial.pin_rx = NC;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
}
|
||||
|
||||
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
|
|||
{
|
||||
UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
|
||||
|
||||
// Free up old rts/cts pins when they are different from new ones
|
||||
if (obj->serial.pin_rts != rxflow) {
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
obj->serial.pin_rts = rxflow;
|
||||
}
|
||||
if (obj->serial.pin_cts != txflow) {
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_cts = txflow;
|
||||
}
|
||||
|
||||
if (rxflow != NC) {
|
||||
// Check if RTS pin matches.
|
||||
uint32_t uart_rts = pinmap_peripheral(rxflow, PinMap_UART_RTS);
|
||||
|
|
|
@ -147,6 +147,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
|
@ -170,12 +175,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
*/
|
||||
SYS_ResetModule_S(modinit->rsetidx);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
obj->spi.dma_usage = DMA_USAGE_NEVER;
|
||||
obj->spi.event = 0;
|
||||
|
@ -224,6 +223,16 @@ void spi_free(spi_t *obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - spi_modinit_tab;
|
||||
spi_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->spi.pin_mosi);
|
||||
gpio_set(obj->spi.pin_miso);
|
||||
gpio_set(obj->spi.pin_sclk);
|
||||
gpio_set(obj->spi.pin_ssel);
|
||||
obj->spi.pin_mosi = NC;
|
||||
obj->spi.pin_miso = NC;
|
||||
obj->spi.pin_sclk = NC;
|
||||
obj->spi.pin_ssel = NC;
|
||||
}
|
||||
|
||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||
|
|
|
@ -53,6 +53,8 @@ void analogin_init(analogin_t *obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->adc);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
|
||||
|
|
|
@ -52,6 +52,8 @@ void analogout_init(dac_t *obj, PinName pin)
|
|||
uint32_t chn = NU_MODSUBINDEX(obj->dac);
|
||||
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
/* Wire pinout */
|
||||
pinmap_pinout(pin, PinMap_DAC);
|
||||
|
||||
|
@ -117,6 +119,10 @@ void analogout_free(dac_t *obj)
|
|||
/* Disable IP clock */
|
||||
CLK_DisableModuleClock(modinit->clkidx);
|
||||
}
|
||||
|
||||
/* Free up pin */
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void analogout_write(dac_t *obj, float value)
|
||||
|
|
|
@ -53,6 +53,9 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->can);
|
||||
|
||||
obj->pin_rd = rd;
|
||||
obj->pin_td = td;
|
||||
|
||||
pinmap_pinout(td, PinMap_CAN_TD);
|
||||
pinmap_pinout(rd, PinMap_CAN_RD);
|
||||
|
||||
|
@ -72,7 +75,7 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
|
|||
CAN_Open((CAN_T *)NU_MODBASE(obj->can), hz, CAN_NORMAL_MODE);
|
||||
|
||||
can_filter(obj, 0, 0, CANStandard, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void can_init(can_t *obj, PinName rd, PinName td)
|
||||
|
@ -93,6 +96,12 @@ void can_free(can_t *obj)
|
|||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
CLK_DisableModuleClock(modinit->clkidx);
|
||||
|
||||
/* Free up pins */
|
||||
gpio_set(obj->pin_rd);
|
||||
gpio_set(obj->pin_td);
|
||||
obj->pin_rd = NC;
|
||||
obj->pin_td = NC;
|
||||
}
|
||||
|
||||
int can_frequency(can_t *obj, int hz)
|
||||
|
|
|
@ -112,6 +112,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->i2c.i2c);
|
||||
|
||||
obj->i2c.pin_sda = sda;
|
||||
obj->i2c.pin_scl = scl;
|
||||
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
|
||||
|
|
|
@ -28,10 +28,6 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
struct gpio_irq_s {
|
||||
//IRQn_Type irq_n;
|
||||
//uint32_t irq_index;
|
||||
//uint32_t event;
|
||||
|
||||
PinName pin;
|
||||
uint32_t irq_handler;
|
||||
uint32_t irq_id;
|
||||
|
@ -45,16 +41,21 @@ struct port_s {
|
|||
|
||||
struct analogin_s {
|
||||
ADCName adc;
|
||||
//PinName pin;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct dac_s {
|
||||
DACName dac;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct serial_s {
|
||||
UARTName uart;
|
||||
|
||||
PinName pin_tx;
|
||||
PinName pin_rx;
|
||||
PinName pin_rts;
|
||||
PinName pin_cts;
|
||||
|
||||
uint32_t baudrate;
|
||||
uint32_t databits;
|
||||
uint32_t parity;
|
||||
|
@ -93,7 +94,8 @@ struct spi_s {
|
|||
|
||||
struct i2c_s {
|
||||
I2CName i2c;
|
||||
//void (*vec)(void);
|
||||
PinName pin_sda;
|
||||
PinName pin_scl;
|
||||
int slaveaddr_state;
|
||||
|
||||
uint32_t tran_ctrl;
|
||||
|
@ -111,13 +113,15 @@ struct i2c_s {
|
|||
|
||||
struct pwmout_s {
|
||||
PWMName pwm;
|
||||
//PinName pin;
|
||||
PinName pin;
|
||||
uint32_t period_us;
|
||||
uint32_t pulsewidth_us;
|
||||
};
|
||||
|
||||
struct can_s {
|
||||
CANName can;
|
||||
PinName pin_rd;
|
||||
PinName pin_td;
|
||||
char index;
|
||||
};
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -68,6 +68,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->pwm);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_PWM);
|
||||
|
||||
|
@ -124,6 +126,10 @@ void pwmout_free(pwmout_t* obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - pwm_modinit_tab;
|
||||
pwm_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void pwmout_write(pwmout_t* obj, float value)
|
||||
|
|
|
@ -169,11 +169,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
MBED_ASSERT(modinit->modname == (int) obj->serial.uart);
|
||||
|
||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
obj->serial.pin_tx = tx;
|
||||
obj->serial.pin_rx = rx;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
// Select IP clock source
|
||||
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
||||
|
||||
|
@ -272,6 +277,16 @@ void serial_free(serial_t *obj)
|
|||
int i = modinit - uart_modinit_tab;
|
||||
uart_modinit_mask &= ~(1 << i);
|
||||
}
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->serial.pin_tx);
|
||||
gpio_set(obj->serial.pin_rx);
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_tx = NC;
|
||||
obj->serial.pin_rx = NC;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
}
|
||||
|
||||
void serial_baud(serial_t *obj, int baudrate) {
|
||||
|
@ -316,6 +331,16 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
|||
{
|
||||
UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
|
||||
|
||||
// Free up old rts/cts pins when they are different from new ones
|
||||
if (obj->serial.pin_rts != rxflow) {
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
obj->serial.pin_rts = rxflow;
|
||||
}
|
||||
if (obj->serial.pin_cts != txflow) {
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_cts = txflow;
|
||||
}
|
||||
|
||||
if (rxflow != NC) {
|
||||
// Check if RTS pin matches.
|
||||
uint32_t uart_rts = pinmap_peripheral(rxflow, PinMap_UART_RTS);
|
||||
|
|
|
@ -131,6 +131,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
|
@ -145,12 +150,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
// Reset this module
|
||||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
obj->spi.dma_usage = DMA_USAGE_NEVER;
|
||||
obj->spi.event = 0;
|
||||
|
@ -196,6 +195,16 @@ void spi_free(spi_t *obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - spi_modinit_tab;
|
||||
spi_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->spi.pin_mosi);
|
||||
gpio_set(obj->spi.pin_miso);
|
||||
gpio_set(obj->spi.pin_sclk);
|
||||
gpio_set(obj->spi.pin_ssel);
|
||||
obj->spi.pin_mosi = NC;
|
||||
obj->spi.pin_miso = NC;
|
||||
obj->spi.pin_sclk = NC;
|
||||
obj->spi.pin_ssel = NC;
|
||||
}
|
||||
|
||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||
|
|
|
@ -53,6 +53,8 @@ void analogin_init(analogin_t *obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->adc);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
|
||||
|
|
|
@ -53,6 +53,8 @@ void analogout_init(dac_t *obj, PinName pin)
|
|||
uint32_t chn = NU_MODSUBINDEX(obj->dac);
|
||||
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
/* Wire pinout */
|
||||
pinmap_pinout(pin, PinMap_DAC);
|
||||
|
||||
|
@ -128,6 +130,10 @@ void analogout_free(dac_t *obj)
|
|||
/* Disable IP clock */
|
||||
CLK_DisableModuleClock(modinit->clkidx);
|
||||
}
|
||||
|
||||
/* Free up pin */
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void analogout_write(dac_t *obj, float value)
|
||||
|
|
|
@ -59,6 +59,9 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->can);
|
||||
|
||||
obj->pin_rd = rd;
|
||||
obj->pin_td = td;
|
||||
|
||||
pinmap_pinout(td, PinMap_CAN_TD);
|
||||
pinmap_pinout(rd, PinMap_CAN_RD);
|
||||
|
||||
|
@ -104,6 +107,12 @@ void can_free(can_t *obj)
|
|||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
CLK_DisableModuleClock(modinit->clkidx);
|
||||
|
||||
/* Free up pins */
|
||||
gpio_set(obj->pin_rd);
|
||||
gpio_set(obj->pin_td);
|
||||
obj->pin_rd = NC;
|
||||
obj->pin_td = NC;
|
||||
}
|
||||
|
||||
int can_frequency(can_t *obj, int hz)
|
||||
|
|
|
@ -103,6 +103,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
|
||||
|
||||
obj->i2c.pin_sda = sda;
|
||||
obj->i2c.pin_scl = scl;
|
||||
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
|
||||
|
|
|
@ -28,10 +28,6 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
struct gpio_irq_s {
|
||||
//IRQn_Type irq_n;
|
||||
//uint32_t irq_index;
|
||||
//uint32_t event;
|
||||
|
||||
PinName pin;
|
||||
uint32_t irq_handler;
|
||||
uint32_t irq_id;
|
||||
|
@ -45,27 +41,32 @@ struct port_s {
|
|||
|
||||
struct analogin_s {
|
||||
ADCName adc;
|
||||
//PinName pin;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct dac_s {
|
||||
DACName dac;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct serial_s {
|
||||
UARTName uart;
|
||||
|
||||
PinName pin_tx;
|
||||
PinName pin_rx;
|
||||
PinName pin_rts;
|
||||
PinName pin_cts;
|
||||
|
||||
uint32_t baudrate;
|
||||
uint32_t databits;
|
||||
uint32_t parity;
|
||||
uint32_t stopbits;
|
||||
|
||||
|
||||
void (*vec)(void);
|
||||
uint32_t irq_handler;
|
||||
uint32_t irq_id;
|
||||
uint32_t irq_en;
|
||||
uint32_t inten_msk;
|
||||
|
||||
|
||||
// Async transfer related fields
|
||||
DMAUsage dma_usage_tx;
|
||||
DMAUsage dma_usage_rx;
|
||||
|
@ -93,16 +94,16 @@ struct spi_s {
|
|||
|
||||
struct i2c_s {
|
||||
I2CName i2c;
|
||||
//void (*vec)(void);
|
||||
PinName pin_sda;
|
||||
PinName pin_scl;
|
||||
int slaveaddr_state;
|
||||
|
||||
|
||||
uint32_t tran_ctrl;
|
||||
char * tran_beg;
|
||||
char * tran_pos;
|
||||
char * tran_end;
|
||||
int inten;
|
||||
|
||||
|
||||
|
||||
// Async transfer related fields
|
||||
DMAUsage dma_usage;
|
||||
uint32_t event;
|
||||
|
@ -112,7 +113,7 @@ struct i2c_s {
|
|||
|
||||
struct pwmout_s {
|
||||
PWMName pwm;
|
||||
//PinName pin;
|
||||
PinName pin;
|
||||
uint32_t period_us;
|
||||
uint32_t pulsewidth_us;
|
||||
};
|
||||
|
@ -123,6 +124,8 @@ struct trng_s {
|
|||
|
||||
struct can_s {
|
||||
CANName can;
|
||||
PinName pin_rd;
|
||||
PinName pin_td;
|
||||
int index;
|
||||
};
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -68,6 +68,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->pwm);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_PWM);
|
||||
|
||||
|
@ -119,6 +121,10 @@ void pwmout_free(pwmout_t* obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - pwm_modinit_tab;
|
||||
pwm_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void pwmout_write(pwmout_t* obj, float value)
|
||||
|
|
|
@ -200,10 +200,15 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
|
||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
obj->serial.pin_tx = tx;
|
||||
obj->serial.pin_rx = rx;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
// Select IP clock source
|
||||
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
||||
|
||||
|
@ -304,6 +309,16 @@ void serial_free(serial_t *obj)
|
|||
int i = modinit - uart_modinit_tab;
|
||||
uart_modinit_mask &= ~(1 << i);
|
||||
}
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->serial.pin_tx);
|
||||
gpio_set(obj->serial.pin_rx);
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_tx = NC;
|
||||
obj->serial.pin_rx = NC;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
}
|
||||
|
||||
void serial_baud(serial_t *obj, int baudrate)
|
||||
|
@ -350,6 +365,16 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
|||
{
|
||||
UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
|
||||
|
||||
// Free up old rts/cts pins when they are different from new ones
|
||||
if (obj->serial.pin_rts != rxflow) {
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
obj->serial.pin_rts = rxflow;
|
||||
}
|
||||
if (obj->serial.pin_cts != txflow) {
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_cts = txflow;
|
||||
}
|
||||
|
||||
if (rxflow != NC) {
|
||||
// Check if RTS pin matches.
|
||||
uint32_t uart_rts = pinmap_peripheral(rxflow, PinMap_UART_RTS);
|
||||
|
|
|
@ -146,6 +146,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
|
@ -160,12 +165,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
// Reset this module
|
||||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
obj->spi.dma_usage = DMA_USAGE_NEVER;
|
||||
obj->spi.event = 0;
|
||||
|
@ -211,6 +210,16 @@ void spi_free(spi_t *obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - spi_modinit_tab;
|
||||
spi_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->spi.pin_mosi);
|
||||
gpio_set(obj->spi.pin_miso);
|
||||
gpio_set(obj->spi.pin_sclk);
|
||||
gpio_set(obj->spi.pin_ssel);
|
||||
obj->spi.pin_mosi = NC;
|
||||
obj->spi.pin_miso = NC;
|
||||
obj->spi.pin_sclk = NC;
|
||||
obj->spi.pin_ssel = NC;
|
||||
}
|
||||
|
||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||
|
|
|
@ -50,7 +50,9 @@ void analogin_init(analogin_t *obj, PinName pin)
|
|||
const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
|
||||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT((ADCName) modinit->modname == obj->adc);
|
||||
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
|
||||
|
|
|
@ -53,6 +53,8 @@ void analogout_init(dac_t *obj, PinName pin)
|
|||
uint32_t chn = NU_MODSUBINDEX(obj->dac);
|
||||
MBED_ASSERT(chn < NU_DACCHN_MAXNUM);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
/* Wire pinout */
|
||||
pinmap_pinout(pin, PinMap_DAC);
|
||||
|
||||
|
@ -121,6 +123,10 @@ void analogout_free(dac_t *obj)
|
|||
/* Disable IP clock */
|
||||
CLK_DisableModuleClock(modinit->clkidx);
|
||||
}
|
||||
|
||||
/* Free up pin */
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void analogout_write(dac_t *obj, float value)
|
||||
|
|
|
@ -127,6 +127,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT((I2CName) modinit->modname == obj->i2c.i2c);
|
||||
|
||||
obj->i2c.pin_sda = sda;
|
||||
obj->i2c.pin_scl = scl;
|
||||
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
|
||||
|
|
|
@ -42,15 +42,21 @@ struct port_s {
|
|||
|
||||
struct analogin_s {
|
||||
ADCName adc;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct dac_s {
|
||||
DACName dac;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct serial_s {
|
||||
UARTName uart;
|
||||
|
||||
PinName pin_tx;
|
||||
PinName pin_rx;
|
||||
PinName pin_rts;
|
||||
PinName pin_cts;
|
||||
|
||||
uint32_t baudrate;
|
||||
uint32_t databits;
|
||||
uint32_t parity;
|
||||
|
@ -91,6 +97,8 @@ struct spi_s {
|
|||
|
||||
struct i2c_s {
|
||||
I2CName i2c;
|
||||
PinName pin_sda;
|
||||
PinName pin_scl;
|
||||
int slaveaddr_state;
|
||||
|
||||
uint32_t tran_ctrl;
|
||||
|
@ -109,6 +117,7 @@ struct i2c_s {
|
|||
|
||||
struct pwmout_s {
|
||||
PWMName pwm;
|
||||
PinName pin;
|
||||
uint32_t period_us;
|
||||
uint32_t pulsewidth_us;
|
||||
};
|
||||
|
|
|
@ -72,6 +72,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT((PWMName) modinit->modname == obj->pwm);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_PWM);
|
||||
|
||||
|
@ -127,6 +129,10 @@ void pwmout_free(pwmout_t* obj)
|
|||
int i = modinit - pwm_modinit_tab;
|
||||
pwm_modinit_mask &= ~(1 << i);
|
||||
}
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void pwmout_write(pwmout_t* obj, float value)
|
||||
|
|
|
@ -134,11 +134,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
MBED_ASSERT(modinit->modname == (int) obj->serial.uart);
|
||||
|
||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
obj->serial.pin_tx = tx;
|
||||
obj->serial.pin_rx = rx;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
// Select IP clock source
|
||||
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
||||
|
||||
|
@ -237,6 +242,16 @@ void serial_free(serial_t *obj)
|
|||
int i = modinit - uart_modinit_tab;
|
||||
uart_modinit_mask &= ~(1 << i);
|
||||
}
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->serial.pin_tx);
|
||||
gpio_set(obj->serial.pin_rx);
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_tx = NC;
|
||||
obj->serial.pin_rx = NC;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
}
|
||||
|
||||
void serial_baud(serial_t *obj, int baudrate) {
|
||||
|
@ -277,6 +292,16 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
|||
{
|
||||
UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
|
||||
|
||||
// Free up old rts/cts pins when they are different from new ones
|
||||
if (obj->serial.pin_rts != rxflow) {
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
obj->serial.pin_rts = rxflow;
|
||||
}
|
||||
if (obj->serial.pin_cts != txflow) {
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_cts = txflow;
|
||||
}
|
||||
|
||||
if (rxflow != NC) {
|
||||
// Check if RTS pin matches.
|
||||
uint32_t uart_rts = pinmap_peripheral(rxflow, PinMap_UART_RTS);
|
||||
|
|
|
@ -158,6 +158,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
|
@ -172,12 +177,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
// Reset this module
|
||||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
obj->spi.dma_usage = DMA_USAGE_NEVER;
|
||||
obj->spi.event = 0;
|
||||
|
@ -224,6 +223,16 @@ void spi_free(spi_t *obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - spi_modinit_tab;
|
||||
spi_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->spi.pin_mosi);
|
||||
gpio_set(obj->spi.pin_miso);
|
||||
gpio_set(obj->spi.pin_sclk);
|
||||
gpio_set(obj->spi.pin_ssel);
|
||||
obj->spi.pin_mosi = NC;
|
||||
obj->spi.pin_miso = NC;
|
||||
obj->spi.pin_sclk = NC;
|
||||
obj->spi.pin_ssel = NC;
|
||||
}
|
||||
|
||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||
|
|
|
@ -54,6 +54,8 @@ void analogin_init(analogin_t *obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->adc);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_ADC);
|
||||
|
||||
|
|
|
@ -44,8 +44,8 @@
|
|||
};
|
||||
|
||||
|
||||
void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
|
||||
{
|
||||
void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
|
||||
{
|
||||
uint32_t can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
|
||||
uint32_t can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
|
||||
obj->can = (CANName)pinmap_merge(can_td, can_rd);
|
||||
|
@ -55,6 +55,9 @@
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->can);
|
||||
|
||||
obj->pin_rd = rd;
|
||||
obj->pin_td = td;
|
||||
|
||||
pinmap_pinout(td, PinMap_CAN_TD);
|
||||
pinmap_pinout(rd, PinMap_CAN_RD);
|
||||
|
||||
|
@ -80,7 +83,7 @@
|
|||
CAN_Open((CAN_T *)NU_MODBASE(obj->can), hz, CAN_NORMAL_MODE);
|
||||
|
||||
can_filter(obj, 0, 0, CANStandard, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void can_init(can_t *obj, PinName rd, PinName td)
|
||||
|
@ -101,6 +104,12 @@ void can_free(can_t *obj)
|
|||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
CLK_DisableModuleClock(modinit->clkidx);
|
||||
|
||||
/* Free up pins */
|
||||
gpio_set(obj->pin_rd);
|
||||
gpio_set(obj->pin_td);
|
||||
obj->pin_rd = NC;
|
||||
obj->pin_td = NC;
|
||||
}
|
||||
|
||||
int can_frequency(can_t *obj, int hz)
|
||||
|
|
|
@ -129,6 +129,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->i2c.i2c);
|
||||
|
||||
obj->i2c.pin_sda = sda;
|
||||
obj->i2c.pin_scl = scl;
|
||||
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
|
||||
|
|
|
@ -28,10 +28,6 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
struct gpio_irq_s {
|
||||
//IRQn_Type irq_n;
|
||||
//uint32_t irq_index;
|
||||
//uint32_t event;
|
||||
|
||||
PinName pin;
|
||||
uint32_t irq_handler;
|
||||
uint32_t irq_id;
|
||||
|
@ -45,12 +41,16 @@ struct port_s {
|
|||
|
||||
struct analogin_s {
|
||||
ADCName adc;
|
||||
//PinName pin;
|
||||
PinName pin;
|
||||
};
|
||||
|
||||
struct serial_s {
|
||||
UARTName uart;
|
||||
|
||||
PinName pin_tx;
|
||||
PinName pin_rx;
|
||||
PinName pin_rts;
|
||||
PinName pin_cts;
|
||||
|
||||
uint32_t baudrate;
|
||||
uint32_t databits;
|
||||
uint32_t parity;
|
||||
|
@ -89,7 +89,8 @@ struct spi_s {
|
|||
|
||||
struct i2c_s {
|
||||
I2CName i2c;
|
||||
//void (*vec)(void);
|
||||
PinName pin_sda;
|
||||
PinName pin_scl;
|
||||
int slaveaddr_state;
|
||||
|
||||
uint32_t tran_ctrl;
|
||||
|
@ -108,7 +109,7 @@ struct i2c_s {
|
|||
|
||||
struct pwmout_s {
|
||||
PWMName pwm;
|
||||
//PinName pin;
|
||||
PinName pin;
|
||||
uint32_t period_us;
|
||||
uint32_t pulsewidth_us;
|
||||
};
|
||||
|
@ -119,6 +120,8 @@ struct trng_s {
|
|||
|
||||
struct can_s {
|
||||
CANName can;
|
||||
PinName pin_rd;
|
||||
PinName pin_td;
|
||||
char index;
|
||||
};
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -69,6 +69,8 @@ void pwmout_init(pwmout_t* obj, PinName pin)
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == obj->pwm);
|
||||
|
||||
obj->pin = pin;
|
||||
|
||||
// Wire pinout
|
||||
pinmap_pinout(pin, PinMap_PWM);
|
||||
|
||||
|
@ -148,6 +150,10 @@ void pwmout_free(pwmout_t* obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - pwm_modinit_tab;
|
||||
pwm_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->pin);
|
||||
obj->pin = NC;
|
||||
}
|
||||
|
||||
void pwmout_write(pwmout_t* obj, float value)
|
||||
|
|
|
@ -199,11 +199,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
|
|||
MBED_ASSERT(modinit->modname == (int) obj->serial.uart);
|
||||
|
||||
struct nu_uart_var *var = (struct nu_uart_var *) modinit->var;
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
obj->serial.pin_tx = tx;
|
||||
obj->serial.pin_rx = rx;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
|
||||
pinmap_pinout(tx, PinMap_UART_TX);
|
||||
pinmap_pinout(rx, PinMap_UART_RX);
|
||||
|
||||
if (! var->ref_cnt) {
|
||||
// Select IP clock source
|
||||
CLK_SetModuleClock(modinit->clkidx, modinit->clksrc, modinit->clkdiv);
|
||||
|
||||
|
@ -302,6 +307,16 @@ void serial_free(serial_t *obj)
|
|||
int i = modinit - uart_modinit_tab;
|
||||
uart_modinit_mask &= ~(1 << i);
|
||||
}
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->serial.pin_tx);
|
||||
gpio_set(obj->serial.pin_rx);
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_tx = NC;
|
||||
obj->serial.pin_rx = NC;
|
||||
obj->serial.pin_rts = NC;
|
||||
obj->serial.pin_cts = NC;
|
||||
}
|
||||
|
||||
void serial_baud(serial_t *obj, int baudrate) {
|
||||
|
@ -346,6 +361,26 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
|
|||
{
|
||||
UART_T *uart_base = (UART_T *) NU_MODBASE(obj->serial.uart);
|
||||
|
||||
// Free up old rts/cts pins when they are different from new ones
|
||||
if (obj->serial.pin_rts != rxflow) {
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
obj->serial.pin_rts = rxflow;
|
||||
}
|
||||
if (obj->serial.pin_cts != txflow) {
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_cts = txflow;
|
||||
}
|
||||
|
||||
// Free up old rts/cts pins when they are different from new ones
|
||||
if (obj->serial.pin_rts != rxflow) {
|
||||
gpio_set(obj->serial.pin_rts);
|
||||
obj->serial.pin_rts = rxflow;
|
||||
}
|
||||
if (obj->serial.pin_cts != txflow) {
|
||||
gpio_set(obj->serial.pin_cts);
|
||||
obj->serial.pin_cts = txflow;
|
||||
}
|
||||
|
||||
if (rxflow != NC) {
|
||||
// Check if RTS pin matches.
|
||||
uint32_t uart_rts = pinmap_peripheral(rxflow, PinMap_UART_RTS);
|
||||
|
|
|
@ -138,6 +138,11 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
MBED_ASSERT(modinit != NULL);
|
||||
MBED_ASSERT(modinit->modname == (int) obj->spi.spi);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
pinmap_pinout(mosi, PinMap_SPI_MOSI);
|
||||
pinmap_pinout(miso, PinMap_SPI_MISO);
|
||||
pinmap_pinout(sclk, PinMap_SPI_SCLK);
|
||||
|
@ -149,12 +154,6 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
|
|||
// Reset this module
|
||||
SYS_ResetModule(modinit->rsetidx);
|
||||
|
||||
obj->spi.pin_mosi = mosi;
|
||||
obj->spi.pin_miso = miso;
|
||||
obj->spi.pin_sclk = sclk;
|
||||
obj->spi.pin_ssel = ssel;
|
||||
|
||||
|
||||
#if DEVICE_SPI_ASYNCH
|
||||
obj->spi.dma_usage = DMA_USAGE_NEVER;
|
||||
obj->spi.event = 0;
|
||||
|
@ -200,6 +199,16 @@ void spi_free(spi_t *obj)
|
|||
// Mark this module to be deinited.
|
||||
int i = modinit - spi_modinit_tab;
|
||||
spi_modinit_mask &= ~(1 << i);
|
||||
|
||||
// Free up pins
|
||||
gpio_set(obj->spi.pin_mosi);
|
||||
gpio_set(obj->spi.pin_miso);
|
||||
gpio_set(obj->spi.pin_sclk);
|
||||
gpio_set(obj->spi.pin_ssel);
|
||||
obj->spi.pin_mosi = NC;
|
||||
obj->spi.pin_miso = NC;
|
||||
obj->spi.pin_sclk = NC;
|
||||
obj->spi.pin_ssel = NC;
|
||||
}
|
||||
|
||||
void spi_format(spi_t *obj, int bits, int mode, int slave)
|
||||
|
|
Loading…
Reference in New Issue