USB to UART bridge
Fork of XBee-ExplorerLite by
UART | pinout |
---|---|
TXD | p9 |
RXD | p10 |
RTS | p5 |
DTR | p6 |
Windows serial driver:
https://developer.mbed.org/handbook/USBSerial
https://developer.mbed.org/media/uploads/samux/serial.zip
BaseUsbUartBridge.cpp@2:79ca417c25b2, 2015-08-11 (annotated)
- Committer:
- va009039
- Date:
- Tue Aug 11 23:07:42 2015 +0000
- Revision:
- 2:79ca417c25b2
- Parent:
- 1:3d02f8b77d68
add LPC11U35
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:9b1aa393acb3 | 1 | #include "BaseUsbUartBridge.h" |
va009039 | 0:9b1aa393acb3 | 2 | |
va009039 | 0:9b1aa393acb3 | 3 | // http://mbed.org/handbook/USBSerial |
va009039 | 0:9b1aa393acb3 | 4 | // http://mbed.org/media/uploads/samux/serial.zip |
va009039 | 0:9b1aa393acb3 | 5 | |
va009039 | 0:9b1aa393acb3 | 6 | BaseUsbUartBridge::BaseUsbUartBridge(PinName tx, PinName rx, int uart_buf_size, int usb_buf_size) |
va009039 | 0:9b1aa393acb3 | 7 | : SerialBase(tx, rx), USBCDC(0x1f00, 0x2012, 0x0001, true), |
va009039 | 0:9b1aa393acb3 | 8 | uart_buf(uart_buf_size), usb_buf(usb_buf_size) |
va009039 | 0:9b1aa393acb3 | 9 | { |
va009039 | 0:9b1aa393acb3 | 10 | SerialBase::attach(this, &BaseUsbUartBridge::uart_handler, RxIrq); |
va009039 | 0:9b1aa393acb3 | 11 | } |
va009039 | 0:9b1aa393acb3 | 12 | |
va009039 | 0:9b1aa393acb3 | 13 | void BaseUsbUartBridge::poll() |
va009039 | 0:9b1aa393acb3 | 14 | { |
va009039 | 0:9b1aa393acb3 | 15 | uint8_t c; |
va009039 | 0:9b1aa393acb3 | 16 | int size = uart_buf.available(); |
va009039 | 0:9b1aa393acb3 | 17 | if (size > 0) { |
va009039 | 0:9b1aa393acb3 | 18 | uint8_t buf[MAX_PACKET_SIZE_EPBULK]; |
va009039 | 0:9b1aa393acb3 | 19 | if (size > sizeof(buf)) { |
va009039 | 0:9b1aa393acb3 | 20 | size = sizeof(buf); |
va009039 | 0:9b1aa393acb3 | 21 | } |
va009039 | 0:9b1aa393acb3 | 22 | for(int i = 0; i < size; i++) { |
va009039 | 0:9b1aa393acb3 | 23 | uart_buf.dequeue(&c); |
va009039 | 0:9b1aa393acb3 | 24 | buf[i] = c; |
va009039 | 0:9b1aa393acb3 | 25 | monitor(_UART, c); |
va009039 | 0:9b1aa393acb3 | 26 | } |
va009039 | 0:9b1aa393acb3 | 27 | if (terminal_connected) { |
va009039 | 0:9b1aa393acb3 | 28 | USBCDC::send(buf, size); |
va009039 | 0:9b1aa393acb3 | 29 | } |
va009039 | 0:9b1aa393acb3 | 30 | } |
va009039 | 0:9b1aa393acb3 | 31 | |
va009039 | 0:9b1aa393acb3 | 32 | if (usb_buf.dequeue(&c)) { |
va009039 | 0:9b1aa393acb3 | 33 | SerialBase::_base_putc(c); |
va009039 | 0:9b1aa393acb3 | 34 | monitor(_USB, c); |
va009039 | 0:9b1aa393acb3 | 35 | } |
va009039 | 0:9b1aa393acb3 | 36 | } |
va009039 | 0:9b1aa393acb3 | 37 | |
va009039 | 0:9b1aa393acb3 | 38 | void BaseUsbUartBridge::uart_handler(void) |
va009039 | 0:9b1aa393acb3 | 39 | { |
va009039 | 0:9b1aa393acb3 | 40 | uint8_t c = SerialBase::_base_getc(); |
va009039 | 0:9b1aa393acb3 | 41 | uart_buf.queue(c); |
va009039 | 0:9b1aa393acb3 | 42 | } |
va009039 | 0:9b1aa393acb3 | 43 | |
va009039 | 0:9b1aa393acb3 | 44 | bool BaseUsbUartBridge::bulk_callback() |
va009039 | 0:9b1aa393acb3 | 45 | { |
va009039 | 0:9b1aa393acb3 | 46 | uint8_t c[65]; |
va009039 | 0:9b1aa393acb3 | 47 | uint32_t size = 0; |
va009039 | 0:9b1aa393acb3 | 48 | |
va009039 | 0:9b1aa393acb3 | 49 | //we read the packet received and put it on the circular buffer |
va009039 | 0:9b1aa393acb3 | 50 | readEP(c, &size); |
va009039 | 0:9b1aa393acb3 | 51 | for (uint32_t i = 0; i < size; i++) { |
va009039 | 0:9b1aa393acb3 | 52 | usb_buf.queue(c[i]); |
va009039 | 0:9b1aa393acb3 | 53 | } |
va009039 | 0:9b1aa393acb3 | 54 | |
va009039 | 0:9b1aa393acb3 | 55 | // We reactivate the endpoint to receive next characters |
va009039 | 0:9b1aa393acb3 | 56 | readStart(EPBULK_OUT, MAX_PACKET_SIZE_EPBULK); |
va009039 | 0:9b1aa393acb3 | 57 | return true; |
va009039 | 0:9b1aa393acb3 | 58 | } |
va009039 | 0:9b1aa393acb3 | 59 | |
va009039 |
1:3d02f8b77d68 | 60 | /* virtual */ void BaseUsbUartBridge::lineCodingChanged(int baud, int bits, int parity, int stop) |
va009039 |
1:3d02f8b77d68 | 61 | { |
va009039 |
1:3d02f8b77d68 | 62 | SerialBase::baud(baud); |
va009039 |
1:3d02f8b77d68 | 63 | } |
va009039 |
1:3d02f8b77d68 | 64 | |
va009039 |
1:3d02f8b77d68 | 65 | /* virtual */ void BaseUsbUartBridge::sendBreak(uint16_t duration) |
va009039 |
1:3d02f8b77d68 | 66 | { |
va009039 |
1:3d02f8b77d68 | 67 | SerialBase::send_break(); |
va009039 |
1:3d02f8b77d68 | 68 | }; |
va009039 |
1:3d02f8b77d68 | 69 |