本帖最后由 xieyang__ 于 2018-1-27 10:51 编辑
下面是USB_DeviceCallback中的部分代码
- case kUSB_DeviceEventSetInterface:
- if (g_UsbDeviceHidMouse.attach)
- {
- /* Set device interface request */
- uint8_t interface = (uint8_t)((*temp16 & 0xFF00U) >> 0x08U);
- uint8_t alternateSetting = (uint8_t)(*temp16 & 0x00FFU);
- if (interface < USB_HID_MOUSE_INTERFACE_COUNT)
- {
- g_UsbDeviceHidMouse.currentInterfaceAlternateSetting[interface] = alternateSetting;
- if (alternateSetting == 0U)
- {
- usb_echo("usb device callback:kUSB_DeviceEventSetInterface,%d\r\n",error);
- error = USB_DeviceHidMouseAction();
-
- }
- }
- }
- break;
复制代码
nxp的例程上在处理kUSB_DeviceEventSetConfiguration时加了一个USB_DeviceHidMouseAction(),如果不加这个鼠标就没有动作。并且在抓取的数据包中没有看到发送上去的数据
如果数据发送出去,那么应该出现在53-59号包位置之间。
USB_DeviceHidMouseAction()的周期调用是在函数USB_DeviceHidMouseCallback()中,使得鼠标可以移植移动。
- static usb_status_t USB_DeviceHidMouseCallback(class_handle_t handle, uint32_t event, void *param)
- {
- <p style="line-height: 30px; text-indent: 2em;"> usb_status_t error = kStatus_USB_Error;
- usb_device_endpoint_callback_message_struct_t *message = (usb_device_endpoint_callback_message_struct_t *)param;</p>
- <p style="line-height: 30px; text-indent: 2em;"> switch (event)
- {
- case kUSB_DeviceHidEventSendResponse:
- /* Resport sent */
- if (g_UsbDeviceHidMouse.attach)
- {
- if ((NULL != message) && (message->length == USB_UNINITIALIZED_VAL_32))
- {
- return error;
- }
- error = USB_DeviceHidMouseAction();
- usb_echo("usb hid callback:kUSB_DeviceHidEventSendResponse\r\n");
- }
- break;
- case kUSB_DeviceHidEventGetReport:
- case kUSB_DeviceHidEventSetReport:
- case kUSB_DeviceHidEventRequestReportBuffer:
- error = kStatus_USB_InvalidRequest;
- usb_echo("usb hid callback:kUSB_DeviceHidEventGetReport,kUSB_DeviceHidEventSetReport,kUSB_DeviceHidEventRequestReportBuffer\r\n");
- break;
- case kUSB_DeviceHidEventGetIdle:
- case kUSB_DeviceHidEventGetProtocol:
- case kUSB_DeviceHidEventSetIdle:
- case kUSB_DeviceHidEventSetProtocol:
- usb_echo("usb hid callback:kUSB_DeviceHidEventGetIdle,kUSB_DeviceHidEventGetProtocol,kUSB_DeviceHidEventSetIdle,kUSB_DeviceHidEventSetProtocol\r\n");
- break;
- default:
- usb_echo("usb hid callback:default event\r\n");
- break;
- }</p>
- <p style="line-height: 30px; text-indent: 2em;"> return error;
- }</p>
复制代码
函数DeviceHidMouseAction()是在kUSB_DeviceHidEventSendResponse事件下调用的,kUSB_DeviceHidEventSendResponse的含义是 Send data completed,也就是数据发送完成.
所以,在这里我做一个猜想,在kUSB_DeviceEventSetConfiguration时调用DeviceHidMouseAction()将一组数据送入USB栈,等到发送完成时在事件kUSB_DeviceHidEventSendResponse中再送一组数据到USB栈,这样就构成了一个循环。
下面附上工程文件和log信息
usb hid mouse.zip
(1.56 MB, 下载次数: 74)
USB Only mouse2.utl
(54.06 KB, 下载次数: 72)
usb only mouse2.log
(1.84 KB, 下载次数: 59)
|