Douglas Choi / Mbed 2 deprecated DISCO-F746NG_Monttory_Base

Dependencies:   AUDIO_DISCO_F746NG BSP_DISCO_F746NG EEPROM_DISCO_F746NG LCD_DISCO_F746NG QSPI_DISCO_F746NG SD_DISCO_F746NG SDRAM_DISCO_F746NG TS_DISCO_F746NG FATFileSystem mbed-rtos mbed

Committer:
DouglasK
Date:
Sat Oct 21 03:18:01 2017 +0000
Revision:
13:98d873b3e6db
Monttory Base 01

Who changed what in which revision?

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