Pierre Provent / USBHost

Dependents:   TEST_USB_Nucleo_F429ZI Essais_USB_Nucleo_F429ZI SID_V3_Nucleo_F429ZI SID_V4_Nucleo_F429ZI_copy

Committer:
pierreprovent
Date:
Fri Sep 25 10:17:49 2020 +0000
Revision:
0:77ca32e8e04e
Programme acquisition en enregistrement sur clef USB carte Nucleo F429ZI cours ELE118 Cnam

Who changed what in which revision?

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