2018.07.26

Dependencies:   FATFileSystem3 mbed-rtos

Fork of USBHost by mbed official

Committer:
sayzyas
Date:
Thu Jul 26 04:20:29 2018 +0000
Revision:
44:ef52682c423e
Parent:
43:1675750cca08
2018.07.26;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sayzyas 43:1675750cca08 1 /* mbed USBHost Library
sayzyas 43:1675750cca08 2 * Copyright (c) 2006-2013 ARM Limited
sayzyas 43:1675750cca08 3 *
sayzyas 43:1675750cca08 4 * Licensed under the Apache License, Version 2.0 (the "License");
sayzyas 43:1675750cca08 5 * you may not use this file except in compliance with the License.
sayzyas 43:1675750cca08 6 * You may obtain a copy of the License at
sayzyas 43:1675750cca08 7 *
sayzyas 43:1675750cca08 8 * http://www.apache.org/licenses/LICENSE-2.0
sayzyas 43:1675750cca08 9 *
sayzyas 43:1675750cca08 10 * Unless required by applicable law or agreed to in writing, software
sayzyas 43:1675750cca08 11 * distributed under the License is distributed on an "AS IS" BASIS,
sayzyas 43:1675750cca08 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sayzyas 43:1675750cca08 13 * See the License for the specific language governing permissions and
sayzyas 43:1675750cca08 14 * limitations under the License.
sayzyas 43:1675750cca08 15 */
sayzyas 43:1675750cca08 16
sayzyas 43:1675750cca08 17 #ifndef USBENDPOINT_H
sayzyas 43:1675750cca08 18 #define USBENDPOINT_H
sayzyas 43:1675750cca08 19
sayzyas 43:1675750cca08 20 #include "FunctionPointer.h"
sayzyas 43:1675750cca08 21 #include "USBHostTypes.h"
sayzyas 43:1675750cca08 22 #include "rtos.h"
sayzyas 43:1675750cca08 23
sayzyas 43:1675750cca08 24 class USBDeviceConnected;
sayzyas 43:1675750cca08 25
sayzyas 43:1675750cca08 26 /**
sayzyas 43:1675750cca08 27 * USBEndpoint class
sayzyas 43:1675750cca08 28 */
sayzyas 43:1675750cca08 29 class USBEndpoint
sayzyas 43:1675750cca08 30 {
sayzyas 43:1675750cca08 31 public:
sayzyas 43:1675750cca08 32 /**
sayzyas 43:1675750cca08 33 * Constructor
sayzyas 43:1675750cca08 34 */
sayzyas 43:1675750cca08 35 USBEndpoint() {
sayzyas 43:1675750cca08 36 state = USB_TYPE_FREE;
sayzyas 43:1675750cca08 37 nextEp = NULL;
sayzyas 43:1675750cca08 38 };
sayzyas 43:1675750cca08 39
sayzyas 43:1675750cca08 40 /**
sayzyas 43:1675750cca08 41 * Initialize an endpoint
sayzyas 43:1675750cca08 42 *
sayzyas 43:1675750cca08 43 * @param hced hced associated to the endpoint
sayzyas 43:1675750cca08 44 * @param type endpoint type
sayzyas 43:1675750cca08 45 * @param dir endpoint direction
sayzyas 43:1675750cca08 46 * @param size endpoint size
sayzyas 43:1675750cca08 47 * @param ep_number endpoint number
sayzyas 43:1675750cca08 48 * @param td_list array of two allocated transfer descriptors
sayzyas 43:1675750cca08 49 */
sayzyas 43:1675750cca08 50 void init(HCED * hced, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t ep_number, HCTD* td_list[2]);
sayzyas 43:1675750cca08 51
sayzyas 43:1675750cca08 52 /**
sayzyas 43:1675750cca08 53 * Set next token. Warning: only useful for the control endpoint
sayzyas 43:1675750cca08 54 *
sayzyas 43:1675750cca08 55 * @param token IN, OUT or SETUP token
sayzyas 43:1675750cca08 56 */
sayzyas 43:1675750cca08 57 void setNextToken(uint32_t token);
sayzyas 43:1675750cca08 58
sayzyas 43:1675750cca08 59 /**
sayzyas 43:1675750cca08 60 * Queue an endpoint
sayzyas 43:1675750cca08 61 *
sayzyas 43:1675750cca08 62 * @param endpoint endpoint which will be queued in the linked list
sayzyas 43:1675750cca08 63 */
sayzyas 43:1675750cca08 64 void queueEndpoint(USBEndpoint * endpoint);
sayzyas 43:1675750cca08 65
sayzyas 43:1675750cca08 66
sayzyas 43:1675750cca08 67 /**
sayzyas 43:1675750cca08 68 * Queue a transfer on the endpoint
sayzyas 43:1675750cca08 69 */
sayzyas 43:1675750cca08 70 void queueTransfer();
sayzyas 43:1675750cca08 71
sayzyas 43:1675750cca08 72 /**
sayzyas 43:1675750cca08 73 * Unqueue a transfer from the endpoint
sayzyas 43:1675750cca08 74 *
sayzyas 43:1675750cca08 75 * @param td hctd which will be unqueued
sayzyas 43:1675750cca08 76 */
sayzyas 43:1675750cca08 77 void unqueueTransfer(volatile HCTD * td);
sayzyas 43:1675750cca08 78
sayzyas 43:1675750cca08 79 /**
sayzyas 43:1675750cca08 80 * Attach a member function to call when a transfer is finished
sayzyas 43:1675750cca08 81 *
sayzyas 43:1675750cca08 82 * @param tptr pointer to the object to call the member function on
sayzyas 43:1675750cca08 83 * @param mptr pointer to the member function to be called
sayzyas 43:1675750cca08 84 */
sayzyas 43:1675750cca08 85 template<typename T>
sayzyas 43:1675750cca08 86 inline void attach(T* tptr, void (T::*mptr)(void)) {
sayzyas 43:1675750cca08 87 if((mptr != NULL) && (tptr != NULL)) {
sayzyas 43:1675750cca08 88 rx.attach(tptr, mptr);
sayzyas 43:1675750cca08 89 }
sayzyas 43:1675750cca08 90 }
sayzyas 43:1675750cca08 91
sayzyas 43:1675750cca08 92 /**
sayzyas 43:1675750cca08 93 * Attach a callback called when a transfer is finished
sayzyas 43:1675750cca08 94 *
sayzyas 43:1675750cca08 95 * @param fptr function pointer
sayzyas 43:1675750cca08 96 */
sayzyas 43:1675750cca08 97 inline void attach(void (*fptr)(void)) {
sayzyas 43:1675750cca08 98 if(fptr != NULL) {
sayzyas 43:1675750cca08 99 rx.attach(fptr);
sayzyas 43:1675750cca08 100 }
sayzyas 43:1675750cca08 101 }
sayzyas 43:1675750cca08 102
sayzyas 43:1675750cca08 103 /**
sayzyas 43:1675750cca08 104 * Call the handler associted to the end of a transfer
sayzyas 43:1675750cca08 105 */
sayzyas 43:1675750cca08 106 inline void call() {
sayzyas 43:1675750cca08 107 rx.call();
sayzyas 43:1675750cca08 108 };
sayzyas 43:1675750cca08 109
sayzyas 43:1675750cca08 110
sayzyas 43:1675750cca08 111 // setters
sayzyas 43:1675750cca08 112 inline void setState(USB_TYPE st) { state = st; }
sayzyas 43:1675750cca08 113 void setState(uint8_t st);
sayzyas 43:1675750cca08 114 void setDeviceAddress(uint8_t addr);
sayzyas 43:1675750cca08 115 inline void setLengthTransferred(int len) { transferred = len; };
sayzyas 43:1675750cca08 116 void setSpeed(uint8_t speed);
sayzyas 43:1675750cca08 117 void setSize(uint32_t size);
sayzyas 43:1675750cca08 118 inline void setDir(ENDPOINT_DIRECTION d) { dir = d; }
sayzyas 43:1675750cca08 119 inline void setIntfNb(uint8_t intf_nb_) { intf_nb = intf_nb_; };
sayzyas 43:1675750cca08 120
sayzyas 43:1675750cca08 121 // getters
sayzyas 43:1675750cca08 122 const char * getStateString();
sayzyas 43:1675750cca08 123 inline USB_TYPE getState() { return state; }
sayzyas 43:1675750cca08 124 inline ENDPOINT_TYPE getType() { return type; };
sayzyas 43:1675750cca08 125 inline uint8_t getDeviceAddress() { return hced->control & 0x7f; };
sayzyas 43:1675750cca08 126 inline int getLengthTransferred() { return transferred; }
sayzyas 43:1675750cca08 127 inline uint8_t * getBufStart() { return buf_start; }
sayzyas 43:1675750cca08 128 inline uint8_t getAddress(){ return address; };
sayzyas 43:1675750cca08 129 inline uint32_t getSize() { return (hced->control >> 16) & 0x3ff; };
sayzyas 43:1675750cca08 130 inline volatile HCTD * getHeadTD() { return (volatile HCTD*) ((uint32_t)hced->headTD & ~0xF); };
sayzyas 43:1675750cca08 131 inline volatile HCTD** getTDList() { return td_list; };
sayzyas 43:1675750cca08 132 inline volatile HCED * getHCED() { return hced; };
sayzyas 43:1675750cca08 133 inline ENDPOINT_DIRECTION getDir() { return dir; }
sayzyas 43:1675750cca08 134 inline volatile HCTD * getProcessedTD() { return td_current; };
sayzyas 43:1675750cca08 135 inline volatile HCTD* getNextTD() { return td_current; };
sayzyas 43:1675750cca08 136 inline bool isSetup() { return setup; }
sayzyas 43:1675750cca08 137 inline USBEndpoint * nextEndpoint() { return (USBEndpoint*)nextEp; };
sayzyas 43:1675750cca08 138 inline uint8_t getIntfNb() { return intf_nb; };
sayzyas 43:1675750cca08 139
sayzyas 43:1675750cca08 140 USBDeviceConnected * dev;
sayzyas 43:1675750cca08 141
sayzyas 43:1675750cca08 142 Queue<uint8_t, 1> ep_queue;
sayzyas 43:1675750cca08 143
sayzyas 43:1675750cca08 144 private:
sayzyas 43:1675750cca08 145 ENDPOINT_TYPE type;
sayzyas 43:1675750cca08 146 volatile USB_TYPE state;
sayzyas 43:1675750cca08 147 ENDPOINT_DIRECTION dir;
sayzyas 43:1675750cca08 148 bool setup;
sayzyas 43:1675750cca08 149
sayzyas 43:1675750cca08 150 uint8_t address;
sayzyas 43:1675750cca08 151
sayzyas 43:1675750cca08 152 int transfer_len;
sayzyas 43:1675750cca08 153 int transferred;
sayzyas 43:1675750cca08 154 uint8_t * buf_start;
sayzyas 43:1675750cca08 155
sayzyas 43:1675750cca08 156 FunctionPointer rx;
sayzyas 43:1675750cca08 157
sayzyas 43:1675750cca08 158 USBEndpoint* nextEp;
sayzyas 43:1675750cca08 159
sayzyas 43:1675750cca08 160 // USBEndpoint descriptor
sayzyas 43:1675750cca08 161 volatile HCED * hced;
sayzyas 43:1675750cca08 162
sayzyas 43:1675750cca08 163 volatile HCTD * td_list[2];
sayzyas 43:1675750cca08 164 volatile HCTD * td_current;
sayzyas 43:1675750cca08 165 volatile HCTD * td_next;
sayzyas 43:1675750cca08 166
sayzyas 43:1675750cca08 167 uint8_t intf_nb;
sayzyas 43:1675750cca08 168
sayzyas 43:1675750cca08 169 };
sayzyas 43:1675750cca08 170
sayzyas 43:1675750cca08 171 #endif