mirror of https://github.com/ARMmbed/mbed-os.git
More pin mux options for KL25Z
- as reported in mbed bug section, add all available mux optionspull/18/head
parent
e993e94886
commit
3c0775f5c3
|
|
@ -21,7 +21,9 @@
|
|||
|
||||
static const PinMap PinMap_ADC[] = {
|
||||
{PTE20, ADC0_SE0, 0},
|
||||
{PTE21, ADC0_SE4a, 0},
|
||||
{PTE22, ADC0_SE3, 0},
|
||||
{PTE23, ADC0_SE7a, 0},
|
||||
{PTE29, ADC0_SE4b, 0},
|
||||
{PTE30, ADC0_SE23, 0},
|
||||
{PTB0, ADC0_SE8, 0},
|
||||
|
|
|
|||
|
|
@ -25,6 +25,9 @@ static const PinMap PinMap_I2C_SDA[] = {
|
|||
{PTE0, I2C_1, 6},
|
||||
{PTB1, I2C_0, 2},
|
||||
{PTB3, I2C_0, 2},
|
||||
{PTC11, I2C_1, 2},
|
||||
{PTC2, I2C_1, 2},
|
||||
{PTA4, I2C_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
|
|
@ -34,6 +37,8 @@ static const PinMap PinMap_I2C_SCL[] = {
|
|||
{PTE1, I2C_1, 6},
|
||||
{PTB0, I2C_0, 2},
|
||||
{PTB2, I2C_0, 2},
|
||||
{PTC10, I2C_1, 2},
|
||||
{PTC1, I2C_1, 2},
|
||||
{NC , NC, 0}
|
||||
};
|
||||
|
||||
|
|
@ -79,7 +84,7 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
|
|||
|
||||
pinmap_pinout(sda, PinMap_I2C_SDA);
|
||||
pinmap_pinout(scl, PinMap_I2C_SCL);
|
||||
|
||||
|
||||
first_read = 1;
|
||||
}
|
||||
|
||||
|
|
@ -112,12 +117,12 @@ int i2c_stop(i2c_t *obj) {
|
|||
|
||||
static int timeout_status_poll(i2c_t *obj, uint32_t mask) {
|
||||
uint32_t i, timeout = 1000;
|
||||
|
||||
|
||||
for (i = 0; i < timeout; i++) {
|
||||
if (obj->i2c->S & mask)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -126,14 +131,14 @@ static int timeout_status_poll(i2c_t *obj, uint32_t mask) {
|
|||
// 1: OK ack not received
|
||||
// 2: failure
|
||||
static int i2c_wait_end_tx_transfer(i2c_t *obj) {
|
||||
|
||||
|
||||
// wait for the interrupt flag
|
||||
if (timeout_status_poll(obj, I2C_S_IICIF_MASK)) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
||||
obj->i2c->S |= I2C_S_IICIF_MASK;
|
||||
|
||||
|
||||
// wait transfer complete
|
||||
if (timeout_status_poll(obj, I2C_S_TCF_MASK)) {
|
||||
return 2;
|
||||
|
|
@ -151,9 +156,9 @@ static int i2c_wait_end_rx_transfer(i2c_t *obj) {
|
|||
if (timeout_status_poll(obj, I2C_S_IICIF_MASK)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
obj->i2c->S |= I2C_S_IICIF_MASK;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -288,33 +293,33 @@ void i2c_reset(i2c_t *obj) {
|
|||
|
||||
int i2c_byte_read(i2c_t *obj, int last) {
|
||||
char data;
|
||||
|
||||
|
||||
// set rx mode
|
||||
obj->i2c->C1 &= ~I2C_C1_TX_MASK;
|
||||
|
||||
|
||||
if(first_read) {
|
||||
// first dummy read
|
||||
i2c_do_read(obj, &data, 0);
|
||||
first_read = 0;
|
||||
}
|
||||
|
||||
|
||||
if (last) {
|
||||
// set tx mode
|
||||
obj->i2c->C1 |= I2C_C1_TX_MASK;
|
||||
return obj->i2c->D;
|
||||
}
|
||||
|
||||
|
||||
i2c_do_read(obj, &data, last);
|
||||
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
int i2c_byte_write(i2c_t *obj, int data) {
|
||||
first_read = 1;
|
||||
|
||||
|
||||
// set tx mode
|
||||
obj->i2c->C1 |= I2C_C1_TX_MASK;
|
||||
|
||||
|
||||
return !i2c_do_write(obj, (data & 0xFF));
|
||||
}
|
||||
|
||||
|
|
@ -335,10 +340,10 @@ int i2c_slave_receive(i2c_t *obj) {
|
|||
switch(obj->i2c->S) {
|
||||
// read addressed
|
||||
case 0xE6: return 1;
|
||||
|
||||
|
||||
// write addressed
|
||||
case 0xE2: return 3;
|
||||
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -346,22 +351,22 @@ int i2c_slave_receive(i2c_t *obj) {
|
|||
int i2c_slave_read(i2c_t *obj, char *data, int length) {
|
||||
uint8_t dummy_read, count;
|
||||
uint8_t * ptr;
|
||||
|
||||
|
||||
// set rx mode
|
||||
obj->i2c->C1 &= ~I2C_C1_TX_MASK;
|
||||
|
||||
|
||||
// first dummy read
|
||||
dummy_read = obj->i2c->D;
|
||||
if(i2c_wait_end_rx_transfer(obj)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// read address
|
||||
dummy_read = obj->i2c->D;
|
||||
if(i2c_wait_end_rx_transfer(obj)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// read (length - 1) bytes
|
||||
for (count = 0; count < (length - 1); count++) {
|
||||
data[count] = obj->i2c->D;
|
||||
|
|
@ -373,32 +378,32 @@ int i2c_slave_read(i2c_t *obj, char *data, int length) {
|
|||
// read last byte
|
||||
ptr = (length == 0) ? &dummy_read : (uint8_t *)&data[count];
|
||||
*ptr = obj->i2c->D;
|
||||
|
||||
|
||||
return (length) ? (count + 1) : 0;
|
||||
}
|
||||
|
||||
int i2c_slave_write(i2c_t *obj, const char *data, int length) {
|
||||
uint32_t i, count = 0;
|
||||
|
||||
|
||||
// set tx mode
|
||||
obj->i2c->C1 |= I2C_C1_TX_MASK;
|
||||
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
if(i2c_do_write(obj, data[count++]) == 2) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// set rx mode
|
||||
obj->i2c->C1 &= ~I2C_C1_TX_MASK;
|
||||
|
||||
|
||||
// dummy rx transfer needed
|
||||
// otherwise the master cannot generate a stop bit
|
||||
obj->i2c->D;
|
||||
if(i2c_wait_end_rx_transfer(obj) == 2) {
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,19 +28,27 @@
|
|||
* INITIALIZATION
|
||||
******************************************************************************/
|
||||
static const PinMap PinMap_UART_TX[] = {
|
||||
{PTC4, UART_1, 3},
|
||||
{PTA2, UART_0, 2},
|
||||
{PTD5, UART_2, 3},
|
||||
{PTD3, UART_2, 3},
|
||||
{NC , NC , 0}
|
||||
{PTC4, UART_1, 3},
|
||||
{PTA2, UART_0, 2},
|
||||
{PTD5, UART_2, 3},
|
||||
{PTD3, UART_2, 3},
|
||||
{PTD7, UART_0, 3},
|
||||
{PTE20, UART_0, 4},
|
||||
{PTE22, UART_2, 4},
|
||||
{PTE0, UART_1, 3},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_UART_RX[] = {
|
||||
{PTC3, UART_1, 3},
|
||||
{PTA1, UART_0, 2},
|
||||
{PTD4, UART_2, 3},
|
||||
{PTD2, UART_2, 3},
|
||||
{NC , NC , 0}
|
||||
{PTC3, UART_1, 3},
|
||||
{PTA1, UART_0, 2},
|
||||
{PTD4, UART_2, 3},
|
||||
{PTD2, UART_2, 3},
|
||||
{PTD6, UART_0, 3},
|
||||
{PTE23, UART_2, 4},
|
||||
{PTE21, UART_0, 4},
|
||||
{PTE1, UART_1, 3},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
#define UART_NUM 3
|
||||
|
|
@ -69,7 +77,7 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
|
|||
}
|
||||
// Disable UART before changing registers
|
||||
obj->uart->C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK);
|
||||
|
||||
|
||||
switch (uart) {
|
||||
case UART_0: obj->index = 0; break;
|
||||
case UART_1: obj->index = 1; break;
|
||||
|
|
@ -114,13 +122,13 @@ void serial_free(serial_t *obj) {
|
|||
// DivAddVal < MulVal
|
||||
//
|
||||
void serial_baud(serial_t *obj, int baudrate) {
|
||||
|
||||
|
||||
// save C2 state
|
||||
uint8_t c2_state = (obj->uart->C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK));
|
||||
|
||||
|
||||
// Disable UART before changing registers
|
||||
obj->uart->C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK);
|
||||
|
||||
|
||||
// [TODO] not hardcode this value
|
||||
uint32_t PCLK = (obj->uart == UART0) ? 48000000u : 24000000u;
|
||||
|
||||
|
|
@ -135,20 +143,20 @@ void serial_baud(serial_t *obj, int baudrate) {
|
|||
// set BDH and BDL
|
||||
obj->uart->BDH = (obj->uart->BDH & ~(0x1f)) | ((DL >> 8) & 0x1f);
|
||||
obj->uart->BDL = (obj->uart->BDL & ~(0xff)) | ((DL >> 0) & 0xff);
|
||||
|
||||
|
||||
// restore C2 state
|
||||
obj->uart->C2 |= c2_state;
|
||||
}
|
||||
|
||||
void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
|
||||
uint8_t m10 = 0;
|
||||
|
||||
|
||||
// save C2 state
|
||||
uint8_t c2_state = (obj->uart->C2 & (UART_C2_RE_MASK | UART_C2_TE_MASK));
|
||||
|
||||
|
||||
// Disable UART before changing registers
|
||||
obj->uart->C2 &= ~(UART_C2_RE_MASK | UART_C2_TE_MASK);
|
||||
|
||||
|
||||
// 8 data bits = 0 ... 9 data bits = 1
|
||||
if ((data_bits < 8) || (data_bits > 9)) {
|
||||
error("Invalid number of bits (%d) in serial format, should be 8..9\r\n", data_bits);
|
||||
|
|
@ -170,7 +178,7 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
|
|||
error("Invalid stop bits specified\r\n");
|
||||
}
|
||||
stop_bits -= 1;
|
||||
|
||||
|
||||
// 9 data bits + parity
|
||||
if (data_bits == 2) {
|
||||
// only uart0 supports 10 bit communication
|
||||
|
|
@ -185,17 +193,17 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
|
|||
obj->uart->C1 = ((data_bits << 4)
|
||||
| (parity_enable << 1)
|
||||
| (parity_select << 0));
|
||||
|
||||
|
||||
// enable 10bit mode if needed
|
||||
if (obj->index == 0) {
|
||||
obj->uart->C4 &= ~UARTLP_C4_M10_MASK;
|
||||
obj->uart->C4 |= (m10 << UARTLP_C4_M10_SHIFT);
|
||||
}
|
||||
|
||||
|
||||
// stop bits
|
||||
obj->uart->BDH &= ~UART_BDH_SBNS_MASK;
|
||||
obj->uart->BDH |= (stop_bits << UART_BDH_SBNS_SHIFT);
|
||||
|
||||
|
||||
// restore C2 state
|
||||
obj->uart->C2 |= c2_state;
|
||||
}
|
||||
|
|
@ -296,7 +304,7 @@ void serial_pinout_tx(PinName tx) {
|
|||
}
|
||||
|
||||
void serial_break_set(serial_t *obj) {
|
||||
obj->uart->C2 |= UART_C2_SBK_MASK;
|
||||
obj->uart->C2 |= UART_C2_SBK_MASK;
|
||||
}
|
||||
|
||||
void serial_break_clear(serial_t *obj) {
|
||||
|
|
|
|||
|
|
@ -22,31 +22,47 @@
|
|||
#include "error.h"
|
||||
|
||||
static const PinMap PinMap_SPI_SCLK[] = {
|
||||
{PTE2, SPI_1, 2},
|
||||
{PTC5, SPI_0, 2},
|
||||
{PTD1, SPI_0, 2},
|
||||
{NC , NC , 0}
|
||||
{PTE2, SPI_1, 2},
|
||||
{PTC5, SPI_0, 2},
|
||||
{PTD1, SPI_0, 2},
|
||||
{PTB11, SPI_1, 2},
|
||||
{PTD5, SPI_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MOSI[] = {
|
||||
{PTE1, SPI_1, 2},
|
||||
{PTC6, SPI_0, 2},
|
||||
{PTD2, SPI_0, 2},
|
||||
{PTE3, SPI_1, 2},
|
||||
{PTD7, SPI_1, 5},
|
||||
{PTC7, SPI_0, 5},
|
||||
{PTD3, SPI_0, 5},
|
||||
{PTD6, SPI_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_MISO[] = {
|
||||
{PTE3, SPI_1, 2},
|
||||
{PTC7, SPI_0, 2},
|
||||
{PTD3, SPI_0, 2},
|
||||
{PTE3, SPI_1, 2},
|
||||
{PTC7, SPI_0, 2},
|
||||
{PTD3, SPI_0, 2},
|
||||
{PTE1, SPI_1, 5},
|
||||
{PTA16, SPI_0, 5},
|
||||
{PTA17, SPI_0, 5},
|
||||
{PTC5, SPI_0, 5},
|
||||
{PTD2, SPI_0, 5},
|
||||
{PTD6, SPI_1, 5},
|
||||
{PTD7, SPI_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
static const PinMap PinMap_SPI_SSEL[] = {
|
||||
{PTE4, SPI_1, 2},
|
||||
{PTC4, SPI_0, 2},
|
||||
{PTD0, SPI_0, 2},
|
||||
{NC , NC , 0}
|
||||
{PTE4, SPI_1, 2},
|
||||
{PTC4, SPI_0, 2},
|
||||
{PTD0, SPI_0, 2},
|
||||
{PTB10, SPI_1, 2},
|
||||
{PTD4, SPI_1, 2},
|
||||
{NC , NC , 0}
|
||||
};
|
||||
|
||||
void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue