Skip to content

Commit a837565

Browse files
committed
LPC55S69_NS: Add explicit pinmap support
1 parent a2320f2 commit a837565

File tree

8 files changed

+321
-162
lines changed

8 files changed

+321
-162
lines changed

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/analogin_api.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,25 @@ extern void ADC_ClockPower_Configuration(void);
3232
#define MAX_FADC 6000000
3333
#define MAX_ADC_CLOCK 80000000
3434

35-
void analogin_init(analogin_t *obj, PinName pin)
35+
#if EXPLICIT_PINMAP_READY
36+
#define ANALOGIN_INIT_DIRECT analogin_init_direct
37+
void analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
38+
#else
39+
#define ANALOGIN_INIT_DIRECT _analogin_init_direct
40+
static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
41+
#endif
3642
{
3743
uint32_t clkval;
3844
uint32_t clkdiv = 1;
3945

40-
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
46+
obj->adc = (ADCName)pinmap->peripheral;
4147
MBED_ASSERT(obj->adc != (ADCName)NC);
4248

4349
uint32_t instance = obj->adc >> ADC_INSTANCE_SHIFT;
4450
adc_config_t adc_config;
4551
uint32_t reg;
46-
uint32_t pin_number = pin & 0x1F;
47-
uint8_t port_number = pin / 32;
52+
uint32_t pin_number = pinmap->pin & 0x1F;
53+
uint8_t port_number = pinmap->pin / 32;
4854

4955
ADC_ClockPower_Configuration();
5056

@@ -64,13 +70,24 @@ void analogin_init(analogin_t *obj, PinName pin)
6470
adc_config.clockDividerNumber = (clkdiv - 1);
6571

6672
ADC_Init(adc_addrs[instance], &adc_config);
67-
pinmap_pinout(pin, PinMap_ADC);
73+
pin_function(pinmap->pin, pinmap->function);
74+
pin_mode(pinmap->pin, PullNone);
6875

6976
/* Clear the DIGIMODE & MODE bits */
7077
reg = IOCON->PIO[port_number][pin_number] & ~(IOCON_PIO_DIGIMODE_MASK | IOCON_PIO_MODE_MASK);
7178
IOCON->PIO[port_number][pin_number] = reg;
7279
}
7380

81+
void analogin_init(analogin_t *obj, PinName pin)
82+
{
83+
int peripheral = (int)pinmap_peripheral(pin, PinMap_ADC);
84+
int function = (int)pinmap_find_function(pin, PinMap_ADC);
85+
86+
const PinMap explicit_pinmap = {pin, peripheral, function};
87+
88+
ANALOGIN_INIT_DIRECT(obj, &explicit_pinmap);
89+
}
90+
7491
uint16_t analogin_read_u16(analogin_t *obj)
7592
{
7693
uint32_t instance = obj->adc >> ADC_INSTANCE_SHIFT;

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/i2c_api.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,15 @@
2626
/* Array of I2C peripheral base address. */
2727
static I2C_Type *const i2c_addrs[] = I2C_BASE_PTRS;
2828

29-
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
29+
#if EXPLICIT_PINMAP_READY
30+
#define I2C_INIT_DIRECT i2c_init_direct
31+
void i2c_init_direct(i2c_t *obj, const i2c_pinmap_t *pinmap)
32+
#else
33+
#define I2C_INIT_DIRECT _i2c_init_direct
34+
static void _i2c_init_direct(i2c_t *obj, const i2c_pinmap_t *pinmap)
35+
#endif
3036
{
31-
uint32_t i2c_sda = pinmap_peripheral(sda, PinMap_I2C_SDA);
32-
uint32_t i2c_scl = pinmap_peripheral(scl, PinMap_I2C_SCL);
33-
obj->instance = pinmap_merge(i2c_sda, i2c_scl);
37+
obj->instance = (uint32_t) pinmap->peripheral;
3438
obj->next_repeated_start = 0;
3539
obj->issue_start = 0;
3640
MBED_ASSERT((int)obj->instance != NC);
@@ -87,8 +91,25 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
8791
I2C_MasterGetDefaultConfig(&master_config);
8892
I2C_MasterInit(i2c_addrs[obj->instance], &master_config, 12000000);
8993

90-
pinmap_pinout(sda, PinMap_I2C_SDA);
91-
pinmap_pinout(scl, PinMap_I2C_SCL);
94+
pin_function(pinmap->sda_pin, pinmap->sda_function);
95+
pin_mode(pinmap->sda_pin, PullNone);
96+
pin_function(pinmap->scl_pin, pinmap->scl_function);
97+
pin_mode(pinmap->scl_pin, PullNone);
98+
}
99+
100+
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
101+
{
102+
uint32_t i2c_sda = pinmap_peripheral(sda, PinMap_I2C_SDA);
103+
uint32_t i2c_scl = pinmap_peripheral(scl, PinMap_I2C_SCL);
104+
105+
int peripheral = (int)pinmap_merge(i2c_sda, i2c_scl);
106+
107+
int sda_function = (int)pinmap_find_function(sda, PinMap_I2C_SDA);
108+
int scl_function = (int)pinmap_find_function(scl, PinMap_I2C_SCL);
109+
110+
const i2c_pinmap_t explicit_i2c_pinmap = {peripheral, sda, sda_function, scl, scl_function};
111+
112+
I2C_INIT_DIRECT(obj, &explicit_i2c_pinmap);
92113
}
93114

94115
int i2c_start(i2c_t *obj)

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/lp_analogin_api.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,24 @@ extern void ADC_ClockPower_Configuration(void);
3232

3333
#define LPADC_USER_CMDID 1U /* CMD1 */
3434

35-
void analogin_init(analogin_t *obj, PinName pin)
35+
#if EXPLICIT_PINMAP_READY
36+
#define ANALOGIN_INIT_DIRECT analogin_init_direct
37+
void analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
38+
#else
39+
#define ANALOGIN_INIT_DIRECT _analogin_init_direct
40+
static void _analogin_init_direct(analogin_t *obj, const PinMap *pinmap)
41+
#endif
3642
{
3743
gpio_t gpio;
3844

39-
obj->adc = (ADCName)pinmap_peripheral(pin, PinMap_ADC);
45+
obj->adc = (ADCName)pinmap->peripheral;
4046
MBED_ASSERT(obj->adc != (ADCName)NC);
4147

4248
uint32_t instance = obj->adc >> ADC_INSTANCE_SHIFT;
4349
lpadc_config_t adc_config;
4450
uint32_t reg;
45-
uint32_t pin_number = pin & 0x1F;
46-
uint8_t port_number = pin / 32;
51+
uint32_t pin_number = pinmap->pin & 0x1F;
52+
uint8_t port_number = pinmap->pin / 32;
4753

4854
ADC_ClockPower_Configuration();
4955

@@ -75,10 +81,11 @@ void analogin_init(analogin_t *obj, PinName pin)
7581
LPADC_DoAutoCalibration(adc_addrs[instance]);
7682
#endif /* FSL_FEATURE_LPADC_HAS_CFG_CALOFS */
7783

78-
pinmap_pinout(pin, PinMap_ADC);
84+
pin_function(pinmap->pin, pinmap->function);
85+
pin_mode(pinmap->pin, PullNone);
7986

8087
/* Need to ensure the pin is in input mode */
81-
gpio_init(&gpio, pin);
88+
gpio_init(&gpio, pinmap->pin);
8289
gpio_dir(&gpio, PIN_INPUT);
8390

8491
reg = IOCON->PIO[port_number][pin_number];
@@ -101,6 +108,16 @@ void analogin_init(analogin_t *obj, PinName pin)
101108
IOCON->PIO[port_number][pin_number] = reg;
102109
}
103110

111+
void analogin_init(analogin_t *obj, PinName pin)
112+
{
113+
int peripheral = (int)pinmap_peripheral(pin, PinMap_ADC);
114+
int function = (int)pinmap_find_function(pin, PinMap_ADC);
115+
116+
const PinMap explicit_pinmap = {pin, peripheral, function};
117+
118+
ANALOGIN_INIT_DIRECT(obj, &explicit_pinmap);
119+
}
120+
104121
uint16_t analogin_read_u16(analogin_t *obj)
105122
{
106123
uint32_t instance = obj->adc >> ADC_INSTANCE_SHIFT;

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/serial_api.c

Lines changed: 59 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,15 @@ static USART_Type *const uart_addrs[] = USART_BASE_PTRS;
3838
int stdio_uart_inited = 0;
3939
serial_t stdio_uart;
4040

41-
void serial_init(serial_t *obj, PinName tx, PinName rx)
41+
#if EXPLICIT_PINMAP_READY
42+
#define SERIAL_INIT_DIRECT serial_init_direct
43+
void serial_init_direct(serial_t *obj, const serial_pinmap_t *pinmap)
44+
#else
45+
#define SERIAL_INIT_DIRECT _serial_init_direct
46+
static void _serial_init_direct(serial_t *obj, const serial_pinmap_t *pinmap)
47+
#endif
4248
{
43-
uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
44-
uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
45-
obj->index = pinmap_merge(uart_tx, uart_rx);
49+
obj->index = (uint32_t)pinmap->peripheral;
4650
MBED_ASSERT((int)obj->index != NC);
4751

4852
usart_config_t config;
@@ -101,14 +105,14 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
101105

102106
USART_Init(uart_addrs[obj->index], &config, 12000000);
103107

104-
pinmap_pinout(tx, PinMap_UART_TX);
105-
pinmap_pinout(rx, PinMap_UART_RX);
108+
pin_function(pinmap->tx_pin, pinmap->tx_function);
109+
pin_function(pinmap->rx_pin, pinmap->rx_function);
106110

107-
if (tx != NC) {
108-
pin_mode(tx, PullUp);
111+
if (pinmap->tx_pin != NC) {
112+
pin_mode(pinmap->tx_pin, PullUp);
109113
}
110-
if (rx != NC) {
111-
pin_mode(rx, PullUp);
114+
if (pinmap->rx_pin != NC) {
115+
pin_mode(pinmap->rx_pin, PullUp);
112116
}
113117

114118
if (obj->index == STDIO_UART) {
@@ -117,6 +121,21 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
117121
}
118122
}
119123

124+
void serial_init(serial_t *obj, PinName tx, PinName rx)
125+
{
126+
uint32_t uart_tx = pinmap_peripheral(tx, PinMap_UART_TX);
127+
uint32_t uart_rx = pinmap_peripheral(rx, PinMap_UART_RX);
128+
129+
int peripheral = (int)pinmap_merge(uart_tx, uart_rx);
130+
131+
int tx_function = (int)pinmap_find_function(tx, PinMap_UART_TX);
132+
int rx_function = (int)pinmap_find_function(rx, PinMap_UART_RX);
133+
134+
const serial_pinmap_t explicit_uart_pinmap = {peripheral, tx, tx_function, rx, rx_function, false};
135+
136+
SERIAL_INIT_DIRECT(obj, &explicit_uart_pinmap);
137+
}
138+
120139
void serial_free(serial_t *obj)
121140
{
122141
USART_Deinit(uart_addrs[obj->index]);
@@ -386,39 +405,45 @@ void serial_break_clear(serial_t *obj)
386405
/*
387406
* Only hardware flow control is implemented in this API.
388407
*/
389-
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
408+
#if EXPLICIT_PINMAP_READY
409+
#define SERIAL_SET_FC_DIRECT serial_set_flow_control_direct
410+
void serial_set_flow_control_direct(serial_t *obj, FlowControl type, const serial_fc_pinmap_t *pinmap)
411+
#else
412+
#define SERIAL_SET_FC_DIRECT _serial_set_flow_control_direct
413+
static void _serial_set_flow_control_direct(serial_t *obj, FlowControl type, const serial_fc_pinmap_t *pinmap)
414+
#endif
390415
{
391416
gpio_t gpio;
392417

393418
switch(type) {
394419
case FlowControlRTS:
395-
pinmap_pinout(rxflow, PinMap_UART_RTS);
420+
pin_function(pinmap->rx_flow_pin, pinmap->rx_flow_function);
421+
pin_mode(pinmap->rx_flow_pin, PullNone);
396422
uart_addrs[obj->index]->CFG &= ~USART_CFG_CTSEN_MASK;
397423
break;
398424

399425
case FlowControlCTS:
400426
/* Do not use RTS, configure pin to GPIO input */
401-
if (rxflow != NC) {
402-
gpio_init(&gpio, rxflow);
403-
gpio_dir(&gpio, PIN_INPUT);
404-
}
427+
gpio_init(&gpio, pinmap->rx_flow_pin);
428+
gpio_dir(&gpio, PIN_INPUT);
405429

406-
pinmap_pinout(txflow, PinMap_UART_CTS);
430+
pin_function(pinmap->tx_flow_pin, pinmap->tx_flow_function);
431+
pin_mode(pinmap->tx_flow_pin, PullNone);
407432
uart_addrs[obj->index]->CFG |= USART_CFG_CTSEN_MASK;
408433
break;
409434

410435
case FlowControlRTSCTS:
411-
pinmap_pinout(rxflow, PinMap_UART_RTS);
412-
pinmap_pinout(txflow, PinMap_UART_CTS);
436+
pin_function(pinmap->rx_flow_pin, pinmap->rx_flow_function);
437+
pin_mode(pinmap->rx_flow_pin, PullNone);
438+
pin_function(pinmap->tx_flow_pin, pinmap->tx_flow_function);
439+
pin_mode(pinmap->tx_flow_pin, PullNone);
413440
uart_addrs[obj->index]->CFG |= USART_CFG_CTSEN_MASK;
414441
break;
415442

416443
case FlowControlNone:
417444
/* Do not use RTS, configure pin to GPIO input */
418-
if (rxflow != NC) {
419-
gpio_init(&gpio, rxflow);
420-
gpio_dir(&gpio, PIN_INPUT);
421-
}
445+
gpio_init(&gpio, pinmap->rx_flow_pin);
446+
gpio_dir(&gpio, PIN_INPUT);
422447

423448
uart_addrs[obj->index]->CFG &= ~USART_CFG_CTSEN_MASK;
424449
break;
@@ -427,6 +452,17 @@ void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, Pi
427452
break;
428453
}
429454
}
455+
456+
void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
457+
{
458+
int tx_flow_function = (int)pinmap_find_function(txflow, PinMap_UART_CTS);
459+
int rx_flow_function = (int)pinmap_find_function(rxflow, PinMap_UART_RTS);
460+
461+
const serial_fc_pinmap_t explicit_uart_fc_pinmap = {0, txflow, tx_flow_function, rxflow, rx_flow_function};
462+
463+
SERIAL_SET_FC_DIRECT(obj, type, &explicit_uart_fc_pinmap);
464+
}
465+
430466
#endif
431467
const PinMap *serial_tx_pinmap()
432468
{

targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/spi_api.c

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,15 @@
3030
static SPI_Type *const spi_address[] = SPI_BASE_PTRS;
3131
static int baud_rate = 0;
3232

33-
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
33+
#if EXPLICIT_PINMAP_READY
34+
#define SPI_INIT_DIRECT spi_init_direct
35+
void spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
36+
#else
37+
#define SPI_INIT_DIRECT _spi_init_direct
38+
static void _spi_init_direct(spi_t *obj, const spi_pinmap_t *pinmap)
39+
#endif
3440
{
35-
// determine the SPI to use
36-
uint32_t spi_mosi = pinmap_peripheral(mosi, PinMap_SPI_MOSI);
37-
uint32_t spi_miso = pinmap_peripheral(miso, PinMap_SPI_MISO);
38-
uint32_t spi_sclk = pinmap_peripheral(sclk, PinMap_SPI_SCLK);
39-
uint32_t spi_ssel = pinmap_peripheral(ssel, PinMap_SPI_SSEL);
40-
uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso);
41-
uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel);
42-
43-
obj->instance = pinmap_merge(spi_data, spi_cntl);
41+
obj->instance = pinmap->peripheral;
4442
MBED_ASSERT((int)obj->instance != NC);
4543
obj->ssel_num = 0;
4644

@@ -92,15 +90,42 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
9290
}
9391

9492
// pin out the spi pins
95-
pinmap_pinout(mosi, PinMap_SPI_MOSI);
96-
pinmap_pinout(miso, PinMap_SPI_MISO);
97-
pinmap_pinout(sclk, PinMap_SPI_SCLK);
98-
if (ssel != NC) {
99-
pinmap_pinout(ssel, PinMap_SPI_SSEL);
100-
obj->ssel_num = pinmap_function(ssel, PinMap_SPI_SSEL) >> SSELNUM_SHIFT;
93+
pin_function(pinmap->mosi_pin, pinmap->mosi_function);
94+
pin_mode(pinmap->mosi_pin, PullNone);
95+
pin_function(pinmap->miso_pin, pinmap->miso_function);
96+
pin_mode(pinmap->miso_pin, PullNone);
97+
pin_function(pinmap->sclk_pin, pinmap->sclk_function);
98+
pin_mode(pinmap->sclk_pin, PullNone);
99+
if (pinmap->ssel_pin != NC) {
100+
pin_function(pinmap->ssel_pin, pinmap->ssel_function);
101+
pin_mode(pinmap->ssel_pin, PullNone);
102+
obj->ssel_num = pinmap->ssel_function >> SSELNUM_SHIFT;
101103
}
102104
}
103105

106+
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel)
107+
{
108+
// determine the SPI to use
109+
uint32_t spi_mosi = pinmap_peripheral(mosi, PinMap_SPI_MOSI);
110+
uint32_t spi_miso = pinmap_peripheral(miso, PinMap_SPI_MISO);
111+
uint32_t spi_sclk = pinmap_peripheral(sclk, PinMap_SPI_SCLK);
112+
uint32_t spi_ssel = pinmap_peripheral(ssel, PinMap_SPI_SSEL);
113+
uint32_t spi_data = pinmap_merge(spi_mosi, spi_miso);
114+
uint32_t spi_cntl = pinmap_merge(spi_sclk, spi_ssel);
115+
116+
int peripheral = (int)pinmap_merge(spi_data, spi_cntl);
117+
118+
// pin out the spi pins
119+
int mosi_function = (int)pinmap_find_function(mosi, PinMap_SPI_MOSI);
120+
int miso_function = (int)pinmap_find_function(miso, PinMap_SPI_MISO);
121+
int sclk_function = (int)pinmap_find_function(sclk, PinMap_SPI_SCLK);
122+
int ssel_function = (int)pinmap_find_function(ssel, PinMap_SPI_SSEL);
123+
124+
const spi_pinmap_t explicit_spi_pinmap = {peripheral, mosi, mosi_function, miso, miso_function, sclk, sclk_function, ssel, ssel_function};
125+
126+
SPI_INIT_DIRECT(obj, &explicit_spi_pinmap);
127+
}
128+
104129
void spi_free(spi_t *obj)
105130
{
106131
SPI_Deinit(spi_address[obj->instance]);

0 commit comments

Comments
 (0)