Dylan Saada / Mbed 2 deprecated telemetre2

Dependencies:   mbed

Committer:
dylancachan
Date:
Wed Apr 15 06:23:18 2015 +0000
Revision:
0:6ce9c65992e5
telemetre

Who changed what in which revision?

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