diff options
Diffstat (limited to 'lib/usbhost/USB_Host_Shield_2.0/hid.cpp')
-rw-r--r-- | lib/usbhost/USB_Host_Shield_2.0/hid.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/usbhost/USB_Host_Shield_2.0/hid.cpp b/lib/usbhost/USB_Host_Shield_2.0/hid.cpp new file mode 100644 index 000000000..e4c7721a3 --- /dev/null +++ b/lib/usbhost/USB_Host_Shield_2.0/hid.cpp | |||
@@ -0,0 +1,112 @@ | |||
1 | /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. | ||
2 | |||
3 | This software may be distributed and modified under the terms of the GNU | ||
4 | General Public License version 2 (GPL2) as published by the Free Software | ||
5 | Foundation and appearing in the file GPL2.TXT included in the packaging of | ||
6 | this file. Please note that GPL2 Section 2[b] requires that all works based | ||
7 | on this software must also be made publicly available under the terms of | ||
8 | the GPL2 ("Copyleft"). | ||
9 | |||
10 | Contact information | ||
11 | ------------------- | ||
12 | |||
13 | Circuits At Home, LTD | ||
14 | Web : http://www.circuitsathome.com | ||
15 | e-mail : support@circuitsathome.com | ||
16 | */ | ||
17 | |||
18 | #include "hid.h" | ||
19 | |||
20 | //get HID report descriptor | ||
21 | |||
22 | /* WRONG! Endpoint is _ALWAYS_ ZERO for HID! We want the _INTERFACE_ value here! | ||
23 | uint8_t HID::GetReportDescr(uint8_t ep, USBReadParser *parser) { | ||
24 | const uint8_t constBufLen = 64; | ||
25 | uint8_t buf[constBufLen]; | ||
26 | |||
27 | uint8_t rcode = pUsb->ctrlReq(bAddress, ep, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, | ||
28 | HID_DESCRIPTOR_REPORT, 0x0000, 128, constBufLen, buf, (USBReadParser*)parser); | ||
29 | |||
30 | //return ((rcode != hrSTALL) ? rcode : 0); | ||
31 | return rcode; | ||
32 | } | ||
33 | */ | ||
34 | uint8_t HID::GetReportDescr(uint16_t wIndex, USBReadParser *parser) { | ||
35 | const uint8_t constBufLen = 64; | ||
36 | uint8_t buf[constBufLen]; | ||
37 | |||
38 | uint8_t rcode = pUsb->ctrlReq(bAddress, 0x00, bmREQ_HID_REPORT, USB_REQUEST_GET_DESCRIPTOR, 0x00, | ||
39 | HID_DESCRIPTOR_REPORT, wIndex, 128, constBufLen, buf, (USBReadParser*)parser); | ||
40 | |||
41 | //return ((rcode != hrSTALL) ? rcode : 0); | ||
42 | return rcode; | ||
43 | } | ||
44 | |||
45 | //uint8_t HID::getHidDescr( uint8_t ep, uint16_t nbytes, uint8_t* dataptr ) | ||
46 | //{ | ||
47 | // return( pUsb->ctrlReq( bAddress, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, HID_DESCRIPTOR_HID, 0x0000, nbytes, dataptr )); | ||
48 | //} | ||
49 | |||
50 | uint8_t HID::SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr) { | ||
51 | return ( pUsb->ctrlReq(bAddress, ep, bmREQ_HID_OUT, HID_REQUEST_SET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL)); | ||
52 | } | ||
53 | |||
54 | uint8_t HID::GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t* dataptr) { | ||
55 | return ( pUsb->ctrlReq(bAddress, ep, bmREQ_HID_IN, HID_REQUEST_GET_REPORT, report_id, report_type, iface, nbytes, nbytes, dataptr, NULL)); | ||
56 | } | ||
57 | |||
58 | uint8_t HID::GetIdle(uint8_t iface, uint8_t reportID, uint8_t* dataptr) { | ||
59 | return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_IN, HID_REQUEST_GET_IDLE, reportID, 0, iface, 0x0001, 0x0001, dataptr, NULL)); | ||
60 | } | ||
61 | |||
62 | uint8_t HID::SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration) { | ||
63 | return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_OUT, HID_REQUEST_SET_IDLE, reportID, duration, iface, 0x0000, 0x0000, NULL, NULL)); | ||
64 | } | ||
65 | |||
66 | uint8_t HID::SetProtocol(uint8_t iface, uint8_t protocol) { | ||
67 | return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_OUT, HID_REQUEST_SET_PROTOCOL, protocol, 0x00, iface, 0x0000, 0x0000, NULL, NULL)); | ||
68 | } | ||
69 | |||
70 | uint8_t HID::GetProtocol(uint8_t iface, uint8_t* dataptr) { | ||
71 | return ( pUsb->ctrlReq(bAddress, 0, bmREQ_HID_IN, HID_REQUEST_GET_PROTOCOL, 0x00, 0x00, iface, 0x0001, 0x0001, dataptr, NULL)); | ||
72 | } | ||
73 | |||
74 | void HID::PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr) { | ||
75 | Notify(PSTR("Endpoint descriptor:"), 0x80); | ||
76 | Notify(PSTR("\r\nLength:\t\t"), 0x80); | ||
77 | D_PrintHex<uint8_t > (ep_ptr->bLength, 0x80); | ||
78 | Notify(PSTR("\r\nType:\t\t"), 0x80); | ||
79 | D_PrintHex<uint8_t > (ep_ptr->bDescriptorType, 0x80); | ||
80 | Notify(PSTR("\r\nAddress:\t"), 0x80); | ||
81 | D_PrintHex<uint8_t > (ep_ptr->bEndpointAddress, 0x80); | ||
82 | Notify(PSTR("\r\nAttributes:\t"), 0x80); | ||
83 | D_PrintHex<uint8_t > (ep_ptr->bmAttributes, 0x80); | ||
84 | Notify(PSTR("\r\nMaxPktSize:\t"), 0x80); | ||
85 | D_PrintHex<uint16_t > (ep_ptr->wMaxPacketSize, 0x80); | ||
86 | Notify(PSTR("\r\nPoll Intrv:\t"), 0x80); | ||
87 | D_PrintHex<uint8_t > (ep_ptr->bInterval, 0x80); | ||
88 | } | ||
89 | |||
90 | void HID::PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc) { | ||
91 | Notify(PSTR("\r\n\r\nHID Descriptor:\r\n"), 0x80); | ||
92 | Notify(PSTR("bDescLength:\t\t"), 0x80); | ||
93 | D_PrintHex<uint8_t > (pDesc->bLength, 0x80); | ||
94 | |||
95 | Notify(PSTR("\r\nbDescriptorType:\t"), 0x80); | ||
96 | D_PrintHex<uint8_t > (pDesc->bDescriptorType, 0x80); | ||
97 | |||
98 | Notify(PSTR("\r\nbcdHID:\t\t\t"), 0x80); | ||
99 | D_PrintHex<uint16_t > (pDesc->bcdHID, 0x80); | ||
100 | |||
101 | Notify(PSTR("\r\nbCountryCode:\t\t"), 0x80); | ||
102 | D_PrintHex<uint8_t > (pDesc->bCountryCode, 0x80); | ||
103 | |||
104 | Notify(PSTR("\r\nbNumDescriptors:\t"), 0x80); | ||
105 | D_PrintHex<uint8_t > (pDesc->bNumDescriptors, 0x80); | ||
106 | |||
107 | Notify(PSTR("\r\nbDescrType:\t\t"), 0x80); | ||
108 | D_PrintHex<uint8_t > (pDesc->bDescrType, 0x80); | ||
109 | |||
110 | Notify(PSTR("\r\nwDescriptorLength:\t"), 0x80); | ||
111 | D_PrintHex<uint16_t > (pDesc->wDescriptorLength, 0x80); | ||
112 | } | ||