// Include the most common headers from the C standard library #include #include #include #include // Include the main libnx system header, for Switch development #include // This example shows how to use USB devices via usbhs, see also libnx usbhs.h/usb.h. // Only devices which are not used by sysmodules are usable, hence HID devices are not usable with this for example. // Main program entrypoint int main(int argc, char* argv[]) { Result rc=0; s32 total_entries=0; s32 i, epi, tmpi; Event inf_event; struct usb_endpoint_descriptor *ep_desc = NULL; UsbHsClientIfSession inf_session;//This example only uses 1 interface/endpoint, an actual app may use multiple. UsbHsClientEpSession ep_session; UsbHsInterfaceFilter filter; UsbHsInterface interfaces[8]; // This example uses a text console, as a simple way to output text to the screen. // If you want to write a software-rendered graphics application, // take a look at the graphics/simplegfx example, which uses the libnx gfx API instead. // If on the other hand you want to write an OpenGL based application, // take a look at the graphics/opengl set of examples, which uses EGL instead. consoleInit(NULL); printf("usbhs example\n"); memset(&inf_event, 0, sizeof(inf_event)); memset(&filter, 0, sizeof(filter)); memset(interfaces, 0, sizeof(interfaces)); memset(&inf_session, 0, sizeof(inf_session)); memset(&ep_session, 0, sizeof(ep_session)); //Leave filter at all-zero to disable filtering. If you want to use filtering, see libnx usbhs.h. rc = usbHsInitialize(); if (R_FAILED(rc)) printf("usbHsInitialize() failed: 0x%x\n", rc); if (R_SUCCEEDED(rc)) { rc = usbHsCreateInterfaceAvailableEvent(&inf_event, true, 0, &filter); if (R_FAILED(rc)) printf("usbHsCreateInterfaceAvailableEvent() failed: 0x%x\n", rc); } if (R_SUCCEEDED(rc)) printf("Ready.\n"); // Main loop while (appletMainLoop()) { // Scan all the inputs. This should be done once for each frame hidScanInput(); // hidKeysDown returns information about which buttons have been // just pressed in this frame compared to the previous one u64 kDown = hidKeysDown(CONTROLLER_P1_AUTO); if (kDown & KEY_PLUS) break; // break in order to return to hbmenu rc = eventWait(&inf_event, 0); if (R_SUCCEEDED(rc)) { printf("The available interfaces have changed.\n"); memset(interfaces, 0, sizeof(interfaces)); rc = usbHsQueryAvailableInterfaces(&filter, interfaces, sizeof(interfaces), &total_entries); if (R_FAILED(rc)) printf("usbHsQueryAvailableInterfaces() failed: 0x%x\n", rc); if (R_SUCCEEDED(rc)) { printf("total: %d\n", total_entries); for(i=0; i. // This shows how to use a control transfer, an actual app might not need this. // This gets descriptors starting with the config descriptor, via a control transfer. memset(tmpbuf, 0, 0x1000); rc = usbHsIfCtrlXfer(&inf_session, USB_ENDPOINT_IN, USB_REQUEST_GET_DESCRIPTOR, (USB_DT_CONFIG<<8) | 0, 0, 0x40, tmpbuf, &transferredSize); printf("usbHsIfCtrlXfer(interface index = %d) returned: 0x%x, transferredSize=0x%x\n", i, rc, transferredSize); if (R_SUCCEEDED(rc)) { for(tmpi=0; tmpibLength != 0) { printf("Using endpoint %d.\n", epi); rc = usbHsIfOpenUsbEp(&inf_session, &ep_session, 1, ep_desc->wMaxPacketSize, ep_desc); printf("usbHsIfOpenUsbEp returned: 0x%x\n", rc); break; } } // Since this example uses just any device, this may not work for some devices since this doesn't use a proper protocol. Some devices might need unplugged and plugged back in for this to work, after running this example once. if (R_SUCCEEDED(rc)) { memset(tmpbuf, 0, 0x1000); transferredSize = 0; rc = usbHsEpPostBuffer(&ep_session, tmpbuf, 0x10, &transferredSize); printf("usbHsEpPostBuffer returned: 0x%x, transferredSize=0x%x\n", rc, transferredSize); if (R_SUCCEEDED(rc)) { for(tmpi=0; tmpi