USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Tue Jul 31 10:37:16 2012 +0000
Revision:
9:c9e9817c398c
Parent:
USBHost/Endpoint.h@7:c4483d48fe96
Child:
10:08bce4cd973a
Renamed Endpoint->USBEndpoint because it conflicted with the Socket API! Made some weird symbols mixups happen that made everything explode when the first USB endpoint was allocated.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:ae46a0638b2c 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
donatien 0:ae46a0638b2c 2 *
donatien 0:ae46a0638b2c 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 0:ae46a0638b2c 4 * and associated documentation files (the "Software"), to deal in the Software without
donatien 0:ae46a0638b2c 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
donatien 0:ae46a0638b2c 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
donatien 0:ae46a0638b2c 7 * Software is furnished to do so, subject to the following conditions:
donatien 0:ae46a0638b2c 8 *
donatien 0:ae46a0638b2c 9 * The above copyright notice and this permission notice shall be included in all copies or
donatien 0:ae46a0638b2c 10 * substantial portions of the Software.
donatien 0:ae46a0638b2c 11 *
donatien 0:ae46a0638b2c 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 0:ae46a0638b2c 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 0:ae46a0638b2c 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 0:ae46a0638b2c 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:ae46a0638b2c 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 0:ae46a0638b2c 17 */
donatien 0:ae46a0638b2c 18
donatien 9:c9e9817c398c 19 #ifndef USBENDPOINT_H
donatien 9:c9e9817c398c 20 #define USBENDPOINT_H
donatien 0:ae46a0638b2c 21
donatien 0:ae46a0638b2c 22 #include "stdint.h"
donatien 0:ae46a0638b2c 23 #include "FunctionPointer.h"
donatien 0:ae46a0638b2c 24 #include "USBHostTypes.h"
donatien 0:ae46a0638b2c 25
donatien 0:ae46a0638b2c 26
donatien 0:ae46a0638b2c 27 enum ENDPOINT_TYPE {
donatien 0:ae46a0638b2c 28 CONTROL_ENDPOINT = 0,
donatien 0:ae46a0638b2c 29 ISOCHRONOUS_ENDPOINT,
donatien 0:ae46a0638b2c 30 BULK_ENDPOINT,
donatien 0:ae46a0638b2c 31 INTERRUPT_ENDPOINT
donatien 0:ae46a0638b2c 32 };
donatien 0:ae46a0638b2c 33
donatien 0:ae46a0638b2c 34 enum ENDPOINT_DIRECTION {
donatien 0:ae46a0638b2c 35 OUT = 1,
donatien 0:ae46a0638b2c 36 IN
donatien 0:ae46a0638b2c 37 };
donatien 0:ae46a0638b2c 38
donatien 9:c9e9817c398c 39 class USBEndpoint {
donatien 0:ae46a0638b2c 40 public:
donatien 0:ae46a0638b2c 41 /*
donatien 0:ae46a0638b2c 42 * Constructor
donatien 0:ae46a0638b2c 43 */
donatien 9:c9e9817c398c 44 USBEndpoint() {state = USB_TYPE_FREE; nextEp = NULL;};
donatien 0:ae46a0638b2c 45
donatien 0:ae46a0638b2c 46 /*
donatien 0:ae46a0638b2c 47 * Initialize an endpoint
donatien 0:ae46a0638b2c 48 *
donatien 0:ae46a0638b2c 49 * @param hced hced associated to the endpoint
donatien 0:ae46a0638b2c 50 * @param type endpoint type
donatien 0:ae46a0638b2c 51 * @param dir endpoint direction
donatien 0:ae46a0638b2c 52 * @param size endpoint size
donatien 0:ae46a0638b2c 53 * @param ep_number endpoint number
donatien 0:ae46a0638b2c 54 */
donatien 0:ae46a0638b2c 55 void init(HCED * hced, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t ep_number, HCTD* td_list[2]);
donatien 0:ae46a0638b2c 56
donatien 0:ae46a0638b2c 57 /*
donatien 0:ae46a0638b2c 58 * Set next token. Warining: only useful for the control endpoint
donatien 0:ae46a0638b2c 59 *
donatien 0:ae46a0638b2c 60 * @param token IN, OUT or SETUP token
donatien 0:ae46a0638b2c 61 */
donatien 0:ae46a0638b2c 62 void setNextToken(uint32_t token);
donatien 0:ae46a0638b2c 63
donatien 0:ae46a0638b2c 64 /*
donatien 0:ae46a0638b2c 65 * Queue an endpoint
donatien 0:ae46a0638b2c 66 *
donatien 0:ae46a0638b2c 67 * endpoint endpoint which will be queued in the linked list
donatien 0:ae46a0638b2c 68 */
donatien 9:c9e9817c398c 69 void queueEndpoint(USBEndpoint * endpoint);
donatien 0:ae46a0638b2c 70
donatien 0:ae46a0638b2c 71 /*
donatien 0:ae46a0638b2c 72 * Get a td to be queued
donatien 0:ae46a0638b2c 73 *
donatien 0:ae46a0638b2c 74 * @returns td hctd which will be queued
donatien 0:ae46a0638b2c 75 */
donatien 0:ae46a0638b2c 76 volatile HCTD* getNextTD();
donatien 0:ae46a0638b2c 77
donatien 0:ae46a0638b2c 78 /*
donatien 0:ae46a0638b2c 79 * Queue a transfer on the endpoint
donatien 0:ae46a0638b2c 80 *
donatien 0:ae46a0638b2c 81 */
donatien 0:ae46a0638b2c 82 void queueTransfer();
donatien 0:ae46a0638b2c 83
donatien 0:ae46a0638b2c 84 /*
donatien 0:ae46a0638b2c 85 * Get the currently processed td
donatien 0:ae46a0638b2c 86 *
donatien 0:ae46a0638b2c 87 * @returns td hctd that was queued
donatien 0:ae46a0638b2c 88 */
donatien 0:ae46a0638b2c 89 volatile HCTD * getProcessedTD();
donatien 0:ae46a0638b2c 90
donatien 0:ae46a0638b2c 91 /*
donatien 0:ae46a0638b2c 92 * Unqueue a transfer from the endpoint
donatien 0:ae46a0638b2c 93 *
donatien 0:ae46a0638b2c 94 * @param td hctd which will be unqueued
donatien 0:ae46a0638b2c 95 */
donatien 0:ae46a0638b2c 96 void unqueueTransfer(volatile HCTD * td);
donatien 0:ae46a0638b2c 97
donatien 0:ae46a0638b2c 98 /*
donatien 0:ae46a0638b2c 99 * Return the next endpoint in the linked list
donatien 0:ae46a0638b2c 100 *
donatien 0:ae46a0638b2c 101 * @returns next endpoint
donatien 0:ae46a0638b2c 102 */
donatien 9:c9e9817c398c 103 USBEndpoint * nextEndpoint();
donatien 0:ae46a0638b2c 104
donatien 0:ae46a0638b2c 105 /**
donatien 0:ae46a0638b2c 106 * Attach a member function to call when a transfer is finished
donatien 0:ae46a0638b2c 107 *
donatien 0:ae46a0638b2c 108 * @param tptr pointer to the object to call the member function on
donatien 0:ae46a0638b2c 109 * @param mptr pointer to the member function to be called
donatien 0:ae46a0638b2c 110 */
donatien 0:ae46a0638b2c 111 template<typename T>
donatien 0:ae46a0638b2c 112 void attach(T* tptr, void (T::*mptr)(void)) {
donatien 0:ae46a0638b2c 113 if((mptr != NULL) && (tptr != NULL)) {
donatien 0:ae46a0638b2c 114 rx.attach(tptr, mptr);
donatien 0:ae46a0638b2c 115 }
donatien 0:ae46a0638b2c 116 }
donatien 0:ae46a0638b2c 117
donatien 0:ae46a0638b2c 118 /**
donatien 0:ae46a0638b2c 119 * Attach a callback called when a transfer is finished
donatien 0:ae46a0638b2c 120 *
donatien 0:ae46a0638b2c 121 * @param fptr function pointer
donatien 0:ae46a0638b2c 122 */
donatien 0:ae46a0638b2c 123 void attach(void (*fn)(void)) {
donatien 0:ae46a0638b2c 124 if(fn != NULL) {
donatien 0:ae46a0638b2c 125 rx.attach(fn);
donatien 0:ae46a0638b2c 126 }
donatien 0:ae46a0638b2c 127 }
donatien 0:ae46a0638b2c 128
donatien 0:ae46a0638b2c 129 /*
donatien 0:ae46a0638b2c 130 * Call the handler associted to the end of a transfer
donatien 0:ae46a0638b2c 131 */
donatien 0:ae46a0638b2c 132 void call() {
donatien 0:ae46a0638b2c 133 rx.call();
donatien 0:ae46a0638b2c 134 };
donatien 0:ae46a0638b2c 135
donatien 0:ae46a0638b2c 136
donatien 0:ae46a0638b2c 137 /*
donatien 0:ae46a0638b2c 138 * Setters
donatien 0:ae46a0638b2c 139 */
donatien 0:ae46a0638b2c 140 void setState(USB_TYPE st) {state = st;}
donatien 0:ae46a0638b2c 141 void setDeviceAddress(uint8_t addr);
donatien 0:ae46a0638b2c 142 void setLengthTransferred(int len);
donatien 0:ae46a0638b2c 143 void setSpeed(uint8_t speed);
donatien 0:ae46a0638b2c 144 void setSize(uint32_t size);
donatien 0:ae46a0638b2c 145 void setDir(ENDPOINT_DIRECTION d) {dir = d;}
donatien 0:ae46a0638b2c 146
donatien 0:ae46a0638b2c 147 /*
donatien 0:ae46a0638b2c 148 * Getters
donatien 0:ae46a0638b2c 149 */
donatien 0:ae46a0638b2c 150 USB_TYPE getState() {return state;}
donatien 0:ae46a0638b2c 151 ENDPOINT_TYPE getType();
donatien 0:ae46a0638b2c 152 uint8_t getDeviceAddress();
donatien 0:ae46a0638b2c 153 int getLengthTransferred() {return transferred;}
donatien 0:ae46a0638b2c 154 uint32_t getBufStart();
donatien 0:ae46a0638b2c 155 uint32_t getSize();
donatien 0:ae46a0638b2c 156 volatile HCTD * getHeadTD();
donatien 7:c4483d48fe96 157 volatile HCTD** getTDList();
donatien 0:ae46a0638b2c 158 volatile HCED * getHCED();
donatien 0:ae46a0638b2c 159 ENDPOINT_DIRECTION getDir() {return dir;}
donatien 0:ae46a0638b2c 160 bool isSetup() {return setup;}
donatien 0:ae46a0638b2c 161
donatien 0:ae46a0638b2c 162
donatien 0:ae46a0638b2c 163 private:
donatien 0:ae46a0638b2c 164 ENDPOINT_TYPE type;
donatien 0:ae46a0638b2c 165 volatile USB_TYPE state;
donatien 0:ae46a0638b2c 166 ENDPOINT_DIRECTION dir;
donatien 0:ae46a0638b2c 167 bool setup;
donatien 0:ae46a0638b2c 168
donatien 0:ae46a0638b2c 169 int transfer_len;
donatien 0:ae46a0638b2c 170 int transferred;
donatien 0:ae46a0638b2c 171 uint32_t buf_start;
donatien 0:ae46a0638b2c 172
donatien 0:ae46a0638b2c 173 FunctionPointer rx;
donatien 0:ae46a0638b2c 174
donatien 9:c9e9817c398c 175 USBEndpoint* nextEp;
donatien 0:ae46a0638b2c 176
donatien 9:c9e9817c398c 177 // USBEndpoint descriptor
donatien 0:ae46a0638b2c 178 volatile HCED * hced;
donatien 0:ae46a0638b2c 179
donatien 0:ae46a0638b2c 180 volatile HCTD * td_list[2];
donatien 0:ae46a0638b2c 181 volatile HCTD * td_current;
donatien 0:ae46a0638b2c 182 volatile HCTD * td_next;
donatien 0:ae46a0638b2c 183 /*bool carry;*/
donatien 0:ae46a0638b2c 184
donatien 0:ae46a0638b2c 185 int count;
donatien 0:ae46a0638b2c 186
donatien 0:ae46a0638b2c 187 };
donatien 0:ae46a0638b2c 188
donatien 0:ae46a0638b2c 189 #endif