Fork of the official USBDevice library

Fork of USBDevice by mbed official

Committer:
screamer
Date:
Fri Apr 28 17:01:10 2017 +0000
Branch:
device-files
Revision:
76:f0fd8d911b24
Parent:
73:8d28a0cb7b43
Changed the layout of USBDevice implementation for various targets to match mbed-os/targets. This also reduces the amount of files being compiled as USBDevice code for other targets is not compiled.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 73:8d28a0cb7b43 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
screamer 73:8d28a0cb7b43 2 *
screamer 73:8d28a0cb7b43 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
screamer 73:8d28a0cb7b43 4 * and associated documentation files (the "Software"), to deal in the Software without
screamer 73:8d28a0cb7b43 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
screamer 73:8d28a0cb7b43 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
screamer 73:8d28a0cb7b43 7 * Software is furnished to do so, subject to the following conditions:
screamer 73:8d28a0cb7b43 8 *
screamer 73:8d28a0cb7b43 9 * The above copyright notice and this permission notice shall be included in all copies or
screamer 73:8d28a0cb7b43 10 * substantial portions of the Software.
screamer 73:8d28a0cb7b43 11 *
screamer 73:8d28a0cb7b43 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
screamer 73:8d28a0cb7b43 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
screamer 73:8d28a0cb7b43 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
screamer 73:8d28a0cb7b43 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
screamer 73:8d28a0cb7b43 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
screamer 73:8d28a0cb7b43 17 */
screamer 73:8d28a0cb7b43 18
screamer 73:8d28a0cb7b43 19 #ifndef USBSERIAL_H
screamer 73:8d28a0cb7b43 20 #define USBSERIAL_H
screamer 73:8d28a0cb7b43 21
screamer 73:8d28a0cb7b43 22 #include "USBCDC.h"
screamer 73:8d28a0cb7b43 23 #include "Stream.h"
screamer 73:8d28a0cb7b43 24 #include "CircBuffer.h"
screamer 73:8d28a0cb7b43 25 #include "Callback.h"
screamer 73:8d28a0cb7b43 26
screamer 73:8d28a0cb7b43 27 /**
screamer 73:8d28a0cb7b43 28 * USBSerial example
screamer 73:8d28a0cb7b43 29 *
screamer 73:8d28a0cb7b43 30 * @code
screamer 73:8d28a0cb7b43 31 * #include "mbed.h"
screamer 73:8d28a0cb7b43 32 * #include "USBSerial.h"
screamer 73:8d28a0cb7b43 33 *
screamer 73:8d28a0cb7b43 34 * //Virtual serial port over USB
screamer 73:8d28a0cb7b43 35 * USBSerial serial;
screamer 73:8d28a0cb7b43 36 *
screamer 73:8d28a0cb7b43 37 * int main(void) {
screamer 73:8d28a0cb7b43 38 *
screamer 73:8d28a0cb7b43 39 * while(1)
screamer 73:8d28a0cb7b43 40 * {
screamer 73:8d28a0cb7b43 41 * serial.printf("I am a virtual serial port\n");
screamer 73:8d28a0cb7b43 42 * wait(1);
screamer 73:8d28a0cb7b43 43 * }
screamer 73:8d28a0cb7b43 44 * }
screamer 73:8d28a0cb7b43 45 * @endcode
screamer 73:8d28a0cb7b43 46 */
screamer 73:8d28a0cb7b43 47 class USBSerial: public USBCDC, public Stream {
screamer 73:8d28a0cb7b43 48 public:
screamer 73:8d28a0cb7b43 49
screamer 73:8d28a0cb7b43 50 /**
screamer 73:8d28a0cb7b43 51 * Constructor
screamer 73:8d28a0cb7b43 52 *
screamer 73:8d28a0cb7b43 53 * @param vendor_id Your vendor_id (default: 0x1f00)
screamer 73:8d28a0cb7b43 54 * @param product_id Your product_id (default: 0x2012)
screamer 73:8d28a0cb7b43 55 * @param product_release Your preoduct_release (default: 0x0001)
screamer 73:8d28a0cb7b43 56 * @param connect_blocking define if the connection must be blocked if USB not plugged in
screamer 73:8d28a0cb7b43 57 *
screamer 73:8d28a0cb7b43 58 */
screamer 73:8d28a0cb7b43 59 USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001, bool connect_blocking = true): USBCDC(vendor_id, product_id, product_release, connect_blocking){
screamer 73:8d28a0cb7b43 60 settingsChangedCallback = 0;
screamer 73:8d28a0cb7b43 61 };
screamer 73:8d28a0cb7b43 62
screamer 73:8d28a0cb7b43 63
screamer 73:8d28a0cb7b43 64 /**
screamer 73:8d28a0cb7b43 65 * Send a character. You can use puts, printf.
screamer 73:8d28a0cb7b43 66 *
screamer 73:8d28a0cb7b43 67 * @param c character to be sent
screamer 73:8d28a0cb7b43 68 * @returns true if there is no error, false otherwise
screamer 73:8d28a0cb7b43 69 */
screamer 73:8d28a0cb7b43 70 virtual int _putc(int c);
screamer 73:8d28a0cb7b43 71
screamer 73:8d28a0cb7b43 72 /**
screamer 73:8d28a0cb7b43 73 * Read a character: blocking
screamer 73:8d28a0cb7b43 74 *
screamer 73:8d28a0cb7b43 75 * @returns character read
screamer 73:8d28a0cb7b43 76 */
screamer 73:8d28a0cb7b43 77 virtual int _getc();
screamer 73:8d28a0cb7b43 78
screamer 73:8d28a0cb7b43 79 /**
screamer 73:8d28a0cb7b43 80 * Check the number of bytes available.
screamer 73:8d28a0cb7b43 81 *
screamer 73:8d28a0cb7b43 82 * @returns the number of bytes available
screamer 73:8d28a0cb7b43 83 */
screamer 73:8d28a0cb7b43 84 uint8_t available();
screamer 73:8d28a0cb7b43 85
screamer 73:8d28a0cb7b43 86 /** Determine if there is a character available to read
screamer 73:8d28a0cb7b43 87 *
screamer 73:8d28a0cb7b43 88 * @returns
screamer 73:8d28a0cb7b43 89 * 1 if there is a character available to read,
screamer 73:8d28a0cb7b43 90 * 0 otherwise
screamer 73:8d28a0cb7b43 91 */
screamer 73:8d28a0cb7b43 92 int readable() { return available() ? 1 : 0; }
screamer 73:8d28a0cb7b43 93
screamer 73:8d28a0cb7b43 94 /** Determine if there is space available to write a character
screamer 73:8d28a0cb7b43 95 *
screamer 73:8d28a0cb7b43 96 * @returns
screamer 73:8d28a0cb7b43 97 * 1 if there is space to write a character,
screamer 73:8d28a0cb7b43 98 * 0 otherwise
screamer 73:8d28a0cb7b43 99 */
screamer 73:8d28a0cb7b43 100 int writeable() { return 1; } // always return 1, for write operation is blocking
screamer 73:8d28a0cb7b43 101
screamer 73:8d28a0cb7b43 102 /**
screamer 73:8d28a0cb7b43 103 * Write a block of data.
screamer 73:8d28a0cb7b43 104 *
screamer 73:8d28a0cb7b43 105 * For more efficiency, a block of size 64 (maximum size of a bulk endpoint) has to be written.
screamer 73:8d28a0cb7b43 106 *
screamer 73:8d28a0cb7b43 107 * @param buf pointer on data which will be written
screamer 73:8d28a0cb7b43 108 * @param size size of the buffer. The maximum size of a block is limited by the size of the endpoint (64 bytes)
screamer 73:8d28a0cb7b43 109 *
screamer 73:8d28a0cb7b43 110 * @returns true if successfull
screamer 73:8d28a0cb7b43 111 */
screamer 73:8d28a0cb7b43 112 bool writeBlock(uint8_t * buf, uint16_t size);
screamer 73:8d28a0cb7b43 113
screamer 73:8d28a0cb7b43 114 /**
screamer 73:8d28a0cb7b43 115 * Attach a member function to call when a packet is received.
screamer 73:8d28a0cb7b43 116 *
screamer 73:8d28a0cb7b43 117 * @param tptr pointer to the object to call the member function on
screamer 73:8d28a0cb7b43 118 * @param mptr pointer to the member function to be called
screamer 73:8d28a0cb7b43 119 */
screamer 73:8d28a0cb7b43 120 template<typename T>
screamer 73:8d28a0cb7b43 121 void attach(T* tptr, void (T::*mptr)(void)) {
screamer 73:8d28a0cb7b43 122 if((mptr != NULL) && (tptr != NULL)) {
screamer 73:8d28a0cb7b43 123 rx.attach(tptr, mptr);
screamer 73:8d28a0cb7b43 124 }
screamer 73:8d28a0cb7b43 125 }
screamer 73:8d28a0cb7b43 126
screamer 73:8d28a0cb7b43 127 /**
screamer 73:8d28a0cb7b43 128 * Attach a callback called when a packet is received
screamer 73:8d28a0cb7b43 129 *
screamer 73:8d28a0cb7b43 130 * @param fptr function pointer
screamer 73:8d28a0cb7b43 131 */
screamer 73:8d28a0cb7b43 132 void attach(void (*fptr)(void)) {
screamer 73:8d28a0cb7b43 133 if(fptr != NULL) {
screamer 73:8d28a0cb7b43 134 rx.attach(fptr);
screamer 73:8d28a0cb7b43 135 }
screamer 73:8d28a0cb7b43 136 }
screamer 73:8d28a0cb7b43 137
screamer 73:8d28a0cb7b43 138 /**
screamer 73:8d28a0cb7b43 139 * Attach a callback to call when serial's settings are changed.
screamer 73:8d28a0cb7b43 140 *
screamer 73:8d28a0cb7b43 141 * @param fptr function pointer
screamer 73:8d28a0cb7b43 142 */
screamer 73:8d28a0cb7b43 143 void attach(void (*fptr)(int baud, int bits, int parity, int stop)) {
screamer 73:8d28a0cb7b43 144 settingsChangedCallback = fptr;
screamer 73:8d28a0cb7b43 145 }
screamer 73:8d28a0cb7b43 146
screamer 73:8d28a0cb7b43 147 protected:
screamer 73:8d28a0cb7b43 148 virtual bool EPBULK_OUT_callback();
screamer 73:8d28a0cb7b43 149 virtual void lineCodingChanged(int baud, int bits, int parity, int stop){
screamer 73:8d28a0cb7b43 150 if (settingsChangedCallback) {
screamer 73:8d28a0cb7b43 151 settingsChangedCallback(baud, bits, parity, stop);
screamer 73:8d28a0cb7b43 152 }
screamer 73:8d28a0cb7b43 153 }
screamer 73:8d28a0cb7b43 154
screamer 73:8d28a0cb7b43 155 private:
screamer 73:8d28a0cb7b43 156 Callback<void()> rx;
screamer 73:8d28a0cb7b43 157 CircBuffer<uint8_t,128> buf;
screamer 73:8d28a0cb7b43 158 void (*settingsChangedCallback)(int baud, int bits, int parity, int stop);
screamer 73:8d28a0cb7b43 159 };
screamer 73:8d28a0cb7b43 160
screamer 73:8d28a0cb7b43 161 #endif