| rx_buffer_tail = 0; | rx_buffer_tail = 0; | ||||
| } | } | ||||
| void HardwareSerial::transmitterEnable(uint8_t pin) | |||||
| { | |||||
| while (transmitting) ; | |||||
| pinMode(pin, OUTPUT); | |||||
| digitalWrite(pin, LOW); | |||||
| tx_enable_pin = pin; | |||||
| } | |||||
| int HardwareSerial::available(void) | int HardwareSerial::available(void) | ||||
| { | { | ||||
| uint8_t head, tail; | uint8_t head, tail; |
| } | } | ||||
| void _begin(uint16_t baud_count, uint8_t pin); | void _begin(uint16_t baud_count, uint8_t pin); | ||||
| void end(void); | void end(void); | ||||
| void transmitterEnable(uint8_t pin); | |||||
| virtual int available(void); | virtual int available(void); | ||||
| virtual int peek(void); | virtual int peek(void); | ||||
| virtual int read(void); | virtual int read(void); |
| void serial_begin(uint32_t divisor); | void serial_begin(uint32_t divisor); | ||||
| 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_putchar(uint32_t c); | void serial_putchar(uint32_t c); | ||||
| void serial_write(const void *buf, unsigned int count); | void serial_write(const void *buf, unsigned int count); | ||||
| void serial_flush(void); | void serial_flush(void); | ||||
| serial_begin(BAUD2DIV(baud)); | serial_begin(BAUD2DIV(baud)); | ||||
| 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 int available(void) { return serial_available(); } | virtual int available(void) { return serial_available(); } | ||||
| virtual int peek(void) { return serial_peek(); } | virtual int peek(void) { return serial_peek(); } | ||||
| virtual int read(void) { return serial_getchar(); } | virtual int read(void) { return serial_getchar(); } | ||||
| virtual void flush(void) { serial_flush(); } | virtual void flush(void) { serial_flush(); } | ||||
| virtual void clear(void) { serial_clear(); } | |||||
| virtual void clear(void) { serial_clear(); } | |||||
| virtual size_t write(uint8_t c) { serial_putchar(c); return 1; } | virtual size_t write(uint8_t c) { serial_putchar(c); return 1; } | ||||
| size_t write(unsigned long n) { return write((uint8_t)n); } | size_t write(unsigned long n) { return write((uint8_t)n); } | ||||
| size_t write(long n) { return write((uint8_t)n); } | size_t write(long n) { return write((uint8_t)n); } | ||||
| virtual int peek(void) { return serial2_peek(); } | virtual int peek(void) { return serial2_peek(); } | ||||
| virtual int read(void) { return serial2_getchar(); } | virtual int read(void) { return serial2_getchar(); } | ||||
| virtual void flush(void) { serial2_flush(); } | virtual void flush(void) { serial2_flush(); } | ||||
| virtual void clear(void) { serial2_clear(); } | |||||
| virtual void clear(void) { serial2_clear(); } | |||||
| virtual size_t write(uint8_t c) { serial2_putchar(c); return 1; } | virtual size_t write(uint8_t c) { serial2_putchar(c); return 1; } | ||||
| size_t write(unsigned long n) { return write((uint8_t)n); } | size_t write(unsigned long n) { return write((uint8_t)n); } | ||||
| size_t write(long n) { return write((uint8_t)n); } | size_t write(long n) { return write((uint8_t)n); } | ||||
| virtual int peek(void) { return serial3_peek(); } | virtual int peek(void) { return serial3_peek(); } | ||||
| virtual int read(void) { return serial3_getchar(); } | virtual int read(void) { return serial3_getchar(); } | ||||
| virtual void flush(void) { serial3_flush(); } | virtual void flush(void) { serial3_flush(); } | ||||
| virtual void clear(void) { serial3_clear(); } | |||||
| virtual void clear(void) { serial3_clear(); } | |||||
| virtual size_t write(uint8_t c) { serial3_putchar(c); return 1; } | virtual size_t write(uint8_t c) { serial3_putchar(c); return 1; } | ||||
| size_t write(unsigned long n) { return write((uint8_t)n); } | size_t write(unsigned long n) { return write((uint8_t)n); } | ||||
| size_t write(long n) { return write((uint8_t)n); } | size_t write(long n) { return write((uint8_t)n); } |
| static volatile BUFTYPE tx_buffer[TX_BUFFER_SIZE]; | static volatile BUFTYPE tx_buffer[TX_BUFFER_SIZE]; | ||||
| static volatile BUFTYPE rx_buffer[RX_BUFFER_SIZE]; | static volatile BUFTYPE rx_buffer[RX_BUFFER_SIZE]; | ||||
| static volatile uint8_t transmitting = 0; | static volatile uint8_t transmitting = 0; | ||||
| static volatile uint8_t *transmit_pin=NULL; | |||||
| #if TX_BUFFER_SIZE > 255 | #if TX_BUFFER_SIZE > 255 | ||||
| static volatile uint16_t tx_buffer_head = 0; | static volatile uint16_t tx_buffer_head = 0; | ||||
| static volatile uint16_t tx_buffer_tail = 0; | static volatile uint16_t tx_buffer_tail = 0; | ||||
| rx_buffer_tail = 0; | rx_buffer_tail = 0; | ||||
| } | } | ||||
| void serial_set_transmit_pin(uint8_t pin) | |||||
| { | |||||
| while (transmitting) ; | |||||
| pinMode(pin, OUTPUT); | |||||
| digitalWrite(pin, LOW); | |||||
| transmit_pin = portOutputRegister(pin); | |||||
| } | |||||
| void serial_putchar(uint32_t c) | void serial_putchar(uint32_t c) | ||||
| { | { | ||||
| uint32_t head; | |||||
| uint32_t head, n; | |||||
| if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | ||||
| if (transmit_pin) *transmit_pin = 1; | |||||
| head = tx_buffer_head; | head = tx_buffer_head; | ||||
| if (++head >= TX_BUFFER_SIZE) head = 0; | if (++head >= TX_BUFFER_SIZE) head = 0; | ||||
| while (tx_buffer_tail == head) { | while (tx_buffer_tail == head) { | ||||
| if ((UART0_S1 & UART_S1_TDRE)) { | if ((UART0_S1 & UART_S1_TDRE)) { | ||||
| uint32_t tail = tx_buffer_tail; | uint32_t tail = tx_buffer_tail; | ||||
| if (++tail >= TX_BUFFER_SIZE) tail = 0; | if (++tail >= TX_BUFFER_SIZE) tail = 0; | ||||
| UART0_D = tx_buffer[tail]; | |||||
| n = tx_buffer[tail]; | |||||
| if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |||||
| UART0_D = n; | |||||
| tx_buffer_tail = tail; | tx_buffer_tail = tail; | ||||
| } | } | ||||
| } else if (priority >= 256) { | } else if (priority >= 256) { | ||||
| { | { | ||||
| const uint8_t *p = (const uint8_t *)buf; | const uint8_t *p = (const uint8_t *)buf; | ||||
| const uint8_t *end = p + count; | const uint8_t *end = p + count; | ||||
| uint32_t head; | |||||
| uint32_t head, n; | |||||
| if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | if (!(SIM_SCGC4 & SIM_SCGC4_UART0)) return; | ||||
| if (transmit_pin) *transmit_pin = 1; | |||||
| while (p < end) { | while (p < end) { | ||||
| head = tx_buffer_head; | head = tx_buffer_head; | ||||
| if (++head >= TX_BUFFER_SIZE) head = 0; | if (++head >= TX_BUFFER_SIZE) head = 0; | ||||
| if ((UART0_S1 & UART_S1_TDRE)) { | if ((UART0_S1 & UART_S1_TDRE)) { | ||||
| uint32_t tail = tx_buffer_tail; | uint32_t tail = tx_buffer_tail; | ||||
| if (++tail >= TX_BUFFER_SIZE) tail = 0; | if (++tail >= TX_BUFFER_SIZE) tail = 0; | ||||
| UART0_D = tx_buffer[tail]; | |||||
| n = tx_buffer[tail]; | |||||
| if (use9Bits) UART0_C3 = (UART0_C3 & ~0x40) | ((n & 0x100) >> 2); | |||||
| UART0_D = n; | |||||
| tx_buffer_tail = tail; | tx_buffer_tail = tail; | ||||
| } | } | ||||
| } else if (priority >= 256) { | } else if (priority >= 256) { | ||||
| } | } | ||||
| if ((c & UART_C2_TCIE) && (UART0_S1 & UART_S1_TC)) { | if ((c & UART_C2_TCIE) && (UART0_S1 & UART_S1_TC)) { | ||||
| transmitting = 0; | transmitting = 0; | ||||
| if (transmit_pin) *transmit_pin = 0; | |||||
| UART0_C2 = C2_TX_INACTIVE; | UART0_C2 = C2_TX_INACTIVE; | ||||
| } | } | ||||
| } | } |