1: uhs_status_t Usbh_Hid_GetReportDescriptor(
void* pContext,
PHID_DESC_INFO pstData)
2: {
3:
PHID_DEVICE pHidDevice;
4: usb_device_request_t* pRequest;
5: HID_FUNC_STATUS nRetval;
6: uhs_ubit8_t u8CntDeviceId;
7: uhs_ubit16_t u16WLength;
8: uhs_status_t nRetStatus;
9: uhs_status_t nRetvalResorce;
10:
11:
12:
13:
14:
15:
if( pContext == NULL ){
16: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_SYS_PARAM_ERROR );
17:
return( USBHID_API_PARAM_ERROR );
18: }
19:
20:
21:
22:
23:
if( g_pHidDriver == NULL ) {
24: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_NOT_INIT );
25:
return( USBHID_API_SYS_SYSTEM_ERROR );
26: }
27:
28:
29:
30:
31:
32: nRetStatus = Usbh_Hid_CheckDeviceStatus(pContext, &pHidDevice, &u8CntDeviceId, ID_CLSREQ_DET);
33:
if(nRetStatus != USBHID_API_SUCCESS){
34: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_SYS_SYSTEM_ERROR );
35:
return(nRetStatus);
36: }
37:
38:
39:
40:
41:
if( (pstData == NULL) ||
42: (pstData->pu8Buff == NULL) ||
43: (pstData->u16Length == 0) ) {
44:
45:
46: (
void)HidUtils_ReleaseSemaphore( g_pHidDriver->pClsReqDetAccessLock[u8CntDeviceId] );
47: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_SYS_PARAM_ERROR );
48:
return( USBHID_API_PARAM_ERROR );
49: }
50:
51:
52:
53:
54:
if( pHidDevice->nDeviceStat == HID_DEVICE_STAT_CONNECTING ) {
55:
56:
57: (
void)HidUtils_ReleaseSemaphore( g_pHidDriver->pClsReqDetAccessLock[u8CntDeviceId] );
58: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_NOT_USE );
59:
return( USBHID_API_NOT_READY );
60: }
61:
else if( pHidDevice->nDeviceStat == HID_DEVICE_STAT_NO_SUPPORT ) {
62:
63:
64: (
void)HidUtils_ReleaseSemaphore( g_pHidDriver->pClsReqDetAccessLock[u8CntDeviceId] );
65: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_NO_SUPPORT );
66:
return( USBHID_API_NO_SUPPORT );
67: }
68:
else {
69: ;
70: }
71:
72:
73:
74:
75: pRequest = HidUtils_Malloc(
sizeof(usb_device_request_t));
76:
if(pRequest == NULL) {
77: (
void)HidUtils_ReleaseSemaphore( g_pHidDriver->pClsReqDetAccessLock[u8CntDeviceId] );
78: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_SYS_OUT_OF_RESOURCE );
79:
return( USBHID_API_SYS_OUT_OF_RESOURCE );
80: }
81:
82:
83:
84: u16WLength = (pstData->u16Length + 64);
85:
86:
87:
88:
89: pRequest->bmRequestType = 0x81;
90: pRequest->bRequest = 0x06;
91: pRequest->wValue0 = 0x00;
92: pRequest->wValue1 = UNPACK16_LITTLE_ENDIAN_LSB( (uhs_ubit16_t)
USB_DESC_TYPE_REPORT );
93: pRequest->wIndex0 = UNPACK16_LITTLE_ENDIAN_LSB( pHidDevice->u16Intf_num );
94: pRequest->wIndex1 = UNPACK16_LITTLE_ENDIAN_MSB( pHidDevice->u16Intf_num );
95: pRequest->wLength0 = UNPACK16_LITTLE_ENDIAN_LSB( u16WLength );
96: pRequest->wLength1 = UNPACK16_LITTLE_ENDIAN_MSB( u16WLength );
97:
98:
99:
100:
101: nRetval = Usbh_Hid_ForCommand(pHidDevice, pRequest, pstData->pu8Buff, NULL);
102:
if(nRetval != HID_FUNC_STATUS_SUCCESS){
103: HidUtils_Free(pRequest);
104:
105:
106: (
void)HidUtils_ReleaseSemaphore( g_pHidDriver->pClsReqDetAccessLock[u8CntDeviceId] );
107: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_FAILED_CLSREQ );
108:
return( USBHID_API_TRANS_CLSREQ_FAILED );
109: }
110:
111:
112:
113:
114: HidUtils_Free(pRequest);
115:
116:
117:
118:
119: nRetvalResorce = HidUtils_ReleaseSemaphore( g_pHidDriver->pClsReqDetAccessLock[u8CntDeviceId] );
120:
if(nRetvalResorce != TRUE){
121:
122: CIAPI_HID_REPORT_SUMMARY( USBHID_LOG_SYS_OUT_OF_RESOURCE );
123:
return( USBHID_API_SYS_OUT_OF_RESOURCE );
124: }
125:
126:
return( USBHID_API_SUCCESS );
127: }