summaryrefslogtreecommitdiff
path: root/protocol/usb_hid/USB_Host_Shield_2.0/hid.h
blob: 72942ebc92ee93c17e0d5a4f870cbbdb5f06806d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved.

This software may be distributed and modified under the terms of the GNU
General Public License version 2 (GPL2) as published by the Free Software
Foundation and appearing in the file GPL2.TXT included in the packaging of
this file. Please note that GPL2 Section 2[b] requires that all works based
on this software must also be made publicly available under the terms of
the GPL2 ("Copyleft").

Contact information
-------------------

Circuits At Home, LTD
Web      :  http://www.circuitsathome.com
e-mail   :  support@circuitsathome.com
 */
#if !defined(__HID_H__)
#define __HID_H__

#include "Usb.h"
#include "hidusagestr.h"

#define MAX_REPORT_PARSERS                      2
#define HID_MAX_HID_CLASS_DESCRIPTORS           5

#define DATA_SIZE_MASK                          0x03
#define TYPE_MASK                               0x0C
#define TAG_MASK                                0xF0

#define DATA_SIZE_0                             0x00
#define DATA_SIZE_1                             0x01
#define DATA_SIZE_2                             0x02
#define DATA_SIZE_4                             0x03

#define TYPE_MAIN                               0x00
#define TYPE_GLOBAL                             0x04
#define TYPE_LOCAL                              0x08

#define TAG_MAIN_INPUT                          0x80
#define TAG_MAIN_OUTPUT                         0x90
#define TAG_MAIN_COLLECTION                     0xA0
#define TAG_MAIN_FEATURE                        0xB0
#define TAG_MAIN_ENDCOLLECTION                  0xC0

#define TAG_GLOBAL_USAGEPAGE                    0x00
#define TAG_GLOBAL_LOGICALMIN                   0x10
#define TAG_GLOBAL_LOGICALMAX                   0x20
#define TAG_GLOBAL_PHYSMIN                      0x30
#define TAG_GLOBAL_PHYSMAX                      0x40
#define TAG_GLOBAL_UNITEXP                      0x50
#define TAG_GLOBAL_UNIT                         0x60
#define TAG_GLOBAL_REPORTSIZE                   0x70
#define TAG_GLOBAL_REPORTID                     0x80
#define TAG_GLOBAL_REPORTCOUNT                  0x90
#define TAG_GLOBAL_PUSH                         0xA0
#define TAG_GLOBAL_POP                          0xB0

#define TAG_LOCAL_USAGE                         0x00
#define TAG_LOCAL_USAGEMIN                      0x10
#define TAG_LOCAL_USAGEMAX                      0x20

/* HID requests */
#define bmREQ_HID_OUT                           USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define bmREQ_HID_IN                            USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE
#define bmREQ_HID_REPORT                        USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_STANDARD|USB_SETUP_RECIPIENT_INTERFACE

/* HID constants. Not part of chapter 9 */
/* Class-Specific Requests */
#define HID_REQUEST_GET_REPORT                  0x01
#define HID_REQUEST_GET_IDLE                    0x02
#define HID_REQUEST_GET_PROTOCOL                0x03
#define HID_REQUEST_SET_REPORT                  0x09
#define HID_REQUEST_SET_IDLE                    0x0A
#define HID_REQUEST_SET_PROTOCOL                0x0B

/* Class Descriptor Types */
#define HID_DESCRIPTOR_HID                      0x21
#define HID_DESCRIPTOR_REPORT                   0x22
#define HID_DESRIPTOR_PHY                       0x23

/* Protocol Selection */
#define HID_BOOT_PROTOCOL                       0x00
#define HID_RPT_PROTOCOL                        0x01

/* HID Interface Class Code */
#define HID_INTF                                0x03

/* HID Interface Class SubClass Codes */
#define HID_BOOT_INTF_SUBCLASS                  0x01

/* HID Interface Class Protocol Codes */
#define HID_PROTOCOL_NONE                       0x00
#define HID_PROTOCOL_KEYBOARD                   0x01
#define HID_PROTOCOL_MOUSE                      0x02

#define HID_ITEM_TYPE_MAIN                      0
#define HID_ITEM_TYPE_GLOBAL                    1
#define HID_ITEM_TYPE_LOCAL                     2
#define HID_ITEM_TYPE_RESERVED                  3

#define HID_LONG_ITEM_PREFIX                    0xfe    // Long item prefix value

#define bmHID_MAIN_ITEM_TAG                     0xfc    // Main item tag mask

#define bmHID_MAIN_ITEM_INPUT                   0x80    // Main item Input tag value
#define bmHID_MAIN_ITEM_OUTPUT                  0x90    // Main item Output tag value
#define bmHID_MAIN_ITEM_FEATURE                 0xb0    // Main item Feature tag value
#define bmHID_MAIN_ITEM_COLLECTION              0xa0    // Main item Collection tag value
#define bmHID_MAIN_ITEM_END_COLLECTION          0xce    // Main item End Collection tag value

#define HID_MAIN_ITEM_COLLECTION_PHYSICAL       0
#define HID_MAIN_ITEM_COLLECTION_APPLICATION    1
#define HID_MAIN_ITEM_COLLECTION_LOGICAL        2
#define HID_MAIN_ITEM_COLLECTION_REPORT         3
#define HID_MAIN_ITEM_COLLECTION_NAMED_ARRAY    4
#define HID_MAIN_ITEM_COLLECTION_USAGE_SWITCH   5
#define HID_MAIN_ITEM_COLLECTION_USAGE_MODIFIER 6

struct HidItemPrefix {
        uint8_t bSize : 2;
        uint8_t bType : 2;
        uint8_t bTag : 4;
};

struct MainItemIOFeature {
        uint8_t bmIsConstantOrData : 1;
        uint8_t bmIsArrayOrVariable : 1;
        uint8_t bmIsRelativeOrAbsolute : 1;
        uint8_t bmIsWrapOrNoWrap : 1;
        uint8_t bmIsNonLonearOrLinear : 1;
        uint8_t bmIsNoPreferedOrPrefered : 1;
        uint8_t bmIsNullOrNoNull : 1;
        uint8_t bmIsVolatileOrNonVolatile : 1;
};

class HID;

class HIDReportParser {
public:
        virtual void Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t *buf) = 0;
};

class HID : public USBDeviceConfig, public UsbConfigXtracter {
protected:
        USB *pUsb; // USB class instance pointer
        uint8_t bAddress; // address

protected:
        static const uint8_t epInterruptInIndex = 1; // InterruptIN  endpoint index
        static const uint8_t epInterruptOutIndex = 2; // InterruptOUT endpoint index

        static const uint8_t maxHidInterfaces = 3;
        static const uint8_t maxEpPerInterface = 2;
        static const uint8_t totalEndpoints = (maxHidInterfaces * maxEpPerInterface + 1);

        void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr);
        void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc);

        virtual HIDReportParser* GetReportParser(uint8_t id) {
                return NULL;
        };

public:

        HID(USB *pusb) : pUsb(pusb) {
        };

        const USB* GetUsb() {
                return pUsb;
        };

        virtual bool SetReportParser(uint8_t id, HIDReportParser *prs) {
                return false;
        };

        uint8_t SetProtocol(uint8_t iface, uint8_t protocol);
        uint8_t GetProtocol(uint8_t iface, uint8_t* dataptr);
        uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr);
        uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration);

        uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser = NULL);

        uint8_t GetHidDescr(uint8_t ep, uint16_t nbytes, uint8_t* dataptr);
        uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
        uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr);
};

#endif // __HID_H__