Pierre Provent / USBHost

Dependents:   TEST_USB_Nucleo_F429ZI Essais_USB_Nucleo_F429ZI SID_V3_Nucleo_F429ZI SID_V4_Nucleo_F429ZI_copy

Committer:
pierreprovent
Date:
Fri Sep 25 10:17:49 2020 +0000
Revision:
0:77ca32e8e04e
Programme acquisition en enregistrement sur clef USB carte Nucleo F429ZI cours ELE118 Cnam

Who changed what in which revision?

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