ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /* mbed USBHost Library
group-onsemi 0:098463de4c5d 2 * Copyright (c) 2006-2013 ARM Limited
group-onsemi 0:098463de4c5d 3 *
group-onsemi 0:098463de4c5d 4 * Licensed under the Apache License, Version 2.0 (the "License");
group-onsemi 0:098463de4c5d 5 * you may not use this file except in compliance with the License.
group-onsemi 0:098463de4c5d 6 * You may obtain a copy of the License at
group-onsemi 0:098463de4c5d 7 *
group-onsemi 0:098463de4c5d 8 * http://www.apache.org/licenses/LICENSE-2.0
group-onsemi 0:098463de4c5d 9 *
group-onsemi 0:098463de4c5d 10 * Unless required by applicable law or agreed to in writing, software
group-onsemi 0:098463de4c5d 11 * distributed under the License is distributed on an "AS IS" BASIS,
group-onsemi 0:098463de4c5d 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
group-onsemi 0:098463de4c5d 13 * See the License for the specific language governing permissions and
group-onsemi 0:098463de4c5d 14 * limitations under the License.
group-onsemi 0:098463de4c5d 15 */
group-onsemi 0:098463de4c5d 16
group-onsemi 0:098463de4c5d 17 #ifndef USBHOSTSERIAL_H
group-onsemi 0:098463de4c5d 18 #define USBHOSTSERIAL_H
group-onsemi 0:098463de4c5d 19
group-onsemi 0:098463de4c5d 20 #include "USBHostConf.h"
group-onsemi 0:098463de4c5d 21
group-onsemi 0:098463de4c5d 22 #if USBHOST_SERIAL
group-onsemi 0:098463de4c5d 23
group-onsemi 0:098463de4c5d 24 #include "USBHost.h"
group-onsemi 0:098463de4c5d 25 #include "Stream.h"
group-onsemi 0:098463de4c5d 26 #include "MtxCircBuffer.h"
group-onsemi 0:098463de4c5d 27 #include "Callback.h"
group-onsemi 0:098463de4c5d 28
group-onsemi 0:098463de4c5d 29 /**
group-onsemi 0:098463de4c5d 30 * A class to communicate a USB virtual serial port
group-onsemi 0:098463de4c5d 31 */
group-onsemi 0:098463de4c5d 32 class USBHostSerialPort : public Stream {
group-onsemi 0:098463de4c5d 33 public:
group-onsemi 0:098463de4c5d 34 /**
group-onsemi 0:098463de4c5d 35 * Constructor
group-onsemi 0:098463de4c5d 36 */
group-onsemi 0:098463de4c5d 37 USBHostSerialPort();
group-onsemi 0:098463de4c5d 38
group-onsemi 0:098463de4c5d 39 enum IrqType {
group-onsemi 0:098463de4c5d 40 RxIrq,
group-onsemi 0:098463de4c5d 41 TxIrq
group-onsemi 0:098463de4c5d 42 };
group-onsemi 0:098463de4c5d 43
group-onsemi 0:098463de4c5d 44 enum Parity {
group-onsemi 0:098463de4c5d 45 None = 0,
group-onsemi 0:098463de4c5d 46 Odd,
group-onsemi 0:098463de4c5d 47 Even,
group-onsemi 0:098463de4c5d 48 Mark,
group-onsemi 0:098463de4c5d 49 Space
group-onsemi 0:098463de4c5d 50 };
group-onsemi 0:098463de4c5d 51
group-onsemi 0:098463de4c5d 52 void connect(USBHost* _host, USBDeviceConnected * _dev,
group-onsemi 0:098463de4c5d 53 uint8_t _serial_intf, USBEndpoint* _bulk_in, USBEndpoint* _bulk_out);
group-onsemi 0:098463de4c5d 54
group-onsemi 0:098463de4c5d 55 /**
group-onsemi 0:098463de4c5d 56 * Check the number of bytes available.
group-onsemi 0:098463de4c5d 57 *
group-onsemi 0:098463de4c5d 58 * @returns the number of bytes available
group-onsemi 0:098463de4c5d 59 */
group-onsemi 0:098463de4c5d 60 uint8_t available();
group-onsemi 0:098463de4c5d 61
group-onsemi 0:098463de4c5d 62 /**
group-onsemi 0:098463de4c5d 63 * Attach a member function to call when a packet is received.
group-onsemi 0:098463de4c5d 64 *
group-onsemi 0:098463de4c5d 65 * @param tptr pointer to the object to call the member function on
group-onsemi 0:098463de4c5d 66 * @param mptr pointer to the member function to be called
group-onsemi 0:098463de4c5d 67 * @param irq irq type
group-onsemi 0:098463de4c5d 68 */
group-onsemi 0:098463de4c5d 69 template<typename T>
group-onsemi 0:098463de4c5d 70 inline void attach(T* tptr, void (T::*mptr)(void), IrqType irq = RxIrq) {
group-onsemi 0:098463de4c5d 71 if ((mptr != NULL) && (tptr != NULL)) {
group-onsemi 0:098463de4c5d 72 if (irq == RxIrq) {
group-onsemi 0:098463de4c5d 73 rx.attach(tptr, mptr);
group-onsemi 0:098463de4c5d 74 } else {
group-onsemi 0:098463de4c5d 75 tx.attach(tptr, mptr);
group-onsemi 0:098463de4c5d 76 }
group-onsemi 0:098463de4c5d 77 }
group-onsemi 0:098463de4c5d 78 }
group-onsemi 0:098463de4c5d 79
group-onsemi 0:098463de4c5d 80 /**
group-onsemi 0:098463de4c5d 81 * Attach a callback called when a packet is received
group-onsemi 0:098463de4c5d 82 *
group-onsemi 0:098463de4c5d 83 * @param ptr function pointer
group-onsemi 0:098463de4c5d 84 */
group-onsemi 0:098463de4c5d 85 inline void attach(void (*fn)(void), IrqType irq = RxIrq) {
group-onsemi 0:098463de4c5d 86 if (fn != NULL) {
group-onsemi 0:098463de4c5d 87 if (irq == RxIrq) {
group-onsemi 0:098463de4c5d 88 rx.attach(fn);
group-onsemi 0:098463de4c5d 89 } else {
group-onsemi 0:098463de4c5d 90 tx.attach(fn);
group-onsemi 0:098463de4c5d 91 }
group-onsemi 0:098463de4c5d 92 }
group-onsemi 0:098463de4c5d 93 }
group-onsemi 0:098463de4c5d 94
group-onsemi 0:098463de4c5d 95 /** Set the baud rate of the serial port
group-onsemi 0:098463de4c5d 96 *
group-onsemi 0:098463de4c5d 97 * @param baudrate The baudrate of the serial port (default = 9600).
group-onsemi 0:098463de4c5d 98 */
group-onsemi 0:098463de4c5d 99 void baud(int baudrate = 9600);
group-onsemi 0:098463de4c5d 100
group-onsemi 0:098463de4c5d 101 /** Set the transmission format used by the Serial port
group-onsemi 0:098463de4c5d 102 *
group-onsemi 0:098463de4c5d 103 * @param bits The number of bits in a word (default = 8)
group-onsemi 0:098463de4c5d 104 * @param parity The parity used (USBHostSerialPort::None, USBHostSerialPort::Odd, USBHostSerialPort::Even, USBHostSerialPort::Mark, USBHostSerialPort::Space; default = USBHostSerialPort::None)
group-onsemi 0:098463de4c5d 105 * @param stop The number of stop bits (1 or 2; default = 1)
group-onsemi 0:098463de4c5d 106 */
group-onsemi 0:098463de4c5d 107 void format(int bits = 8, Parity parity = USBHostSerialPort::None, int stop_bits = 1);
group-onsemi 0:098463de4c5d 108 virtual int writeBuf(const char* b, int s);
group-onsemi 0:098463de4c5d 109 virtual int readBuf(char* b, int s);
group-onsemi 0:098463de4c5d 110
group-onsemi 0:098463de4c5d 111 protected:
group-onsemi 0:098463de4c5d 112 virtual int _getc();
group-onsemi 0:098463de4c5d 113 virtual int _putc(int c);
group-onsemi 0:098463de4c5d 114
group-onsemi 0:098463de4c5d 115 private:
group-onsemi 0:098463de4c5d 116 USBHost * host;
group-onsemi 0:098463de4c5d 117 USBDeviceConnected * dev;
group-onsemi 0:098463de4c5d 118
group-onsemi 0:098463de4c5d 119 USBEndpoint * bulk_in;
group-onsemi 0:098463de4c5d 120 USBEndpoint * bulk_out;
group-onsemi 0:098463de4c5d 121 uint32_t size_bulk_in;
group-onsemi 0:098463de4c5d 122 uint32_t size_bulk_out;
group-onsemi 0:098463de4c5d 123
group-onsemi 0:098463de4c5d 124 void init();
group-onsemi 0:098463de4c5d 125
group-onsemi 0:098463de4c5d 126 MtxCircBuffer<uint8_t, 128> circ_buf;
group-onsemi 0:098463de4c5d 127
group-onsemi 0:098463de4c5d 128 uint8_t buf[64];
group-onsemi 0:098463de4c5d 129
group-onsemi 0:098463de4c5d 130 typedef struct {
group-onsemi 0:098463de4c5d 131 uint32_t baudrate;
group-onsemi 0:098463de4c5d 132 uint8_t stop_bits;
group-onsemi 0:098463de4c5d 133 uint8_t parity;
group-onsemi 0:098463de4c5d 134 uint8_t data_bits;
group-onsemi 0:098463de4c5d 135 } PACKED LINE_CODING;
group-onsemi 0:098463de4c5d 136
group-onsemi 0:098463de4c5d 137 LINE_CODING line_coding;
group-onsemi 0:098463de4c5d 138
group-onsemi 0:098463de4c5d 139 void rxHandler();
group-onsemi 0:098463de4c5d 140 void txHandler();
group-onsemi 0:098463de4c5d 141 Callback<void()> rx;
group-onsemi 0:098463de4c5d 142 Callback<void()> tx;
group-onsemi 0:098463de4c5d 143
group-onsemi 0:098463de4c5d 144 uint8_t serial_intf;
group-onsemi 0:098463de4c5d 145 };
group-onsemi 0:098463de4c5d 146
group-onsemi 0:098463de4c5d 147 #if (USBHOST_SERIAL <= 1)
group-onsemi 0:098463de4c5d 148
group-onsemi 0:098463de4c5d 149 class USBHostSerial : public IUSBEnumerator, public USBHostSerialPort
group-onsemi 0:098463de4c5d 150 {
group-onsemi 0:098463de4c5d 151 public:
group-onsemi 0:098463de4c5d 152 USBHostSerial();
group-onsemi 0:098463de4c5d 153
group-onsemi 0:098463de4c5d 154 /**
group-onsemi 0:098463de4c5d 155 * Try to connect a serial device
group-onsemi 0:098463de4c5d 156 *
group-onsemi 0:098463de4c5d 157 * @return true if connection was successful
group-onsemi 0:098463de4c5d 158 */
group-onsemi 0:098463de4c5d 159 bool connect();
group-onsemi 0:098463de4c5d 160
group-onsemi 0:098463de4c5d 161 void disconnect();
group-onsemi 0:098463de4c5d 162
group-onsemi 0:098463de4c5d 163 /**
group-onsemi 0:098463de4c5d 164 * Check if a any serial port is connected
group-onsemi 0:098463de4c5d 165 *
group-onsemi 0:098463de4c5d 166 * @returns true if a serial device is connected
group-onsemi 0:098463de4c5d 167 */
group-onsemi 0:098463de4c5d 168 bool connected();
group-onsemi 0:098463de4c5d 169
group-onsemi 0:098463de4c5d 170 protected:
group-onsemi 0:098463de4c5d 171 USBHost* host;
group-onsemi 0:098463de4c5d 172 USBDeviceConnected* dev;
group-onsemi 0:098463de4c5d 173 uint8_t port_intf;
group-onsemi 0:098463de4c5d 174 int ports_found;
group-onsemi 0:098463de4c5d 175
group-onsemi 0:098463de4c5d 176 //From IUSBEnumerator
group-onsemi 0:098463de4c5d 177 virtual void setVidPid(uint16_t vid, uint16_t pid);
group-onsemi 0:098463de4c5d 178 virtual bool 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
group-onsemi 0:098463de4c5d 179 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
group-onsemi 0:098463de4c5d 180
group-onsemi 0:098463de4c5d 181 private:
group-onsemi 0:098463de4c5d 182 bool dev_connected;
group-onsemi 0:098463de4c5d 183 };
group-onsemi 0:098463de4c5d 184
group-onsemi 0:098463de4c5d 185 #else // (USBHOST_SERIAL > 1)
group-onsemi 0:098463de4c5d 186
group-onsemi 0:098463de4c5d 187 class USBHostMultiSerial : public IUSBEnumerator {
group-onsemi 0:098463de4c5d 188 public:
group-onsemi 0:098463de4c5d 189 USBHostMultiSerial();
group-onsemi 0:098463de4c5d 190 virtual ~USBHostMultiSerial();
group-onsemi 0:098463de4c5d 191
group-onsemi 0:098463de4c5d 192 USBHostSerialPort* getPort(int port)
group-onsemi 0:098463de4c5d 193 {
group-onsemi 0:098463de4c5d 194 return port < USBHOST_SERIAL ? ports[port] : NULL;
group-onsemi 0:098463de4c5d 195 }
group-onsemi 0:098463de4c5d 196
group-onsemi 0:098463de4c5d 197 /**
group-onsemi 0:098463de4c5d 198 * Try to connect a serial device
group-onsemi 0:098463de4c5d 199 *
group-onsemi 0:098463de4c5d 200 * @return true if connection was successful
group-onsemi 0:098463de4c5d 201 */
group-onsemi 0:098463de4c5d 202 bool connect();
group-onsemi 0:098463de4c5d 203
group-onsemi 0:098463de4c5d 204 void disconnect();
group-onsemi 0:098463de4c5d 205
group-onsemi 0:098463de4c5d 206 /**
group-onsemi 0:098463de4c5d 207 * Check if a any serial port is connected
group-onsemi 0:098463de4c5d 208 *
group-onsemi 0:098463de4c5d 209 * @returns true if a serial device is connected
group-onsemi 0:098463de4c5d 210 */
group-onsemi 0:098463de4c5d 211 bool connected();
group-onsemi 0:098463de4c5d 212
group-onsemi 0:098463de4c5d 213 protected:
group-onsemi 0:098463de4c5d 214 USBHost* host;
group-onsemi 0:098463de4c5d 215 USBDeviceConnected* dev;
group-onsemi 0:098463de4c5d 216 USBHostSerialPort* ports[USBHOST_SERIAL];
group-onsemi 0:098463de4c5d 217 uint8_t port_intf[USBHOST_SERIAL];
group-onsemi 0:098463de4c5d 218 int ports_found;
group-onsemi 0:098463de4c5d 219
group-onsemi 0:098463de4c5d 220 //From IUSBEnumerator
group-onsemi 0:098463de4c5d 221 virtual void setVidPid(uint16_t vid, uint16_t pid);
group-onsemi 0:098463de4c5d 222 virtual bool 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
group-onsemi 0:098463de4c5d 223 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
group-onsemi 0:098463de4c5d 224
group-onsemi 0:098463de4c5d 225 private:
group-onsemi 0:098463de4c5d 226 bool dev_connected;
group-onsemi 0:098463de4c5d 227 };
group-onsemi 0:098463de4c5d 228 #endif // (USBHOST_SERIAL <= 1)
group-onsemi 0:098463de4c5d 229
group-onsemi 0:098463de4c5d 230 #endif
group-onsemi 0:098463de4c5d 231
group-onsemi 0:098463de4c5d 232 #endif