From 0f9f63f2a5c25124b4f5bf20762382f4b0482216 Mon Sep 17 00:00:00 2001 From: NicoHood Date: Wed, 7 Oct 2015 19:02:40 +0200 Subject: [PATCH] [PUSB] Made getDescriptor() and setup() more flexible Alternatively we can only pass the wIndex to getDescriptor but I suggest to just pass the pointer aka reference of the whole setup. In guess (havent tested this) that this results in more or less the code size but its a) idential with the other functions and b) we late have more flexibility here. The Code got a quick SerialKeyboard.ino test --- .../avr/cores/arduino/PluggableUSB.cpp | 8 ++--- .../arduino/avr/cores/arduino/PluggableUSB.h | 8 ++--- .../arduino/avr/cores/arduino/USBCore.cpp | 4 +-- hardware/arduino/avr/libraries/HID/HID.cpp | 29 +++++++++---------- hardware/arduino/avr/libraries/HID/HID.h | 4 +-- 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/hardware/arduino/avr/cores/arduino/PluggableUSB.cpp b/hardware/arduino/avr/cores/arduino/PluggableUSB.cpp index 95d40791c..21dc7a89d 100644 --- a/hardware/arduino/avr/cores/arduino/PluggableUSB.cpp +++ b/hardware/arduino/avr/cores/arduino/PluggableUSB.cpp @@ -38,11 +38,11 @@ int PluggableUSB_::getInterface(uint8_t* interfaceCount) return sent; } -int PluggableUSB_::getDescriptor(int8_t type) +int PluggableUSB_::getDescriptor(USBSetup& setup) { PUSBListNode* node; for (node = rootNode; node; node = node->next) { - int ret = node->getDescriptor(type); + int ret = node->getDescriptor(setup); // ret!=0 -> request has been processed if (ret) return ret; @@ -50,11 +50,11 @@ int PluggableUSB_::getDescriptor(int8_t type) return 0; } -bool PluggableUSB_::setup(USBSetup& setup, uint8_t interfaceNum) +bool PluggableUSB_::setup(USBSetup& setup) { PUSBListNode* node; for (node = rootNode; node; node = node->next) { - if (node->setup(setup, interfaceNum)) { + if (node->setup(setup)) { return true; } } diff --git a/hardware/arduino/avr/cores/arduino/PluggableUSB.h b/hardware/arduino/avr/cores/arduino/PluggableUSB.h index b7c52d610..d12c4c432 100644 --- a/hardware/arduino/avr/cores/arduino/PluggableUSB.h +++ b/hardware/arduino/avr/cores/arduino/PluggableUSB.h @@ -35,9 +35,9 @@ public: inline uint8_t endpoint() const { return pluggedEndpoint; } protected: - virtual bool setup(USBSetup& setup, uint8_t interfaceNum) = 0; + virtual bool setup(USBSetup& setup) = 0; virtual int getInterface(uint8_t* interfaceCount) = 0; - virtual int getDescriptor(int8_t t) = 0; + virtual int getDescriptor(USBSetup& setup) = 0; uint8_t pluggedInterface; uint8_t pluggedEndpoint; @@ -56,8 +56,8 @@ public: PluggableUSB_(); bool plug(PUSBListNode *node); int getInterface(uint8_t* interfaceCount); - int getDescriptor(int8_t type); - bool setup(USBSetup& setup, uint8_t interfaceNum); + int getDescriptor(USBSetup& setup); + bool setup(USBSetup& setup); private: uint8_t lastIf; diff --git a/hardware/arduino/avr/cores/arduino/USBCore.cpp b/hardware/arduino/avr/cores/arduino/USBCore.cpp index 5db9f521a..f67bfeabc 100644 --- a/hardware/arduino/avr/cores/arduino/USBCore.cpp +++ b/hardware/arduino/avr/cores/arduino/USBCore.cpp @@ -362,7 +362,7 @@ bool ClassInterfaceRequest(USBSetup& setup) return CDC_Setup(setup); #ifdef PLUGGABLE_USB_ENABLED - return PluggableUSB().setup(setup, i); + return PluggableUSB().setup(setup); #endif return false; } @@ -476,7 +476,7 @@ bool SendDescriptor(USBSetup& setup) InitControl(setup.wLength); #ifdef PLUGGABLE_USB_ENABLED - ret = PluggableUSB().getDescriptor(t); + ret = PluggableUSB().getDescriptor(setup); if (ret != 0) { return (ret > 0 ? true : false); } diff --git a/hardware/arduino/avr/libraries/HID/HID.cpp b/hardware/arduino/avr/libraries/HID/HID.cpp index b6b9ceadc..500eec9da 100644 --- a/hardware/arduino/avr/libraries/HID/HID.cpp +++ b/hardware/arduino/avr/libraries/HID/HID.cpp @@ -38,22 +38,21 @@ int HID_::getInterface(uint8_t* interfaceCount) return USB_SendControl(0, &hidInterface, sizeof(hidInterface)); } -int HID_::getDescriptor(int8_t type) +int HID_::getDescriptor(USBSetup& setup) { - if (HID_REPORT_DESCRIPTOR_TYPE == type) { - int total = 0; - HIDDescriptorListNode* node; - for (node = rootNode; node; node = node->next) { - int res = USB_SendControl(TRANSFER_PGM, node->data, node->length); - if (res == -1) - return -1; - total += res; - } - return total; + if (interface() != setup.wIndex) { + return 0; } - // Ignored - return 0; + int total = 0; + HIDDescriptorListNode* node; + for (node = rootNode; node; node = node->next) { + int res = USB_SendControl(TRANSFER_PGM, node->data, node->length); + if (res == -1) + return -1; + total += res; + } + return total; } void HID_::AppendDescriptor(HIDDescriptorListNode *node) @@ -76,9 +75,9 @@ void HID_::SendReport(uint8_t id, const void* data, int len) USB_Send(endpoint() | TRANSFER_RELEASE, data, len); } -bool HID_::setup(USBSetup& setup, uint8_t interfaceNum) +bool HID_::setup(USBSetup& setup) { - if (interface() != interfaceNum) { + if (interface() != setup.wIndex) { return false; } diff --git a/hardware/arduino/avr/libraries/HID/HID.h b/hardware/arduino/avr/libraries/HID/HID.h index e54e45e19..b282c20d5 100644 --- a/hardware/arduino/avr/libraries/HID/HID.h +++ b/hardware/arduino/avr/libraries/HID/HID.h @@ -80,8 +80,8 @@ public: protected: // Implementation of the PUSBListNode int getInterface(uint8_t* interfaceCount); - int getDescriptor(int8_t type); - bool setup(USBSetup& setup, uint8_t interfaceNum); + int getDescriptor(USBSetup& setup); + bool setup(USBSetup& setup); private: uint8_t epType[1];