only for STM32F769NI-DISCOVERY, porting from mbed OS5 unsupport functions

Committer:
kenjiArai
Date:
Wed Aug 07 05:33:53 2019 +0000
Revision:
0:dae1ac0c0a7b
only for STM32F769NI-DISCOVERY, porting from mbed OS5 unsupport functions

Who changed what in which revision?

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