Maxim nexpaq / nexpaq_dev
Committer:
nexpaq
Date:
Fri Nov 04 20:27:58 2016 +0000
Revision:
0:6c56fb4bc5f0
Moving to library for sharing updates

Who changed what in which revision?

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