From 756b32e6f6e4849ff163dde223fe1aea237a70ab Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Fri, 24 Aug 2018 16:43:58 +0200 Subject: [PATCH] Port to SAMD architecture * Make some features AVR only (like USBDevice.wakeupHost() ) * Make some code more generic (mostly EP size and different includes path) --- src/HID-APIs/SystemAPI.hpp | 2 +- src/HID-Settings.h | 60 ++++++++++++++++++++++++++ src/MultiReport/AbsoluteMouse.h | 1 - src/MultiReport/Consumer.h | 1 - src/MultiReport/Gamepad.h | 1 - src/MultiReport/ImprovedKeyboard.cpp | 2 + src/MultiReport/ImprovedKeyboard.h | 1 - src/MultiReport/ImprovedMouse.h | 1 - src/MultiReport/NKROKeyboard.h | 1 - src/MultiReport/SurfaceDial.h | 1 - src/MultiReport/System.h | 1 - src/SingleReport/BootKeyboard.cpp | 6 +++ src/SingleReport/BootKeyboard.h | 3 +- src/SingleReport/BootMouse.h | 3 +- src/SingleReport/RawHID.h | 3 +- src/SingleReport/SingleAbsoluteMouse.h | 3 +- src/SingleReport/SingleConsumer.h | 3 +- src/SingleReport/SingleGamepad.h | 3 +- src/SingleReport/SingleNKROKeyboard.h | 3 +- src/SingleReport/SingleSystem.h | 3 +- src/port/samd.cpp | 13 ++++++ 21 files changed, 90 insertions(+), 25 deletions(-) create mode 100644 src/port/samd.cpp diff --git a/src/HID-APIs/SystemAPI.hpp b/src/HID-APIs/SystemAPI.hpp index edb97753..8daefbc2 100644 --- a/src/HID-APIs/SystemAPI.hpp +++ b/src/HID-APIs/SystemAPI.hpp @@ -53,7 +53,7 @@ void SystemAPI::releaseAll(void){ } void SystemAPI::press(SystemKeycode s){ -#ifdef USBCON +#if defined(__AVR__) && defined(USBCON) if (s == SYSTEM_WAKE_UP) USBDevice.wakeupHost(); else diff --git a/src/HID-Settings.h b/src/HID-Settings.h index dc28a836..494c470b 100644 --- a/src/HID-Settings.h +++ b/src/HID-Settings.h @@ -111,4 +111,64 @@ THE SOFTWARE. #ifndef HID_REPORTID_SURFACEDIAL #define HID_REPORTID_SURFACEDIAL 10 +#endif + +#if defined(ARDUINO_ARCH_AVR) + +#include "PluggableUSB.h" + +#define EPTYPE_DESCRIPTOR_SIZE uint8_t + +#elif defined(ARDUINO_ARCH_SAM) + +#include "USB/PluggableUSB.h" + +#define EPTYPE_DESCRIPTOR_SIZE uint32_t +#define EP_TYPE_INTERRUPT_IN (UOTGHS_DEVEPTCFG_EPSIZE_512_BYTE | \ + UOTGHS_DEVEPTCFG_EPDIR_IN | \ + UOTGHS_DEVEPTCFG_EPTYPE_BLK | \ + UOTGHS_DEVEPTCFG_EPBK_1_BANK | \ + UOTGHS_DEVEPTCFG_NBTRANS_1_TRANS | \ + UOTGHS_DEVEPTCFG_ALLOC) +#define EP_TYPE_INTERRUPT_OUT (UOTGHS_DEVEPTCFG_EPSIZE_512_BYTE | \ + UOTGHS_DEVEPTCFG_EPTYPE_BLK | \ + UOTGHS_DEVEPTCFG_EPBK_1_BANK | \ + UOTGHS_DEVEPTCFG_NBTRANS_1_TRANS | \ + UOTGHS_DEVEPTCFG_ALLOC) +#define USB_EP_SIZE EPX_SIZE +#define USB_SendControl USBD_SendControl +#define USB_Available USBD_Available +#define USB_Recv USBD_Recv +#define USB_Send USBD_Send +#define USB_Flush USBD_Flush + +#elif defined(ARDUINO_ARCH_SAMD) + +#include "USB/PluggableUSB.h" + +#define EPTYPE_DESCRIPTOR_SIZE uint32_t +#define EP_TYPE_INTERRUPT_IN USB_ENDPOINT_TYPE_INTERRUPT | USB_ENDPOINT_IN(0); +#define EP_TYPE_INTERRUPT_OUT USB_ENDPOINT_TYPE_INTERRUPT | USB_ENDPOINT_OUT(0); +#define USB_EP_SIZE EPX_SIZE +//#define USB_SendControl USBDevice.sendControl -> real C++ functions to take care of PGM overloading +#define USB_Available USBDevice.available +#define USB_Recv USBDevice.recv +#define USB_RecvControl USBDevice.recvControl +#define USB_Send USBDevice.send +#define USB_Flush USBDevice.flush + +int USB_SendControl(void* y, uint8_t z); +int USB_SendControl(uint8_t x, const void* y, uint8_t z); + +#define TRANSFER_PGM 0 +#define TRANSFER_RELEASE 0 + +#define HID_REPORT_TYPE_INPUT 1 +#define HID_REPORT_TYPE_OUTPUT 2 +#define HID_REPORT_TYPE_FEATURE 3 + +#else + +#error "Unsupported architecture" + #endif \ No newline at end of file diff --git a/src/MultiReport/AbsoluteMouse.h b/src/MultiReport/AbsoluteMouse.h index be0c2d90..34d271a4 100644 --- a/src/MultiReport/AbsoluteMouse.h +++ b/src/MultiReport/AbsoluteMouse.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/AbsoluteMouseAPI.h" diff --git a/src/MultiReport/Consumer.h b/src/MultiReport/Consumer.h index ede2458b..c6951919 100644 --- a/src/MultiReport/Consumer.h +++ b/src/MultiReport/Consumer.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/ConsumerAPI.h" diff --git a/src/MultiReport/Gamepad.h b/src/MultiReport/Gamepad.h index dfb21a2a..8ef216a6 100644 --- a/src/MultiReport/Gamepad.h +++ b/src/MultiReport/Gamepad.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/GamepadAPI.h" diff --git a/src/MultiReport/ImprovedKeyboard.cpp b/src/MultiReport/ImprovedKeyboard.cpp index 3b42a9e0..d805d66a 100644 --- a/src/MultiReport/ImprovedKeyboard.cpp +++ b/src/MultiReport/ImprovedKeyboard.cpp @@ -76,7 +76,9 @@ int Keyboard_::send(void) } void Keyboard_::wakeupHost(void){ +#ifdef __AVR__ USBDevice.wakeupHost(); +#endif } Keyboard_ Keyboard; diff --git a/src/MultiReport/ImprovedKeyboard.h b/src/MultiReport/ImprovedKeyboard.h index d59486c2..f6c8084e 100644 --- a/src/MultiReport/ImprovedKeyboard.h +++ b/src/MultiReport/ImprovedKeyboard.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/DefaultKeyboardAPI.h" diff --git a/src/MultiReport/ImprovedMouse.h b/src/MultiReport/ImprovedMouse.h index 14d83a03..fd99cf2c 100644 --- a/src/MultiReport/ImprovedMouse.h +++ b/src/MultiReport/ImprovedMouse.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/MouseAPI.h" diff --git a/src/MultiReport/NKROKeyboard.h b/src/MultiReport/NKROKeyboard.h index ef5c9b4d..725697c4 100644 --- a/src/MultiReport/NKROKeyboard.h +++ b/src/MultiReport/NKROKeyboard.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/NKROKeyboardAPI.h" diff --git a/src/MultiReport/SurfaceDial.h b/src/MultiReport/SurfaceDial.h index 8484a340..af042c67 100644 --- a/src/MultiReport/SurfaceDial.h +++ b/src/MultiReport/SurfaceDial.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/SurfaceDialAPI.h" diff --git a/src/MultiReport/System.h b/src/MultiReport/System.h index a2336e8c..0581f85c 100644 --- a/src/MultiReport/System.h +++ b/src/MultiReport/System.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/SystemAPI.h" diff --git a/src/SingleReport/BootKeyboard.cpp b/src/SingleReport/BootKeyboard.cpp index 0261b411..ca01e0a3 100644 --- a/src/SingleReport/BootKeyboard.cpp +++ b/src/SingleReport/BootKeyboard.cpp @@ -121,12 +121,16 @@ bool BootKeyboard_::setup(USBSetup& setup) } if (request == HID_GET_PROTOCOL) { // TODO improve +#ifdef __AVR__ UEDATX = protocol; +#endif return true; } if (request == HID_GET_IDLE) { // TODO improve +#ifdef __AVR__ UEDATX = idle; +#endif return true; } } @@ -196,7 +200,9 @@ int BootKeyboard_::send(void){ } void BootKeyboard_::wakeupHost(void){ +#ifdef __AVR__ USBDevice.wakeupHost(); +#endif } diff --git a/src/SingleReport/BootKeyboard.h b/src/SingleReport/BootKeyboard.h index cd28a8f6..feb72bcf 100644 --- a/src/SingleReport/BootKeyboard.h +++ b/src/SingleReport/BootKeyboard.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/DefaultKeyboardAPI.h" @@ -72,7 +71,7 @@ class BootKeyboard_ : public PluggableUSBModule, public DefaultKeyboardAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/BootMouse.h b/src/SingleReport/BootMouse.h index 833f22d2..d227bc65 100644 --- a/src/SingleReport/BootMouse.h +++ b/src/SingleReport/BootMouse.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/MouseAPI.h" @@ -43,7 +42,7 @@ class BootMouse_ : public PluggableUSBModule, public MouseAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/RawHID.h b/src/SingleReport/RawHID.h index 03829710..4955db5c 100644 --- a/src/SingleReport/RawHID.h +++ b/src/SingleReport/RawHID.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" @@ -164,7 +163,7 @@ class RawHID_ : public PluggableUSBModule, public Stream int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/SingleAbsoluteMouse.h b/src/SingleReport/SingleAbsoluteMouse.h index 2a13fe94..7936be6f 100644 --- a/src/SingleReport/SingleAbsoluteMouse.h +++ b/src/SingleReport/SingleAbsoluteMouse.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/AbsoluteMouseAPI.h" @@ -44,7 +43,7 @@ class SingleAbsoluteMouse_ : public PluggableUSBModule, public AbsoluteMouseAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/SingleConsumer.h b/src/SingleReport/SingleConsumer.h index c7a8a436..dcc823b7 100644 --- a/src/SingleReport/SingleConsumer.h +++ b/src/SingleReport/SingleConsumer.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/ConsumerAPI.h" @@ -44,7 +43,7 @@ class SingleConsumer_ : public PluggableUSBModule, public ConsumerAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/SingleGamepad.h b/src/SingleReport/SingleGamepad.h index bca1db59..163a1078 100644 --- a/src/SingleReport/SingleGamepad.h +++ b/src/SingleReport/SingleGamepad.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/GamepadAPI.h" @@ -42,7 +41,7 @@ class SingleGamepad_ : public PluggableUSBModule, public GamepadAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/SingleNKROKeyboard.h b/src/SingleReport/SingleNKROKeyboard.h index d5f2ead6..356af69d 100644 --- a/src/SingleReport/SingleNKROKeyboard.h +++ b/src/SingleReport/SingleNKROKeyboard.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/NKROKeyboardAPI.h" @@ -46,7 +45,7 @@ class SingleNKROKeyboard_ : public PluggableUSBModule, public NKROKeyboardAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/SingleReport/SingleSystem.h b/src/SingleReport/SingleSystem.h index 01ca15ca..abb9b41c 100644 --- a/src/SingleReport/SingleSystem.h +++ b/src/SingleReport/SingleSystem.h @@ -25,7 +25,6 @@ THE SOFTWARE. #pragma once #include -#include "PluggableUSB.h" #include "HID.h" #include "HID-Settings.h" #include "../HID-APIs/SystemAPI.h" @@ -44,7 +43,7 @@ class SingleSystem_ : public PluggableUSBModule, public SystemAPI int getDescriptor(USBSetup& setup); bool setup(USBSetup& setup); - uint8_t epType[1]; + EPTYPE_DESCRIPTOR_SIZE epType[1]; uint8_t protocol; uint8_t idle; diff --git a/src/port/samd.cpp b/src/port/samd.cpp new file mode 100644 index 00000000..a50e79fd --- /dev/null +++ b/src/port/samd.cpp @@ -0,0 +1,13 @@ +#include "Arduino.h" + +#ifdef ARDUINO_ARCH_SAMD + +int USB_SendControl(void* b, unsigned char c) { + USBDevice.sendControl(b, c); +} + +int USB_SendControl(uint8_t a, const void* b, uint8_t c) { + USBDevice.sendControl(b, c); +} + +#endif