USBHost library with fixes

Dependencies:   mbed-rtos FATFileSystem

Dependents:   mbedica

Committer:
zrussell3
Date:
Thu Dec 13 19:24:21 2018 +0000
Revision:
0:b176d95bb38f
Modified USBHost library to fix modifier input

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zrussell3 0:b176d95bb38f 1 /* mbed USBHost Library
zrussell3 0:b176d95bb38f 2 * Copyright (c) 2006-2013 ARM Limited
zrussell3 0:b176d95bb38f 3 *
zrussell3 0:b176d95bb38f 4 * Licensed under the Apache License, Version 2.0 (the "License");
zrussell3 0:b176d95bb38f 5 * you may not use this file except in compliance with the License.
zrussell3 0:b176d95bb38f 6 * You may obtain a copy of the License at
zrussell3 0:b176d95bb38f 7 *
zrussell3 0:b176d95bb38f 8 * http://www.apache.org/licenses/LICENSE-2.0
zrussell3 0:b176d95bb38f 9 *
zrussell3 0:b176d95bb38f 10 * Unless required by applicable law or agreed to in writing, software
zrussell3 0:b176d95bb38f 11 * distributed under the License is distributed on an "AS IS" BASIS,
zrussell3 0:b176d95bb38f 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
zrussell3 0:b176d95bb38f 13 * See the License for the specific language governing permissions and
zrussell3 0:b176d95bb38f 14 * limitations under the License.
zrussell3 0:b176d95bb38f 15 */
zrussell3 0:b176d95bb38f 16
zrussell3 0:b176d95bb38f 17 #include "USBHostSerial.h"
zrussell3 0:b176d95bb38f 18
zrussell3 0:b176d95bb38f 19 #if USBHOST_SERIAL
zrussell3 0:b176d95bb38f 20
zrussell3 0:b176d95bb38f 21 #include "dbg.h"
zrussell3 0:b176d95bb38f 22
zrussell3 0:b176d95bb38f 23 #define CHECK_INTERFACE(cls,subcls,proto) \
zrussell3 0:b176d95bb38f 24 (((cls == 0xFF) && (subcls == 0xFF) && (proto == 0xFF)) /* QUALCOM CDC */ || \
zrussell3 0:b176d95bb38f 25 ((cls == SERIAL_CLASS) && (subcls == 0x00) && (proto == 0x00)) /* STANDARD CDC */ )
zrussell3 0:b176d95bb38f 26
zrussell3 0:b176d95bb38f 27 #if (USBHOST_SERIAL <= 1)
zrussell3 0:b176d95bb38f 28
zrussell3 0:b176d95bb38f 29 USBHostSerial::USBHostSerial()
zrussell3 0:b176d95bb38f 30 {
zrussell3 0:b176d95bb38f 31 host = USBHost::getHostInst();
zrussell3 0:b176d95bb38f 32 ports_found = 0;
zrussell3 0:b176d95bb38f 33 dev_connected = false;
zrussell3 0:b176d95bb38f 34 }
zrussell3 0:b176d95bb38f 35
zrussell3 0:b176d95bb38f 36 bool USBHostSerial::connected()
zrussell3 0:b176d95bb38f 37 {
zrussell3 0:b176d95bb38f 38 return dev_connected;
zrussell3 0:b176d95bb38f 39 }
zrussell3 0:b176d95bb38f 40
zrussell3 0:b176d95bb38f 41 void USBHostSerial::disconnect(void)
zrussell3 0:b176d95bb38f 42 {
zrussell3 0:b176d95bb38f 43 ports_found = 0;
zrussell3 0:b176d95bb38f 44 dev = NULL;
zrussell3 0:b176d95bb38f 45 }
zrussell3 0:b176d95bb38f 46
zrussell3 0:b176d95bb38f 47 bool USBHostSerial::connect() {
zrussell3 0:b176d95bb38f 48
zrussell3 0:b176d95bb38f 49 if (dev)
zrussell3 0:b176d95bb38f 50 {
zrussell3 0:b176d95bb38f 51 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
zrussell3 0:b176d95bb38f 52 {
zrussell3 0:b176d95bb38f 53 USBDeviceConnected* d = host->getDevice(i);
zrussell3 0:b176d95bb38f 54 if (dev == d)
zrussell3 0:b176d95bb38f 55 return true;
zrussell3 0:b176d95bb38f 56 }
zrussell3 0:b176d95bb38f 57 disconnect();
zrussell3 0:b176d95bb38f 58 }
zrussell3 0:b176d95bb38f 59 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
zrussell3 0:b176d95bb38f 60 {
zrussell3 0:b176d95bb38f 61 USBDeviceConnected* d = host->getDevice(i);
zrussell3 0:b176d95bb38f 62 if (d != NULL) {
zrussell3 0:b176d95bb38f 63
zrussell3 0:b176d95bb38f 64 USB_DBG("Trying to connect serial device \r\n");
zrussell3 0:b176d95bb38f 65 if(host->enumerate(d, this))
zrussell3 0:b176d95bb38f 66 break;
zrussell3 0:b176d95bb38f 67
zrussell3 0:b176d95bb38f 68 USBEndpoint* bulk_in = d->getEndpoint(port_intf, BULK_ENDPOINT, IN);
zrussell3 0:b176d95bb38f 69 USBEndpoint* bulk_out = d->getEndpoint(port_intf, BULK_ENDPOINT, OUT);
zrussell3 0:b176d95bb38f 70 if (bulk_in && bulk_out)
zrussell3 0:b176d95bb38f 71 {
zrussell3 0:b176d95bb38f 72 USBHostSerialPort::connect(host,d,port_intf,bulk_in, bulk_out);
zrussell3 0:b176d95bb38f 73 dev = d;
zrussell3 0:b176d95bb38f 74 }
zrussell3 0:b176d95bb38f 75 }
zrussell3 0:b176d95bb38f 76 }
zrussell3 0:b176d95bb38f 77 return dev != NULL;
zrussell3 0:b176d95bb38f 78 }
zrussell3 0:b176d95bb38f 79
zrussell3 0:b176d95bb38f 80 /*virtual*/ void USBHostSerial::setVidPid(uint16_t vid, uint16_t pid)
zrussell3 0:b176d95bb38f 81 {
zrussell3 0:b176d95bb38f 82 // we don't check VID/PID for MSD driver
zrussell3 0:b176d95bb38f 83 }
zrussell3 0:b176d95bb38f 84
zrussell3 0:b176d95bb38f 85 /*virtual*/ bool USBHostSerial::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
zrussell3 0:b176d95bb38f 86 {
zrussell3 0:b176d95bb38f 87 if (!ports_found &&
zrussell3 0:b176d95bb38f 88 CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
zrussell3 0:b176d95bb38f 89 port_intf = intf_nb;
zrussell3 0:b176d95bb38f 90 ports_found = true;
zrussell3 0:b176d95bb38f 91 return true;
zrussell3 0:b176d95bb38f 92 }
zrussell3 0:b176d95bb38f 93 return false;
zrussell3 0:b176d95bb38f 94 }
zrussell3 0:b176d95bb38f 95
zrussell3 0:b176d95bb38f 96 /*virtual*/ bool USBHostSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
zrussell3 0:b176d95bb38f 97 {
zrussell3 0:b176d95bb38f 98 if (ports_found && (intf_nb == port_intf)) {
zrussell3 0:b176d95bb38f 99 if (type == BULK_ENDPOINT)
zrussell3 0:b176d95bb38f 100 return true;
zrussell3 0:b176d95bb38f 101 }
zrussell3 0:b176d95bb38f 102 return false;
zrussell3 0:b176d95bb38f 103 }
zrussell3 0:b176d95bb38f 104
zrussell3 0:b176d95bb38f 105 #else // (USBHOST_SERIAL > 1)
zrussell3 0:b176d95bb38f 106
zrussell3 0:b176d95bb38f 107 //------------------------------------------------------------------------------
zrussell3 0:b176d95bb38f 108
zrussell3 0:b176d95bb38f 109 USBHostMultiSerial::USBHostMultiSerial()
zrussell3 0:b176d95bb38f 110 {
zrussell3 0:b176d95bb38f 111 host = USBHost::getHostInst();
zrussell3 0:b176d95bb38f 112 dev = NULL;
zrussell3 0:b176d95bb38f 113 memset(ports, NULL, sizeof(ports));
zrussell3 0:b176d95bb38f 114 ports_found = 0;
zrussell3 0:b176d95bb38f 115 dev_connected = false;
zrussell3 0:b176d95bb38f 116 }
zrussell3 0:b176d95bb38f 117
zrussell3 0:b176d95bb38f 118 USBHostMultiSerial::~USBHostMultiSerial()
zrussell3 0:b176d95bb38f 119 {
zrussell3 0:b176d95bb38f 120 disconnect();
zrussell3 0:b176d95bb38f 121 }
zrussell3 0:b176d95bb38f 122
zrussell3 0:b176d95bb38f 123 bool USBHostMultiSerial::connected()
zrussell3 0:b176d95bb38f 124 {
zrussell3 0:b176d95bb38f 125 return dev_connected;
zrussell3 0:b176d95bb38f 126 }
zrussell3 0:b176d95bb38f 127
zrussell3 0:b176d95bb38f 128 void USBHostMultiSerial::disconnect(void)
zrussell3 0:b176d95bb38f 129 {
zrussell3 0:b176d95bb38f 130 for (int port = 0; port < USBHOST_SERIAL; port ++)
zrussell3 0:b176d95bb38f 131 {
zrussell3 0:b176d95bb38f 132 if (ports[port])
zrussell3 0:b176d95bb38f 133 {
zrussell3 0:b176d95bb38f 134 delete ports[port];
zrussell3 0:b176d95bb38f 135 ports[port] = NULL;
zrussell3 0:b176d95bb38f 136 }
zrussell3 0:b176d95bb38f 137 }
zrussell3 0:b176d95bb38f 138 ports_found = 0;
zrussell3 0:b176d95bb38f 139 dev = NULL;
zrussell3 0:b176d95bb38f 140 }
zrussell3 0:b176d95bb38f 141
zrussell3 0:b176d95bb38f 142 bool USBHostMultiSerial::connect() {
zrussell3 0:b176d95bb38f 143
zrussell3 0:b176d95bb38f 144 if (dev)
zrussell3 0:b176d95bb38f 145 {
zrussell3 0:b176d95bb38f 146 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
zrussell3 0:b176d95bb38f 147 {
zrussell3 0:b176d95bb38f 148 USBDeviceConnected* d = host->getDevice(i);
zrussell3 0:b176d95bb38f 149 if (dev == d)
zrussell3 0:b176d95bb38f 150 return true;
zrussell3 0:b176d95bb38f 151 }
zrussell3 0:b176d95bb38f 152 disconnect();
zrussell3 0:b176d95bb38f 153 }
zrussell3 0:b176d95bb38f 154 for (uint8_t i = 0; i < MAX_DEVICE_CONNECTED; i++)
zrussell3 0:b176d95bb38f 155 {
zrussell3 0:b176d95bb38f 156 USBDeviceConnected* d = host->getDevice(i);
zrussell3 0:b176d95bb38f 157 if (d != NULL) {
zrussell3 0:b176d95bb38f 158
zrussell3 0:b176d95bb38f 159 USB_DBG("Trying to connect serial device \r\n");
zrussell3 0:b176d95bb38f 160 if(host->enumerate(d, this))
zrussell3 0:b176d95bb38f 161 break;
zrussell3 0:b176d95bb38f 162
zrussell3 0:b176d95bb38f 163 for (int port = 0; port < ports_found; port ++)
zrussell3 0:b176d95bb38f 164 {
zrussell3 0:b176d95bb38f 165 USBEndpoint* bulk_in = d->getEndpoint(port_intf[port], BULK_ENDPOINT, IN);
zrussell3 0:b176d95bb38f 166 USBEndpoint* bulk_out = d->getEndpoint(port_intf[port], BULK_ENDPOINT, OUT);
zrussell3 0:b176d95bb38f 167 if (bulk_in && bulk_out)
zrussell3 0:b176d95bb38f 168 {
zrussell3 0:b176d95bb38f 169 ports[port] = new USBHostSerialPort();
zrussell3 0:b176d95bb38f 170 if (ports[port])
zrussell3 0:b176d95bb38f 171 {
zrussell3 0:b176d95bb38f 172 ports[port]->connect(host,d,port_intf[port],bulk_in, bulk_out);
zrussell3 0:b176d95bb38f 173 dev = d;
zrussell3 0:b176d95bb38f 174 }
zrussell3 0:b176d95bb38f 175 }
zrussell3 0:b176d95bb38f 176 }
zrussell3 0:b176d95bb38f 177 }
zrussell3 0:b176d95bb38f 178 }
zrussell3 0:b176d95bb38f 179 return dev != NULL;
zrussell3 0:b176d95bb38f 180 }
zrussell3 0:b176d95bb38f 181
zrussell3 0:b176d95bb38f 182 /*virtual*/ void USBHostMultiSerial::setVidPid(uint16_t vid, uint16_t pid)
zrussell3 0:b176d95bb38f 183 {
zrussell3 0:b176d95bb38f 184 // we don't check VID/PID for MSD driver
zrussell3 0:b176d95bb38f 185 }
zrussell3 0:b176d95bb38f 186
zrussell3 0:b176d95bb38f 187 /*virtual*/ bool USBHostMultiSerial::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
zrussell3 0:b176d95bb38f 188 {
zrussell3 0:b176d95bb38f 189 if ((ports_found < USBHOST_SERIAL) &&
zrussell3 0:b176d95bb38f 190 CHECK_INTERFACE(intf_class, intf_subclass, intf_protocol)) {
zrussell3 0:b176d95bb38f 191 port_intf[ports_found++] = intf_nb;
zrussell3 0:b176d95bb38f 192 return true;
zrussell3 0:b176d95bb38f 193 }
zrussell3 0:b176d95bb38f 194 return false;
zrussell3 0:b176d95bb38f 195 }
zrussell3 0:b176d95bb38f 196
zrussell3 0:b176d95bb38f 197 /*virtual*/ bool USBHostMultiSerial::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
zrussell3 0:b176d95bb38f 198 {
zrussell3 0:b176d95bb38f 199 if ((ports_found > 0) && (intf_nb == port_intf[ports_found-1])) {
zrussell3 0:b176d95bb38f 200 if (type == BULK_ENDPOINT)
zrussell3 0:b176d95bb38f 201 return true;
zrussell3 0:b176d95bb38f 202 }
zrussell3 0:b176d95bb38f 203 return false;
zrussell3 0:b176d95bb38f 204 }
zrussell3 0:b176d95bb38f 205
zrussell3 0:b176d95bb38f 206 #endif
zrussell3 0:b176d95bb38f 207
zrussell3 0:b176d95bb38f 208 //------------------------------------------------------------------------------
zrussell3 0:b176d95bb38f 209
zrussell3 0:b176d95bb38f 210 #define SET_LINE_CODING 0x20
zrussell3 0:b176d95bb38f 211
zrussell3 0:b176d95bb38f 212 USBHostSerialPort::USBHostSerialPort(): circ_buf()
zrussell3 0:b176d95bb38f 213 {
zrussell3 0:b176d95bb38f 214 init();
zrussell3 0:b176d95bb38f 215 }
zrussell3 0:b176d95bb38f 216
zrussell3 0:b176d95bb38f 217 void USBHostSerialPort::init(void)
zrussell3 0:b176d95bb38f 218 {
zrussell3 0:b176d95bb38f 219 host = NULL;
zrussell3 0:b176d95bb38f 220 dev = NULL;
zrussell3 0:b176d95bb38f 221 serial_intf = NULL;
zrussell3 0:b176d95bb38f 222 size_bulk_in = 0;
zrussell3 0:b176d95bb38f 223 size_bulk_out = 0;
zrussell3 0:b176d95bb38f 224 bulk_in = NULL;
zrussell3 0:b176d95bb38f 225 bulk_out = NULL;
zrussell3 0:b176d95bb38f 226 line_coding.baudrate = 9600;
zrussell3 0:b176d95bb38f 227 line_coding.data_bits = 8;
zrussell3 0:b176d95bb38f 228 line_coding.parity = None;
zrussell3 0:b176d95bb38f 229 line_coding.stop_bits = 1;
zrussell3 0:b176d95bb38f 230 circ_buf.flush();
zrussell3 0:b176d95bb38f 231 }
zrussell3 0:b176d95bb38f 232
zrussell3 0:b176d95bb38f 233 void USBHostSerialPort::connect(USBHost* _host, USBDeviceConnected * _dev,
zrussell3 0:b176d95bb38f 234 uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out)
zrussell3 0:b176d95bb38f 235 {
zrussell3 0:b176d95bb38f 236 host = _host;
zrussell3 0:b176d95bb38f 237 dev = _dev;
zrussell3 0:b176d95bb38f 238 serial_intf = _serial_intf;
zrussell3 0:b176d95bb38f 239 bulk_in = _bulk_in;
zrussell3 0:b176d95bb38f 240 bulk_out = _bulk_out;
zrussell3 0:b176d95bb38f 241
zrussell3 0:b176d95bb38f 242 USB_INFO("New Serial device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, serial_intf);
zrussell3 0:b176d95bb38f 243 dev->setName("Serial", serial_intf);
zrussell3 0:b176d95bb38f 244 host->registerDriver(dev, serial_intf, this, &USBHostSerialPort::init);
zrussell3 0:b176d95bb38f 245 //baud(9600);
zrussell3 0:b176d95bb38f 246 size_bulk_in = bulk_in->getSize();
zrussell3 0:b176d95bb38f 247 size_bulk_out = bulk_out->getSize();
zrussell3 0:b176d95bb38f 248 bulk_in->attach(this, &USBHostSerialPort::rxHandler);
zrussell3 0:b176d95bb38f 249 bulk_out->attach(this, &USBHostSerialPort::txHandler);
zrussell3 0:b176d95bb38f 250 host->bulkRead(dev, bulk_in, buf, size_bulk_in, false);
zrussell3 0:b176d95bb38f 251 }
zrussell3 0:b176d95bb38f 252
zrussell3 0:b176d95bb38f 253 void USBHostSerialPort::rxHandler() {
zrussell3 0:b176d95bb38f 254 if (bulk_in) {
zrussell3 0:b176d95bb38f 255 int len = bulk_in->getLengthTransferred();
zrussell3 0:b176d95bb38f 256 if (bulk_in->getState() == USB_TYPE_IDLE) {
zrussell3 0:b176d95bb38f 257 for (int i = 0; i < len; i++) {
zrussell3 0:b176d95bb38f 258 circ_buf.queue(buf[i]);
zrussell3 0:b176d95bb38f 259 }
zrussell3 0:b176d95bb38f 260 rx.call();
zrussell3 0:b176d95bb38f 261 host->bulkRead(dev, bulk_in, buf, size_bulk_in, false);
zrussell3 0:b176d95bb38f 262 }
zrussell3 0:b176d95bb38f 263 }
zrussell3 0:b176d95bb38f 264 }
zrussell3 0:b176d95bb38f 265
zrussell3 0:b176d95bb38f 266 void USBHostSerialPort::txHandler() {
zrussell3 0:b176d95bb38f 267 if (bulk_out) {
zrussell3 0:b176d95bb38f 268 if (bulk_out->getState() == USB_TYPE_IDLE) {
zrussell3 0:b176d95bb38f 269 tx.call();
zrussell3 0:b176d95bb38f 270 }
zrussell3 0:b176d95bb38f 271 }
zrussell3 0:b176d95bb38f 272 }
zrussell3 0:b176d95bb38f 273
zrussell3 0:b176d95bb38f 274 int USBHostSerialPort::_putc(int c) {
zrussell3 0:b176d95bb38f 275 if (bulk_out) {
zrussell3 0:b176d95bb38f 276 if (host->bulkWrite(dev, bulk_out, (uint8_t *)&c, 1) == USB_TYPE_OK) {
zrussell3 0:b176d95bb38f 277 return 1;
zrussell3 0:b176d95bb38f 278 }
zrussell3 0:b176d95bb38f 279 }
zrussell3 0:b176d95bb38f 280 return -1;
zrussell3 0:b176d95bb38f 281 }
zrussell3 0:b176d95bb38f 282
zrussell3 0:b176d95bb38f 283 void USBHostSerialPort::baud(int baudrate) {
zrussell3 0:b176d95bb38f 284 line_coding.baudrate = baudrate;
zrussell3 0:b176d95bb38f 285 format(line_coding.data_bits, (Parity)line_coding.parity, line_coding.stop_bits);
zrussell3 0:b176d95bb38f 286 }
zrussell3 0:b176d95bb38f 287
zrussell3 0:b176d95bb38f 288 void USBHostSerialPort::format(int bits, Parity parity, int stop_bits) {
zrussell3 0:b176d95bb38f 289 line_coding.data_bits = bits;
zrussell3 0:b176d95bb38f 290 line_coding.parity = parity;
zrussell3 0:b176d95bb38f 291 line_coding.stop_bits = (stop_bits == 1) ? 0 : 2;
zrussell3 0:b176d95bb38f 292
zrussell3 0:b176d95bb38f 293 // set line coding
zrussell3 0:b176d95bb38f 294 host->controlWrite( dev,
zrussell3 0:b176d95bb38f 295 USB_RECIPIENT_INTERFACE | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS,
zrussell3 0:b176d95bb38f 296 SET_LINE_CODING,
zrussell3 0:b176d95bb38f 297 0, serial_intf, (uint8_t *)&line_coding, 7);
zrussell3 0:b176d95bb38f 298 }
zrussell3 0:b176d95bb38f 299
zrussell3 0:b176d95bb38f 300 int USBHostSerialPort::_getc() {
zrussell3 0:b176d95bb38f 301 uint8_t c = 0;
zrussell3 0:b176d95bb38f 302 if (bulk_in == NULL) {
zrussell3 0:b176d95bb38f 303 init();
zrussell3 0:b176d95bb38f 304 return -1;
zrussell3 0:b176d95bb38f 305 }
zrussell3 0:b176d95bb38f 306 while (circ_buf.isEmpty());
zrussell3 0:b176d95bb38f 307 circ_buf.dequeue(&c);
zrussell3 0:b176d95bb38f 308 return c;
zrussell3 0:b176d95bb38f 309 }
zrussell3 0:b176d95bb38f 310
zrussell3 0:b176d95bb38f 311 int USBHostSerialPort::writeBuf(const char* b, int s)
zrussell3 0:b176d95bb38f 312 {
zrussell3 0:b176d95bb38f 313 int c = 0;
zrussell3 0:b176d95bb38f 314 if (bulk_out)
zrussell3 0:b176d95bb38f 315 {
zrussell3 0:b176d95bb38f 316 while (c < s)
zrussell3 0:b176d95bb38f 317 {
zrussell3 0:b176d95bb38f 318 int i = (s < size_bulk_out) ? s : size_bulk_out;
zrussell3 0:b176d95bb38f 319 if (host->bulkWrite(dev, bulk_out, (uint8_t *)(b+c), i) == USB_TYPE_OK)
zrussell3 0:b176d95bb38f 320 c += i;
zrussell3 0:b176d95bb38f 321 }
zrussell3 0:b176d95bb38f 322 }
zrussell3 0:b176d95bb38f 323 return s;
zrussell3 0:b176d95bb38f 324 }
zrussell3 0:b176d95bb38f 325
zrussell3 0:b176d95bb38f 326 int USBHostSerialPort::readBuf(char* b, int s)
zrussell3 0:b176d95bb38f 327 {
zrussell3 0:b176d95bb38f 328 int i = 0;
zrussell3 0:b176d95bb38f 329 if (bulk_in)
zrussell3 0:b176d95bb38f 330 {
zrussell3 0:b176d95bb38f 331 for (i = 0; i < s; )
zrussell3 0:b176d95bb38f 332 b[i++] = getc();
zrussell3 0:b176d95bb38f 333 }
zrussell3 0:b176d95bb38f 334 return i;
zrussell3 0:b176d95bb38f 335 }
zrussell3 0:b176d95bb38f 336
zrussell3 0:b176d95bb38f 337 uint8_t USBHostSerialPort::available() {
zrussell3 0:b176d95bb38f 338 return circ_buf.available();
zrussell3 0:b176d95bb38f 339 }
zrussell3 0:b176d95bb38f 340
zrussell3 0:b176d95bb38f 341
zrussell3 0:b176d95bb38f 342
zrussell3 0:b176d95bb38f 343 #endif