static void wiiusb_hid_process_control_message(struct wiiusb_adapter* adapter) { int32_t r; switch (adapter->send_control_type) { case WIIUSB_SC_INTMSG: do { r = USB_WriteIntrMsg(adapter->handle, adapter->endpoint_out, adapter->send_control_size, adapter->send_control_buffer); } while (r < 0); break; case WIIUSB_SC_CTRLMSG: do { r = USB_WriteCtrlMsg(adapter->handle, USB_REQTYPE_INTERFACE_SET, USB_REQ_SETREPORT, (USB_REPTYPE_FEATURE<<8) | 0xf4, 0x0, adapter->send_control_size, adapter->send_control_buffer); } while (r < 0); break; case WIIUSB_SC_CTRLMSG2: do { r = USB_WriteCtrlMsg(adapter->handle, USB_REQTYPE_INTERFACE_SET, USB_REQ_SETREPORT, (USB_REPTYPE_OUTPUT<<8) | 0x01, 0x0, adapter->send_control_size, adapter->send_control_buffer); } while (r < 0); break; /*default: any other case we do nothing */ } /* Reset the control type */ adapter->send_control_type = WIIUSB_SC_NONE; }
static void adapter_thread(void *data) { uint8_t __attribute__((aligned(32))) send_command_buf[4096]; struct wiiusb_adapter *adapter = (struct wiiusb_adapter*)data; wiiusb_hid_t *hid = adapter ? adapter->hid : NULL; if (!adapter) return; while (!adapter->quitting) { size_t send_command_size; int tmp; int report_number; int size = 0; (void)tmp; (void)report_number; slock_lock(adapter->send_control_lock); if (fifo_read_avail(adapter->send_control_buffer) >= sizeof(send_command_size)) { fifo_read(adapter->send_control_buffer, &send_command_size, sizeof(send_command_size)); if (fifo_read_avail(adapter->send_control_buffer) >= sizeof(send_command_size)) { fifo_read(adapter->send_control_buffer, send_command_buf, send_command_size); USB_WriteIntrMsg(adapter->handle, adapter->endpoint_out, send_command_size, send_command_buf); } } slock_unlock(adapter->send_control_lock); size = USB_ReadIntrMsg(adapter->handle, adapter->endpoint_in, adapter->endpoint_in_max_size, &adapter->data[0]); /* RARCH_LOG("%p USB_ReadIntrMsg(%i, %i, %i, %p): %i\n", &adapter->data[0], adapter->handle, adapter->endpoint_in, adapter->endpoint_in_max_size, &adapter->data[0], size); */ //RARCH_LOG("%03i %03i %03i %03i\n", adapter->data[0], adapter->data[1], adapter->data[2], adapter->data[3], adapter->data[4]); //memmove(&adapter->data[1], &adapter->data[0], 2048); if (adapter && hid && hid->slots && size) pad_connection_packet(&hid->slots[adapter->slot], adapter->slot, adapter->data - 1, size+1); } }