USB Host Shield 2.0
usbhid.cpp
Go to the documentation of this file.
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 "usbhid.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 USBHID::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 USBHID::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 USBHID::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 USBHID::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 USBHID::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 USBHID::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 USBHID::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 USBHID::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 USBHID::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 
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 
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 }
bmREQ_HID_REPORT
#define bmREQ_HID_REPORT
Definition: usbhid.h:65
USB_ENDPOINT_DESCRIPTOR::bInterval
uint8_t bInterval
Definition: usb_ch9.h:154
HID_REQUEST_SET_PROTOCOL
#define HID_REQUEST_SET_PROTOCOL
Definition: usbhid.h:74
bmREQ_HID_OUT
#define bmREQ_HID_OUT
Definition: usbhid.h:63
USBHID::bAddress
uint8_t bAddress
Definition: usbhid.h:146
USB_HID_DESCRIPTOR::bcdHID
uint16_t bcdHID
Definition: usb_ch9.h:161
USBHID::PrintHidDescriptor
void PrintHidDescriptor(const USB_HID_DESCRIPTOR *pDesc)
Definition: usbhid.cpp:90
USB_ENDPOINT_DESCRIPTOR
Definition: usb_ch9.h:148
USB_HID_DESCRIPTOR::bLength
uint8_t bLength
Definition: usb_ch9.h:159
USB_HID_DESCRIPTOR
Definition: usb_ch9.h:158
USB_ENDPOINT_DESCRIPTOR::bLength
uint8_t bLength
Definition: usb_ch9.h:149
USBHID::SetProtocol
uint8_t SetProtocol(uint8_t iface, uint8_t protocol)
Definition: usbhid.cpp:66
USB_REQUEST_GET_DESCRIPTOR
#define USB_REQUEST_GET_DESCRIPTOR
Definition: usb_ch9.h:44
usbhid.h
Notify
#define Notify(...)
Definition: message.h:51
USBHID::GetReportDescr
uint8_t GetReportDescr(uint16_t wIndex, USBReadParser *parser=NULL)
Definition: usbhid.cpp:34
USBHID::SetReport
uint8_t SetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
Definition: usbhid.cpp:50
HID_REQUEST_SET_REPORT
#define HID_REQUEST_SET_REPORT
Definition: usbhid.h:72
HID_REQUEST_GET_REPORT
#define HID_REQUEST_GET_REPORT
Definition: usbhid.h:69
USBReadParser
Definition: UsbCore.h:207
USBHID::GetReport
uint8_t GetReport(uint8_t ep, uint8_t iface, uint8_t report_type, uint8_t report_id, uint16_t nbytes, uint8_t *dataptr)
Definition: usbhid.cpp:54
USB_HID_DESCRIPTOR::wDescriptorLength
uint16_t wDescriptorLength
Definition: usb_ch9.h:165
USB_ENDPOINT_DESCRIPTOR::bEndpointAddress
uint8_t bEndpointAddress
Definition: usb_ch9.h:151
USBHID::pUsb
USB * pUsb
Definition: usbhid.h:145
USB::ctrlReq
uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p)
Definition: Usb.cpp:126
USB_HID_DESCRIPTOR::bCountryCode
uint8_t bCountryCode
Definition: usb_ch9.h:162
HID_DESCRIPTOR_REPORT
#define HID_DESCRIPTOR_REPORT
Definition: usbhid.h:78
USB_HID_DESCRIPTOR::bNumDescriptors
uint8_t bNumDescriptors
Definition: usb_ch9.h:163
HID_REQUEST_GET_PROTOCOL
#define HID_REQUEST_GET_PROTOCOL
Definition: usbhid.h:71
HID_REQUEST_SET_IDLE
#define HID_REQUEST_SET_IDLE
Definition: usbhid.h:73
USB_ENDPOINT_DESCRIPTOR::bDescriptorType
uint8_t bDescriptorType
Definition: usb_ch9.h:150
USB_HID_DESCRIPTOR::bDescriptorType
uint8_t bDescriptorType
Definition: usb_ch9.h:160
USBHID::GetProtocol
uint8_t GetProtocol(uint8_t iface, uint8_t *dataptr)
Definition: usbhid.cpp:70
PSTR
#define PSTR(str)
Definition: version_helper.h:54
USB_ENDPOINT_DESCRIPTOR::bmAttributes
uint8_t bmAttributes
Definition: usb_ch9.h:152
bmREQ_HID_IN
#define bmREQ_HID_IN
Definition: usbhid.h:64
USBHID::SetIdle
uint8_t SetIdle(uint8_t iface, uint8_t reportID, uint8_t duration)
Definition: usbhid.cpp:62
HID_REQUEST_GET_IDLE
#define HID_REQUEST_GET_IDLE
Definition: usbhid.h:70
USB_HID_DESCRIPTOR::bDescrType
uint8_t bDescrType
Definition: usb_ch9.h:164
USBHID::GetIdle
uint8_t GetIdle(uint8_t iface, uint8_t reportID, uint8_t *dataptr)
Definition: usbhid.cpp:58
USBHID::PrintEndpointDescriptor
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: usbhid.cpp:74
USB_ENDPOINT_DESCRIPTOR::wMaxPacketSize
uint16_t wMaxPacketSize
Definition: usb_ch9.h:153