USB lib Joerg
Fork of USBHost_DISCO-F746NG by
Diff: USBHost/USBEndpoint.h
- Revision:
- 10:40c7f6788902
- Parent:
- 9:7f9f64cf5ded
diff -r 7f9f64cf5ded -r 40c7f6788902 USBHost/USBEndpoint.h --- a/USBHost/USBEndpoint.h Mon Feb 03 13:00:16 2014 +0000 +++ b/USBHost/USBEndpoint.h Wed Feb 05 13:34:37 2014 +0000 @@ -29,8 +29,25 @@ /** * Constructor */ - USBEndpoint() : data01_toggle(DATA0),address(0),MaxPacketSize(8) { - dev = NULL; + USBEndpoint(USBDeviceConnected* _dev) { + init(CONTROL_ENDPOINT, IN, 8, 0); + dev = _dev; + } + + /** + * Initialize an endpoint + * + * @param type endpoint type + * @param dir endpoint direction + * @param size endpoint size + * @param ep_number endpoint number + */ + void init(ENDPOINT_TYPE _type, ENDPOINT_DIRECTION _dir, uint32_t size, uint8_t ep_number) { + type = _type; + dir = _dir; + MaxPacketSize = size; + address = ep_number; + data01_toggle = DATA0; } /** @@ -69,9 +86,8 @@ void setBuffer(uint8_t* buf, int size) { buf_start = buf, buf_size = size; } void setLengthTransferred(int len) { transferred = len; }; void setSize(int size) { MaxPacketSize = size; } - void setType(ENDPOINT_TYPE _type) { type = _type; }; - void setAddress(uint8_t addr) { address = addr; } void setData01(uint8_t data01) { data01_toggle = data01; } + void setNextEndpoint(USBEndpoint* ep) { nextEp = ep; }; USBDeviceConnected* getDevice() { return dev; } ENDPOINT_TYPE getType() { return type; }; @@ -80,11 +96,12 @@ int getBufSize() { return buf_size; } uint8_t getAddress(){ return address; }; int getSize() { return MaxPacketSize; } - ENDPOINT_DIRECTION getDir() { return (address & 0x80) ? IN : OUT; } + ENDPOINT_DIRECTION getDir() { return dir; } uint8_t getData01() { return data01_toggle; } void toggleData01() { data01_toggle = (data01_toggle == DATA0) ? DATA1 : DATA0; } + USBEndpoint* nextEndpoint() { return nextEp; }; private: ENDPOINT_TYPE type; @@ -92,12 +109,36 @@ USBDeviceConnected* dev; uint8_t data01_toggle; // DATA0,DATA1 uint8_t address; - int transferred; uint8_t * buf_start; int buf_size; - FunctionPointer rx; + int MaxPacketSize; + USBEndpoint* nextEp; +}; - int MaxPacketSize; +class EndpointQueue { +public: + EndpointQueue():head(NULL),tail(NULL) {} + void push(USBEndpoint* ep) { + if (head) { + tail->setNextEndpoint(ep); + } else { + head = ep; + } + tail = ep; + ep->setNextEndpoint(NULL); + } + USBEndpoint* pop() { + USBEndpoint* ep = head; + if (ep) { + head = ep->nextEndpoint(); + } + return ep; + } + bool empty() { return head == NULL; } + +private: + USBEndpoint* head; + USBEndpoint* tail; };