Better support for multi-interface HID: Logitech unifying receivers

- Select mouse interface first
 - Correctly specify active interface when retrieving HID descriptors
USG_0.9
Robert Fisk 6 years ago
parent 688f2e673c
commit 7037aa6052

@ -53,7 +53,7 @@
#define USBH_MAX_NUM_ENDPOINTS 2 #define USBH_MAX_NUM_ENDPOINTS 2
/*---------- -----------*/ /*---------- -----------*/
#define USBH_MAX_NUM_INTERFACES 2 #define USBH_MAX_NUM_INTERFACES 3
/*---------- -----------*/ /*---------- -----------*/
#define USBH_MAX_NUM_CONFIGURATION 1 #define USBH_MAX_NUM_CONFIGURATION 1

@ -141,44 +141,30 @@ static USBH_StatusTypeDef USBH_HID_InterfaceInit (USBH_HandleTypeDef *phost)
{ {
uint8_t max_ep; uint8_t max_ep;
uint8_t num = 0; uint8_t num = 0;
uint8_t interface; uint8_t interface = 0xFF;
USBH_StatusTypeDef status = USBH_FAIL ;
HID_HandleTypeDef *HID_Handle; HID_HandleTypeDef *HID_Handle;
interface = USBH_FindInterface(phost, phost->pActiveClass->ClassCode, HID_BOOT_CODE, 0xFF); #ifdef CONFIG_MOUSE_ENABLED
interface = USBH_FindInterface(phost, phost->pActiveClass->ClassCode, HID_BOOT_CODE, HID_MOUSE_BOOT_CODE); //Search for mouse interfaces first
#endif
#ifdef CONFIG_KEYBOARD_ENABLED
if (interface == 0xFF)
{
interface = USBH_FindInterface(phost, phost->pActiveClass->ClassCode, HID_BOOT_CODE, HID_KEYBRD_BOOT_CODE);
}
#endif
if(interface == 0xFF) /* No Valid Interface */ if(interface == 0xFF) /* No Valid Interface */
{ {
status = USBH_FAIL; USBH_DbgLog ("Cannot Find the interface for %s class.", phost->pActiveClass->Name);
USBH_DbgLog ("Cannot Find the interface for %s class.", phost->pActiveClass->Name); return USBH_FAIL;
} }
else
{
USBH_SelectInterface (phost, interface); USBH_SelectInterface (phost, interface);
phost->pActiveClass->pData = (HID_HandleTypeDef *)USBH_malloc (sizeof(HID_HandleTypeDef)); phost->pActiveClass->pData = (HID_HandleTypeDef *)USBH_malloc (sizeof(HID_HandleTypeDef));
HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData; HID_Handle = (HID_HandleTypeDef *) phost->pActiveClass->pData;
HID_Handle->state = HID_ERROR;
/*Decode Bootclass Protocol: Mouse or Keyboard*/
#ifdef CONFIG_KEYBOARD_ENABLED
if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bInterfaceProtocol == HID_KEYBRD_BOOT_CODE)
{
USBH_UsrLog ("KeyBoard device found!");
}
else
#endif
#ifdef CONFIG_MOUSE_ENABLED
if(phost->device.CfgDesc.Itf_Desc[phost->device.current_interface].bInterfaceProtocol == HID_MOUSE_BOOT_CODE)
{
USBH_UsrLog ("Mouse device found!");
}
else
#endif
{
USBH_UsrLog ("Protocol not supported.");
return USBH_FAIL;
}
HID_Handle->state = HID_INIT; HID_Handle->state = HID_INIT;
HID_Handle->ctl_state = HID_REQ_INIT; HID_Handle->ctl_state = HID_REQ_INIT;
@ -245,9 +231,7 @@ static USBH_StatusTypeDef USBH_HID_InterfaceInit (USBH_HandleTypeDef *phost)
} }
} }
status = USBH_OK; return USBH_OK;
}
return status;
} }
/** /**
@ -488,7 +472,8 @@ USBH_StatusTypeDef USBH_HID_GetHIDReportDescriptor (USBH_HandleTypeDef *phost,
status = USBH_GetDescriptor(phost, status = USBH_GetDescriptor(phost,
USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD, USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD,
USB_DESC_HID_REPORT, USB_DESC_HID_REPORT,
phost->device.current_interface,
phost->device.Data, phost->device.Data,
length); length);
@ -524,6 +509,7 @@ USBH_StatusTypeDef USBH_HID_GetHIDDescriptor (USBH_HandleTypeDef *phost,
status = USBH_GetDescriptor( phost, status = USBH_GetDescriptor( phost,
USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD, USB_REQ_RECIPIENT_INTERFACE | USB_REQ_TYPE_STANDARD,
USB_DESC_HID, USB_DESC_HID,
phost->device.current_interface,
phost->device.Data, phost->device.Data,
length); length);

@ -102,7 +102,8 @@ USBH_StatusTypeDef USBH_CtlReq (USBH_HandleTypeDef *phost,
USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost,
uint8_t req_type, uint8_t req_type,
uint16_t value_idx, uint16_t type_idx,
uint16_t value,
uint8_t* buff, uint8_t* buff,
uint16_t length ); uint16_t length );

@ -123,7 +123,8 @@ USBH_StatusTypeDef USBH_Get_DevDesc(USBH_HandleTypeDef *phost, uint16_t length)
if((status = USBH_GetDescriptor(phost, if((status = USBH_GetDescriptor(phost,
USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD,
USB_DESC_DEVICE, USB_DESC_DEVICE,
0,
phost->device.Data, phost->device.Data,
length)) == USBH_OK) length)) == USBH_OK)
{ {
@ -166,7 +167,8 @@ USBH_StatusTypeDef USBH_Get_CfgDesc(USBH_HandleTypeDef *phost,
#endif #endif
if((status = USBH_GetDescriptor(phost, if((status = USBH_GetDescriptor(phost,
USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD,
USB_DESC_CONFIGURATION, USB_DESC_CONFIGURATION,
0,
pData, pData,
length)) == USBH_OK) length)) == USBH_OK)
{ {
@ -204,7 +206,8 @@ USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost,
if((status = USBH_GetDescriptor(phost, if((status = USBH_GetDescriptor(phost,
USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD, USB_REQ_RECIPIENT_DEVICE | USB_REQ_TYPE_STANDARD,
USB_DESC_STRING | string_index, USB_DESC_STRING | string_index,
0x0409,
phost->device.Data, phost->device.Data,
length)) == USBH_OK) length)) == USBH_OK)
{ {
@ -227,7 +230,8 @@ USBH_StatusTypeDef USBH_Get_StringDesc(USBH_HandleTypeDef *phost,
*/ */
USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost, USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost,
uint8_t req_type, uint8_t req_type,
uint16_t value_idx, uint16_t type_idx,
uint16_t value,
uint8_t* buff, uint8_t* buff,
uint16_t length ) uint16_t length )
{ {
@ -235,16 +239,8 @@ USBH_StatusTypeDef USBH_GetDescriptor(USBH_HandleTypeDef *phost,
{ {
phost->Control.setup.b.bmRequestType = USB_D2H | req_type; phost->Control.setup.b.bmRequestType = USB_D2H | req_type;
phost->Control.setup.b.bRequest = USB_REQ_GET_DESCRIPTOR; phost->Control.setup.b.bRequest = USB_REQ_GET_DESCRIPTOR;
phost->Control.setup.b.wValue.w = value_idx; phost->Control.setup.b.wValue.w = type_idx;
phost->Control.setup.b.wIndex.w = value;
if ((value_idx & 0xff00) == USB_DESC_STRING)
{
phost->Control.setup.b.wIndex.w = 0x0409;
}
else
{
phost->Control.setup.b.wIndex.w = 0;
}
phost->Control.setup.b.wLength.w = length; phost->Control.setup.b.wLength.w = length;
} }
return USBH_CtlReq(phost, buff , length ); return USBH_CtlReq(phost, buff , length );

Loading…
Cancel
Save