void serial_format(uint32_t format); | void serial_format(uint32_t format); | ||||
void serial_end(void); | void serial_end(void); | ||||
void serial_set_transmit_pin(uint8_t pin); | void serial_set_transmit_pin(uint8_t pin); | ||||
void serial_set_rx(uint8_t pin); | |||||
void serial_set_tx(uint8_t pin); | |||||
int serial_set_rts(uint8_t pin); | int serial_set_rts(uint8_t pin); | ||||
int serial_set_cts(uint8_t pin); | int serial_set_cts(uint8_t pin); | ||||
void serial_putchar(uint32_t c); | void serial_putchar(uint32_t c); | ||||
void serial2_format(uint32_t format); | void serial2_format(uint32_t format); | ||||
void serial2_end(void); | void serial2_end(void); | ||||
void serial2_set_transmit_pin(uint8_t pin); | void serial2_set_transmit_pin(uint8_t pin); | ||||
void serial2_set_rx(uint8_t pin); | |||||
void serial2_set_tx(uint8_t pin); | |||||
int serial2_set_rts(uint8_t pin); | int serial2_set_rts(uint8_t pin); | ||||
int serial2_set_cts(uint8_t pin); | int serial2_set_cts(uint8_t pin); | ||||
void serial2_putchar(uint32_t c); | void serial2_putchar(uint32_t c); | ||||
void serial3_format(uint32_t format); | void serial3_format(uint32_t format); | ||||
void serial3_end(void); | void serial3_end(void); | ||||
void serial3_set_transmit_pin(uint8_t pin); | void serial3_set_transmit_pin(uint8_t pin); | ||||
void serial3_set_rx(uint8_t pin); | |||||
void serial3_set_tx(uint8_t pin); | |||||
int serial3_set_rts(uint8_t pin); | int serial3_set_rts(uint8_t pin); | ||||
int serial3_set_cts(uint8_t pin); | int serial3_set_cts(uint8_t pin); | ||||
void serial3_putchar(uint32_t c); | void serial3_putchar(uint32_t c); | ||||
serial_format(format); } | serial_format(format); } | ||||
virtual void end(void) { serial_end(); } | virtual void end(void) { serial_end(); } | ||||
virtual void transmitterEnable(uint8_t pin) { serial_set_transmit_pin(pin); } | virtual void transmitterEnable(uint8_t pin) { serial_set_transmit_pin(pin); } | ||||
virtual void setRX(uint8_t pin) { serial_set_rx(pin); } | |||||
virtual void setTX(uint8_t pin) { serial_set_tx(pin); } | |||||
virtual bool attachRts(uint8_t pin) { return serial_set_rts(pin); } | virtual bool attachRts(uint8_t pin) { return serial_set_rts(pin); } | ||||
virtual bool attachCts(uint8_t pin) { return serial_set_cts(pin); } | virtual bool attachCts(uint8_t pin) { return serial_set_cts(pin); } | ||||
virtual int available(void) { return serial_available(); } | virtual int available(void) { return serial_available(); } | ||||
serial2_format(format); } | serial2_format(format); } | ||||
virtual void end(void) { serial2_end(); } | virtual void end(void) { serial2_end(); } | ||||
virtual void transmitterEnable(uint8_t pin) { serial2_set_transmit_pin(pin); } | virtual void transmitterEnable(uint8_t pin) { serial2_set_transmit_pin(pin); } | ||||
virtual void setRX(uint8_t pin) { serial2_set_rx(pin); } | |||||
virtual void setTX(uint8_t pin) { serial2_set_tx(pin); } | |||||
virtual bool attachRts(uint8_t pin) { return serial2_set_rts(pin); } | virtual bool attachRts(uint8_t pin) { return serial2_set_rts(pin); } | ||||
virtual bool attachCts(uint8_t pin) { return serial2_set_cts(pin); } | virtual bool attachCts(uint8_t pin) { return serial2_set_cts(pin); } | ||||
virtual int available(void) { return serial2_available(); } | virtual int available(void) { return serial2_available(); } | ||||
serial3_format(format); } | serial3_format(format); } | ||||
virtual void end(void) { serial3_end(); } | virtual void end(void) { serial3_end(); } | ||||
virtual void transmitterEnable(uint8_t pin) { serial3_set_transmit_pin(pin); } | virtual void transmitterEnable(uint8_t pin) { serial3_set_transmit_pin(pin); } | ||||
virtual void setRX(uint8_t pin) { serial3_set_rx(pin); } | |||||
virtual void setTX(uint8_t pin) { serial3_set_tx(pin); } | |||||
virtual bool attachRts(uint8_t pin) { return serial3_set_rts(pin); } | virtual bool attachRts(uint8_t pin) { return serial3_set_rts(pin); } | ||||
virtual bool attachCts(uint8_t pin) { return serial3_set_cts(pin); } | virtual bool attachCts(uint8_t pin) { return serial3_set_cts(pin); } | ||||
virtual int available(void) { return serial3_available(); } | virtual int available(void) { return serial3_available(); } |
static volatile uint8_t rx_buffer_head = 0; | static volatile uint8_t rx_buffer_head = 0; | ||||
static volatile uint8_t rx_buffer_tail = 0; | static volatile uint8_t rx_buffer_tail = 0; | ||||
#endif | #endif | ||||
static uint8_t rx_pin_num = 0; | |||||
static uint8_t tx_pin_num = 1; | |||||
// UART0 and UART1 are clocked by F_CPU, UART2 is clocked by F_BUS | // UART0 and UART1 are clocked by F_CPU, UART2 is clocked by F_BUS | ||||
// UART0 has 8 byte fifo, UART1 and UART2 have 1 byte buffer | // UART0 has 8 byte fifo, UART1 and UART2 have 1 byte buffer | ||||
tx_buffer_head = 0; | tx_buffer_head = 0; | ||||
tx_buffer_tail = 0; | tx_buffer_tail = 0; | ||||
transmitting = 0; | transmitting = 0; | ||||
CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | |||||
CORE_PIN1_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | |||||
switch (rx_pin_num) { | |||||
case 0: CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
case 21: CORE_PIN21_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
#if defined(KINETISL) | |||||
case 3: CORE_PIN3_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(2); break; | |||||
#endif | |||||
} | |||||
switch (tx_pin_num) { | |||||
case 1: CORE_PIN1_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
case 5: CORE_PIN5_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
#if defined(KINETISL) | |||||
case 4: CORE_PIN4_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(2); break; | |||||
#endif | |||||
} | |||||
#if defined(HAS_KINETISK_UART0) | #if defined(HAS_KINETISK_UART0) | ||||
UART0_BDH = (divisor >> 13) & 0x1F; | UART0_BDH = (divisor >> 13) & 0x1F; | ||||
UART0_BDL = (divisor >> 5) & 0xFF; | UART0_BDL = (divisor >> 5) & 0xFF; | ||||
#endif | #endif | ||||
} | } | ||||
void serial_set_tx(uint8_t pin) | |||||
{ | |||||
if (pin == tx_pin_num) return; | |||||
if ((SIM_SCGC4 & SIM_SCGC4_UART0)) { | |||||
switch (tx_pin_num) { | |||||
case 1: CORE_PIN1_CONFIG = 0; break; // PTB17 | |||||
case 5: CORE_PIN5_CONFIG = 0; break; // PTD7 | |||||
#if defined(KINETISL) | |||||
case 4: CORE_PIN4_CONFIG = 0; break; // PTA2 | |||||
#endif | |||||
} | |||||
switch (pin) { | |||||
case 1: CORE_PIN1_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
case 5: CORE_PIN5_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
#if defined(KINETISL) | |||||
case 4: CORE_PIN4_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(2); break; | |||||
#endif | |||||
} | |||||
} | |||||
tx_pin_num = pin; | |||||
} | |||||
void serial_set_rx(uint8_t pin) | |||||
{ | |||||
if (pin == rx_pin_num) return; | |||||
if ((SIM_SCGC4 & SIM_SCGC4_UART0)) { | |||||
switch (rx_pin_num) { | |||||
case 0: CORE_PIN0_CONFIG = 0; break; // PTB16 | |||||
case 21: CORE_PIN21_CONFIG = 0; break; // PTD6 | |||||
#if defined(KINETISL) | |||||
case 3: CORE_PIN3_CONFIG = 0; break; // PTA1 | |||||
#endif | |||||
} | |||||
switch (pin) { | |||||
case 0: CORE_PIN0_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
case 21: CORE_PIN21_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
#if defined(KINETISL) | |||||
case 3: CORE_PIN3_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(2); break; | |||||
#endif | |||||
} | |||||
} | |||||
rx_pin_num = pin; | |||||
} | |||||
int serial_set_rts(uint8_t pin) | int serial_set_rts(uint8_t pin) | ||||
{ | { | ||||
if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; | if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return 0; |
static volatile uint8_t rx_buffer_head = 0; | static volatile uint8_t rx_buffer_head = 0; | ||||
static volatile uint8_t rx_buffer_tail = 0; | static volatile uint8_t rx_buffer_tail = 0; | ||||
#endif | #endif | ||||
#if defined(KINETISK) | |||||
static uint8_t rx_pin_num = 9; | |||||
static uint8_t tx_pin_num = 10; | |||||
#endif | |||||
// UART0 and UART1 are clocked by F_CPU, UART2 is clocked by F_BUS | // UART0 and UART1 are clocked by F_CPU, UART2 is clocked by F_BUS | ||||
// UART0 has 8 byte fifo, UART1 and UART2 have 1 byte buffer | // UART0 has 8 byte fifo, UART1 and UART2 have 1 byte buffer | ||||
tx_buffer_head = 0; | tx_buffer_head = 0; | ||||
tx_buffer_tail = 0; | tx_buffer_tail = 0; | ||||
transmitting = 0; | transmitting = 0; | ||||
#if defined(KINETISK) | |||||
switch (rx_pin_num) { | |||||
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
} | |||||
switch (tx_pin_num) { | |||||
case 10: CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
case 31: CORE_PIN31_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
} | |||||
#elif defined(KINETISL) | |||||
CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | ||||
CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | ||||
#endif | |||||
#if defined(HAS_KINETISK_UART1) | #if defined(HAS_KINETISK_UART1) | ||||
UART1_BDH = (divisor >> 13) & 0x1F; | UART1_BDH = (divisor >> 13) & 0x1F; | ||||
UART1_BDL = (divisor >> 5) & 0xFF; | UART1_BDL = (divisor >> 5) & 0xFF; | ||||
#endif | #endif | ||||
} | } | ||||
void serial2_set_tx(uint8_t pin) | |||||
{ | |||||
#if defined(KINETISK) | |||||
if (pin == tx_pin_num) return; | |||||
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |||||
switch (tx_pin_num) { | |||||
case 10: CORE_PIN10_CONFIG = 0; break; // PTC4 | |||||
case 31: CORE_PIN31_CONFIG = 0; break; // PTE0 | |||||
} | |||||
switch (pin) { | |||||
case 10: CORE_PIN10_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
case 31: CORE_PIN31_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
} | |||||
} | |||||
tx_pin_num = pin; | |||||
#endif | |||||
} | |||||
void serial2_set_rx(uint8_t pin) | |||||
{ | |||||
#if defined(KINETISK) | |||||
if (pin == rx_pin_num) return; | |||||
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |||||
switch (rx_pin_num) { | |||||
case 9: CORE_PIN9_CONFIG = 0; break; // PTC3 | |||||
case 26: CORE_PIN26_CONFIG = 0; break; // PTE1 | |||||
} | |||||
switch (pin) { | |||||
case 9: CORE_PIN9_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
case 26: CORE_PIN26_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
} | |||||
} | |||||
rx_pin_num = pin; | |||||
#endif | |||||
} | |||||
int serial2_set_rts(uint8_t pin) | int serial2_set_rts(uint8_t pin) | ||||
{ | { | ||||
if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; | if (!(SIM_SCGC4 & SIM_SCGC4_UART1)) return 0; |
static volatile uint8_t rx_buffer_head = 0; | static volatile uint8_t rx_buffer_head = 0; | ||||
static volatile uint8_t rx_buffer_tail = 0; | static volatile uint8_t rx_buffer_tail = 0; | ||||
#endif | #endif | ||||
#if defined(KINETISL) | |||||
static uint8_t rx_pin_num = 7; | |||||
static uint8_t tx_pin_num = 8; | |||||
#endif | |||||
// UART0 and UART1 are clocked by F_CPU, UART2 is clocked by F_BUS | // UART0 and UART1 are clocked by F_CPU, UART2 is clocked by F_BUS | ||||
// UART0 has 8 byte fifo, UART1 and UART2 have 1 byte buffer | // UART0 has 8 byte fifo, UART1 and UART2 have 1 byte buffer | ||||
tx_buffer_head = 0; | tx_buffer_head = 0; | ||||
tx_buffer_tail = 0; | tx_buffer_tail = 0; | ||||
transmitting = 0; | transmitting = 0; | ||||
#if defined(KINETISK) | |||||
CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); | ||||
CORE_PIN8_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | CORE_PIN8_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); | ||||
#elif defined(KINETISL) | |||||
switch (rx_pin_num) { | |||||
case 7: CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
case 6: CORE_PIN6_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
} | |||||
switch (tx_pin_num) { | |||||
case 8: CORE_PIN8_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
case 20: CORE_PIN20_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
} | |||||
#endif | |||||
#if defined(HAS_KINETISK_UART2) | #if defined(HAS_KINETISK_UART2) | ||||
UART2_BDH = (divisor >> 13) & 0x1F; | UART2_BDH = (divisor >> 13) & 0x1F; | ||||
UART2_BDL = (divisor >> 5) & 0xFF; | UART2_BDL = (divisor >> 5) & 0xFF; | ||||
#endif | #endif | ||||
} | } | ||||
void serial3_set_tx(uint8_t pin) | |||||
{ | |||||
#if defined(KINETISL) | |||||
if (pin == tx_pin_num) return; | |||||
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |||||
switch (tx_pin_num) { | |||||
case 8: CORE_PIN8_CONFIG = 0; break; // PTD3 | |||||
case 20: CORE_PIN20_CONFIG = 0; break; // PTD5 | |||||
} | |||||
switch (pin) { | |||||
case 8: CORE_PIN8_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
case 20: CORE_PIN20_CONFIG = PORT_PCR_DSE | PORT_PCR_SRE | PORT_PCR_MUX(3); break; | |||||
} | |||||
} | |||||
tx_pin_num = pin; | |||||
#endif | |||||
} | |||||
void serial3_set_rx(uint8_t pin) | |||||
{ | |||||
#if defined(KINETISL) | |||||
if (pin == rx_pin_num) return; | |||||
if ((SIM_SCGC4 & SIM_SCGC4_UART2)) { | |||||
switch (rx_pin_num) { | |||||
case 7: CORE_PIN7_CONFIG = 0; break; // PTD2 | |||||
case 6: CORE_PIN6_CONFIG = 0; break; // PTD4 | |||||
} | |||||
switch (pin) { | |||||
case 7: CORE_PIN7_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
case 6: CORE_PIN6_CONFIG = PORT_PCR_PE | PORT_PCR_PS | PORT_PCR_PFE | PORT_PCR_MUX(3); break; | |||||
} | |||||
} | |||||
rx_pin_num = pin; | |||||
#endif | |||||
} | |||||
int serial3_set_rts(uint8_t pin) | int serial3_set_rts(uint8_t pin) | ||||
{ | { | ||||
if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; | if (!(SIM_SCGC4 & SIM_SCGC4_UART2)) return 0; |