HEBOCON machine

Dependencies:   mbed Motorfader Servo WT2003M03

Committer:
abanum
Date:
Mon Jul 29 05:51:31 2019 +0000
Revision:
1:312b63cf250e
Parent:
0:a30ec7d94c3a
first pubrish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abanum 0:a30ec7d94c3a 1 /* mbed USBHost Library
abanum 0:a30ec7d94c3a 2 * Copyright (c) 2006-2013 ARM Limited
abanum 0:a30ec7d94c3a 3 *
abanum 0:a30ec7d94c3a 4 * Licensed under the Apache License, Version 2.0 (the "License");
abanum 0:a30ec7d94c3a 5 * you may not use this file except in compliance with the License.
abanum 0:a30ec7d94c3a 6 * You may obtain a copy of the License at
abanum 0:a30ec7d94c3a 7 *
abanum 0:a30ec7d94c3a 8 * http://www.apache.org/licenses/LICENSE-2.0
abanum 0:a30ec7d94c3a 9 *
abanum 0:a30ec7d94c3a 10 * Unless required by applicable law or agreed to in writing, software
abanum 0:a30ec7d94c3a 11 * distributed under the License is distributed on an "AS IS" BASIS,
abanum 0:a30ec7d94c3a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
abanum 0:a30ec7d94c3a 13 * See the License for the specific language governing permissions and
abanum 0:a30ec7d94c3a 14 * limitations under the License.
abanum 0:a30ec7d94c3a 15 */
abanum 0:a30ec7d94c3a 16
abanum 0:a30ec7d94c3a 17 #pragma once
abanum 0:a30ec7d94c3a 18 #include "FunctionPointer.h"
abanum 0:a30ec7d94c3a 19 #include "USBHostTypes.h"
abanum 0:a30ec7d94c3a 20 #include "USBDeviceConnected.h"
abanum 0:a30ec7d94c3a 21
abanum 0:a30ec7d94c3a 22 class USBDeviceConnected;
abanum 0:a30ec7d94c3a 23
abanum 0:a30ec7d94c3a 24 /**
abanum 0:a30ec7d94c3a 25 * USBEndpoint class
abanum 0:a30ec7d94c3a 26 */
abanum 0:a30ec7d94c3a 27 class USBEndpoint {
abanum 0:a30ec7d94c3a 28 public:
abanum 0:a30ec7d94c3a 29 /**
abanum 0:a30ec7d94c3a 30 * Constructor
abanum 0:a30ec7d94c3a 31 */
abanum 0:a30ec7d94c3a 32 USBEndpoint(USBDeviceConnected* _dev) {
abanum 0:a30ec7d94c3a 33 init(CONTROL_ENDPOINT, IN, 8, 0);
abanum 0:a30ec7d94c3a 34 dev = _dev;
abanum 0:a30ec7d94c3a 35 pData = NULL;
abanum 0:a30ec7d94c3a 36 }
abanum 0:a30ec7d94c3a 37
abanum 0:a30ec7d94c3a 38 /**
abanum 0:a30ec7d94c3a 39 * Initialize an endpoint
abanum 0:a30ec7d94c3a 40 *
abanum 0:a30ec7d94c3a 41 * @param type endpoint type
abanum 0:a30ec7d94c3a 42 * @param dir endpoint direction
abanum 0:a30ec7d94c3a 43 * @param size endpoint size
abanum 0:a30ec7d94c3a 44 * @param ep_number endpoint number
abanum 0:a30ec7d94c3a 45 */
abanum 0:a30ec7d94c3a 46 void init(ENDPOINT_TYPE _type, ENDPOINT_DIRECTION _dir, uint32_t size, uint8_t ep_number) {
abanum 0:a30ec7d94c3a 47 setState(USB_TYPE_FREE);
abanum 0:a30ec7d94c3a 48 setType(_type);
abanum 0:a30ec7d94c3a 49 dir = _dir;
abanum 0:a30ec7d94c3a 50 MaxPacketSize = size;
abanum 0:a30ec7d94c3a 51 address = ep_number;
abanum 0:a30ec7d94c3a 52 data01_toggle = DATA0;
abanum 0:a30ec7d94c3a 53 }
abanum 0:a30ec7d94c3a 54
abanum 0:a30ec7d94c3a 55 void ohci_init(uint8_t frameCount, uint8_t queueLimit) {
abanum 0:a30ec7d94c3a 56 ohci.frameCount = frameCount;
abanum 0:a30ec7d94c3a 57 ohci.queueLimit = queueLimit;
abanum 0:a30ec7d94c3a 58 }
abanum 0:a30ec7d94c3a 59
abanum 0:a30ec7d94c3a 60 /**
abanum 0:a30ec7d94c3a 61 * Attach a member function to call when a transfer is finished
abanum 0:a30ec7d94c3a 62 *
abanum 0:a30ec7d94c3a 63 * @param tptr pointer to the object to call the member function on
abanum 0:a30ec7d94c3a 64 * @param mptr pointer to the member function to be called
abanum 0:a30ec7d94c3a 65 */
abanum 0:a30ec7d94c3a 66 template<typename T>
abanum 0:a30ec7d94c3a 67 inline void attach(T* tptr, void (T::*mptr)(void)) {
abanum 0:a30ec7d94c3a 68 if((mptr != NULL) && (tptr != NULL)) {
abanum 0:a30ec7d94c3a 69 rx.attach(tptr, mptr);
abanum 0:a30ec7d94c3a 70 }
abanum 0:a30ec7d94c3a 71 }
abanum 0:a30ec7d94c3a 72
abanum 0:a30ec7d94c3a 73 /**
abanum 0:a30ec7d94c3a 74 * Attach a callback called when a transfer is finished
abanum 0:a30ec7d94c3a 75 *
abanum 0:a30ec7d94c3a 76 * @param fptr function pointer
abanum 0:a30ec7d94c3a 77 */
abanum 0:a30ec7d94c3a 78 inline void attach(void (*fptr)(void)) {
abanum 0:a30ec7d94c3a 79 if(fptr != NULL) {
abanum 0:a30ec7d94c3a 80 rx.attach(fptr);
abanum 0:a30ec7d94c3a 81 }
abanum 0:a30ec7d94c3a 82 }
abanum 0:a30ec7d94c3a 83
abanum 0:a30ec7d94c3a 84 /**
abanum 0:a30ec7d94c3a 85 * Call the handler associted to the end of a transfer
abanum 0:a30ec7d94c3a 86 */
abanum 0:a30ec7d94c3a 87 inline void call() {
abanum 0:a30ec7d94c3a 88 rx.call();
abanum 0:a30ec7d94c3a 89 };
abanum 0:a30ec7d94c3a 90
abanum 0:a30ec7d94c3a 91 void setType(ENDPOINT_TYPE _type) { type = _type; }
abanum 0:a30ec7d94c3a 92 void setState(USB_TYPE st) { state = st; }
abanum 0:a30ec7d94c3a 93 void setDevice(USBDeviceConnected* _dev) { dev = _dev; }
abanum 0:a30ec7d94c3a 94 void setBuffer(uint8_t* buf, int size) { buf_start = buf, buf_size = size; }
abanum 0:a30ec7d94c3a 95 void setLengthTransferred(int len) { transferred = len; };
abanum 0:a30ec7d94c3a 96 void setAddress(int addr) { address = addr; }
abanum 0:a30ec7d94c3a 97 void setSize(int size) { MaxPacketSize = size; }
abanum 0:a30ec7d94c3a 98 void setData01(uint8_t data01) { data01_toggle = data01; }
abanum 0:a30ec7d94c3a 99 void setNextEndpoint(USBEndpoint* ep) { nextEp = ep; };
abanum 0:a30ec7d94c3a 100 template<class T>
abanum 0:a30ec7d94c3a 101 void setHALData(T data) { pData = data; }
abanum 0:a30ec7d94c3a 102
abanum 0:a30ec7d94c3a 103 USBDeviceConnected* getDevice() { return dev; }
abanum 0:a30ec7d94c3a 104 ENDPOINT_TYPE getType() { return type; };
abanum 0:a30ec7d94c3a 105 USB_TYPE getState() { return state; }
abanum 0:a30ec7d94c3a 106 int getLengthTransferred() { return transferred; }
abanum 0:a30ec7d94c3a 107 uint8_t *getBufStart() { return buf_start; }
abanum 0:a30ec7d94c3a 108 int getBufSize() { return buf_size; }
abanum 0:a30ec7d94c3a 109 uint8_t getAddress(){ return address; };
abanum 0:a30ec7d94c3a 110 int getSize() { return MaxPacketSize; }
abanum 0:a30ec7d94c3a 111 ENDPOINT_DIRECTION getDir() { return dir; }
abanum 0:a30ec7d94c3a 112 uint8_t getData01() { return data01_toggle; }
abanum 0:a30ec7d94c3a 113 void toggleData01() {
abanum 0:a30ec7d94c3a 114 data01_toggle = (data01_toggle == DATA0) ? DATA1 : DATA0;
abanum 0:a30ec7d94c3a 115 }
abanum 0:a30ec7d94c3a 116 USBEndpoint* nextEndpoint() { return nextEp; };
abanum 0:a30ec7d94c3a 117 template<class T>
abanum 0:a30ec7d94c3a 118 T getHALData() { return reinterpret_cast<T>(pData); }
abanum 0:a30ec7d94c3a 119
abanum 0:a30ec7d94c3a 120 struct {
abanum 0:a30ec7d94c3a 121 uint8_t queueLimit;
abanum 0:a30ec7d94c3a 122 uint8_t frameCount; // 1-8
abanum 0:a30ec7d94c3a 123 } ohci;
abanum 0:a30ec7d94c3a 124 private:
abanum 0:a30ec7d94c3a 125 USBEndpoint(){}
abanum 0:a30ec7d94c3a 126 ENDPOINT_TYPE type;
abanum 0:a30ec7d94c3a 127 USB_TYPE state;
abanum 0:a30ec7d94c3a 128 ENDPOINT_DIRECTION dir;
abanum 0:a30ec7d94c3a 129 USBDeviceConnected* dev;
abanum 0:a30ec7d94c3a 130 uint8_t data01_toggle; // DATA0,DATA1
abanum 0:a30ec7d94c3a 131 uint8_t address;
abanum 0:a30ec7d94c3a 132 int transferred;
abanum 0:a30ec7d94c3a 133 uint8_t * buf_start;
abanum 0:a30ec7d94c3a 134 int buf_size;
abanum 0:a30ec7d94c3a 135 FunctionPointer rx;
abanum 0:a30ec7d94c3a 136 int MaxPacketSize;
abanum 0:a30ec7d94c3a 137 USBEndpoint* nextEp;
abanum 0:a30ec7d94c3a 138 void* pData;
abanum 0:a30ec7d94c3a 139 };
abanum 0:a30ec7d94c3a 140
abanum 0:a30ec7d94c3a 141 class EndpointQueue {
abanum 0:a30ec7d94c3a 142 public:
abanum 0:a30ec7d94c3a 143 EndpointQueue():head(NULL),tail(NULL) {}
abanum 0:a30ec7d94c3a 144 void push(USBEndpoint* ep) {
abanum 0:a30ec7d94c3a 145 if (head) {
abanum 0:a30ec7d94c3a 146 tail->setNextEndpoint(ep);
abanum 0:a30ec7d94c3a 147 } else {
abanum 0:a30ec7d94c3a 148 head = ep;
abanum 0:a30ec7d94c3a 149 }
abanum 0:a30ec7d94c3a 150 tail = ep;
abanum 0:a30ec7d94c3a 151 ep->setNextEndpoint(NULL);
abanum 0:a30ec7d94c3a 152 }
abanum 0:a30ec7d94c3a 153 USBEndpoint* pop() {
abanum 0:a30ec7d94c3a 154 USBEndpoint* ep = head;
abanum 0:a30ec7d94c3a 155 if (ep) {
abanum 0:a30ec7d94c3a 156 head = ep->nextEndpoint();
abanum 0:a30ec7d94c3a 157 }
abanum 0:a30ec7d94c3a 158 return ep;
abanum 0:a30ec7d94c3a 159 }
abanum 0:a30ec7d94c3a 160 bool empty() { return head == NULL; }
abanum 0:a30ec7d94c3a 161
abanum 0:a30ec7d94c3a 162 private:
abanum 0:a30ec7d94c3a 163 USBEndpoint* head;
abanum 0:a30ec7d94c3a 164 USBEndpoint* tail;
abanum 0:a30ec7d94c3a 165 };
abanum 0:a30ec7d94c3a 166
abanum 0:a30ec7d94c3a 167
abanum 0:a30ec7d94c3a 168