test public

Dependencies:   HttpServer_snapshot_mbed-os

Committer:
anhtran
Date:
Fri Oct 18 03:09:43 2019 +0000
Revision:
0:e9fd5575b10e
abc

Who changed what in which revision?

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