mirror of
https://github.com/arduino/Arduino.git
synced 2024-12-04 15:24:12 +01:00
0f9f63f2a5
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
106 lines
2.7 KiB
C++
106 lines
2.7 KiB
C++
/*
|
|
Copyright (c) 2015, Arduino LLC
|
|
Original code (pre-library): Copyright (c) 2011, Peter Barrett
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for
|
|
any purpose with or without fee is hereby granted, provided that the
|
|
above copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
|
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
|
|
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
|
OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
SOFTWARE.
|
|
*/
|
|
|
|
#ifndef HID_h
|
|
#define HID_h
|
|
|
|
#include <stdint.h>
|
|
#include <Arduino.h>
|
|
#include "PluggableUSB.h"
|
|
|
|
#if defined(USBCON)
|
|
|
|
#define _USING_HID
|
|
|
|
// HID 'Driver'
|
|
// ------------
|
|
#define HID_GET_REPORT 0x01
|
|
#define HID_GET_IDLE 0x02
|
|
#define HID_GET_PROTOCOL 0x03
|
|
#define HID_SET_REPORT 0x09
|
|
#define HID_SET_IDLE 0x0A
|
|
#define HID_SET_PROTOCOL 0x0B
|
|
|
|
#define HID_HID_DESCRIPTOR_TYPE 0x21
|
|
#define HID_REPORT_DESCRIPTOR_TYPE 0x22
|
|
#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t len; // 9
|
|
uint8_t dtype; // 0x21
|
|
uint8_t addr;
|
|
uint8_t versionL; // 0x101
|
|
uint8_t versionH; // 0x101
|
|
uint8_t country;
|
|
uint8_t desctype; // 0x22 report
|
|
uint8_t descLenL;
|
|
uint8_t descLenH;
|
|
} HIDDescDescriptor;
|
|
|
|
typedef struct
|
|
{
|
|
InterfaceDescriptor hid;
|
|
HIDDescDescriptor desc;
|
|
EndpointDescriptor in;
|
|
} HIDDescriptor;
|
|
|
|
class HIDDescriptorListNode {
|
|
public:
|
|
HIDDescriptorListNode *next = NULL;
|
|
HIDDescriptorListNode(const void *d, const uint16_t l) : data(d), length(l) { }
|
|
|
|
const void* data;
|
|
uint16_t length;
|
|
};
|
|
|
|
class HID_ : public PUSBListNode
|
|
{
|
|
public:
|
|
HID_(void);
|
|
int begin(void);
|
|
void SendReport(uint8_t id, const void* data, int len);
|
|
void AppendDescriptor(HIDDescriptorListNode* node);
|
|
|
|
protected:
|
|
// Implementation of the PUSBListNode
|
|
int getInterface(uint8_t* interfaceCount);
|
|
int getDescriptor(USBSetup& setup);
|
|
bool setup(USBSetup& setup);
|
|
|
|
private:
|
|
uint8_t epType[1];
|
|
|
|
HIDDescriptorListNode* rootNode;
|
|
uint16_t descriptorSize;
|
|
|
|
uint8_t protocol;
|
|
uint8_t idle;
|
|
};
|
|
|
|
// Replacement for global singleton.
|
|
// This function prevents static-initialization-order-fiasco
|
|
// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
|
|
HID_& HID();
|
|
|
|
#define D_HIDREPORT(length) { 9, 0x21, 0x01, 0x01, 0, 1, 0x22, lowByte(length), highByte(length) }
|
|
|
|
#endif // USBCON
|
|
|
|
#endif // HID_h
|