EnOcean USB400 Serial Library

Dependents:   USB400Serial_Hello MFT_IoT_demo_USB400 USB400J_app_board_demo

Committer:
nanashino
Date:
Wed Dec 03 06:18:10 2014 +0000
Revision:
0:0dd5d1e4cf71
initial version

Who changed what in which revision?

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