From 725ac9f00afa00c05054849e1f83e3ac14fe2da5 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Wed, 28 Nov 2018 17:34:53 -0500 Subject: [PATCH] Moved usb code specific to usbds into seperate .c/.h. --- nx/include/switch/services/usb.h | 111 +----------------------- nx/include/switch/services/usbds.h | 120 ++++++++++++++++++++++++++ nx/source/runtime/devices/usb_comms.c | 1 + nx/source/services/{usb.c => usbds.c} | 1 + 4 files changed, 123 insertions(+), 110 deletions(-) create mode 100644 nx/include/switch/services/usbds.h rename nx/source/services/{usb.c => usbds.c} (99%) diff --git a/nx/include/switch/services/usb.h b/nx/include/switch/services/usb.h index 7dba91c9..860134c7 100644 --- a/nx/include/switch/services/usb.h +++ b/nx/include/switch/services/usb.h @@ -1,6 +1,6 @@ /** * @file usb.h - * @brief USB (usb:*) service IPC wrapper. + * @brief Common USB (usb:*) service IPC header. * @author SciresM, yellows8 * @copyright libnx Authors */ @@ -9,12 +9,8 @@ #include "../services/sm.h" #include "../kernel/event.h" -/// usb:ds Switch-as-device<>host USB comms, see also here: https://switchbrew.org/wiki/USB_services - /// Names starting with "libusb" were changed to "usb" to avoid collision with actual libusb if it's ever used. -#define USBDS_DEFAULT_InterfaceNumber 0x4 ///Value for usb_interface_descriptor bInterfaceNumber for automatically allocating the actual bInterfaceNumber. - /// Imported from libusb with changed names. /* Descriptor sizes per descriptor type */ #define USB_DT_INTERFACE_SIZE 9 @@ -91,53 +87,6 @@ struct usb_string_descriptor { uint16_t wData[0x40]; }; -typedef struct { - u16 idVendor; ///< VID - u16 idProduct; ///< PID - u16 bcdDevice; - char Manufacturer[0x20]; - char Product[0x20]; - char SerialNumber[0x20]; -} UsbDsDeviceInfo; - -typedef struct { - u32 id; ///< urbId from post-buffer cmds - u32 requestedSize; - u32 transferredSize; - u32 urb_status; -} UsbDsReportEntry; - -typedef struct { - UsbDsReportEntry report[8]; - u32 report_count; -} UsbDsReportData; - -typedef struct { - bool initialized; - u32 interface_index; - Service h; - - Event SetupEvent; - Event CtrlInCompletionEvent; - Event CtrlOutCompletionEvent; -} UsbDsInterface; - -typedef struct { - bool initialized; - Service h; - Event CompletionEvent; -} UsbDsEndpoint; - -typedef enum { - UsbComplexId_Default = 0x2 -} UsbComplexId; - -typedef enum { - UsbDeviceSpeed_Full = 0x2, ///< USB 1.1 Full Speed - UsbDeviceSpeed_High = 0x3, ///< USB 2.0 High Speed - UsbDeviceSpeed_Super = 0x4, ///< USB 3.0 Super Speed -} UsbDeviceSpeed; - /// Imported from libusb, with changed names. enum usb_class_code { USB_CLASS_PER_INTERFACE = 0, @@ -208,61 +157,3 @@ enum usb_iso_usage_type { USB_ISO_USAGE_TYPE_IMPLICIT = 2, }; -/// Opens a session with usb:ds. -Result usbDsInitialize(void); -/// Closes the usb:ds session. Any interfaces/endpoints which are left open are automatically closed, since otherwise usb-sysmodule won't fully reset usb:ds to defaults. -void usbDsExit(void); - -/// Helpers -Result usbDsWaitReady(u64 timeout); -Result usbDsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize); - -/// IDsService -Event* usbDsGetStateChangeEvent(void); -Result usbDsGetState(u32* out); - -/// Removed in 5.0.0 -Result usbDsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name); -Result usbDsSetVidPidBcd(const UsbDsDeviceInfo* deviceinfo); - -/// Added in 5.0.0 -Result usbDsRegisterInterface(UsbDsInterface** out); -Result usbDsRegisterInterfaceEx(UsbDsInterface** out, u32 intf_num); -Result usbDsClearDeviceData(void); -Result usbDsAddUsbStringDescriptor(u8* out_index, const char* string); -Result usbDsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs); -Result usbDsDeleteUsbStringDescriptor(u8 index); -Result usbDsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor* descriptor); -Result usbDsSetBinaryObjectStore(void* bos, size_t bos_size); -Result usbDsEnable(void); -Result usbDsDisable(void); - -/// IDsInterface -void usbDsInterface_Close(UsbDsInterface* interface); - -Result usbDsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size); -Result usbDsInterface_EnableInterface(UsbDsInterface* interface); -Result usbDsInterface_DisableInterface(UsbDsInterface* interface); -Result usbDsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); -Result usbDsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); -Result usbDsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out); -Result usbDsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out); -Result usbDsInterface_StallCtrl(UsbDsInterface* interface); - -/// Removed in 5.0.0 -Result usbDsInterface_GetDsEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, struct usb_endpoint_descriptor* descriptor); - -/// Added in 5.0.0 -Result usbDsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address); -Result usbDsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, void* buffer, size_t size); - - -/// IDsEndpoint -void usbDsEndpoint_Close(UsbDsEndpoint* endpoint); - -Result usbDsEndpoint_Cancel(UsbDsEndpoint* endpoint); -Result usbDsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId); -Result usbDsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out); -Result usbDsEndpoint_StallCtrl(UsbDsEndpoint* endpoint); -Result usbDsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt); // Sets Zero Length Termination for endpoint - diff --git a/nx/include/switch/services/usbds.h b/nx/include/switch/services/usbds.h new file mode 100644 index 00000000..47430ec1 --- /dev/null +++ b/nx/include/switch/services/usbds.h @@ -0,0 +1,120 @@ +/** + * @file usbds.h + * @brief USB (usb:ds) service IPC wrapper. + * @brief Switch-as-device<>host USB comms, see also here: https://switchbrew.org/wiki/USB_services + * @author SciresM, yellows8 + * @copyright libnx Authors + */ +#pragma once +#include "../types.h" +#include "../services/sm.h" +#include "../services/usb.h" +#include "../kernel/event.h" + +#define USBDS_DEFAULT_InterfaceNumber 0x4 ///Value for usb_interface_descriptor bInterfaceNumber for automatically allocating the actual bInterfaceNumber. + +typedef struct { + u16 idVendor; ///< VID + u16 idProduct; ///< PID + u16 bcdDevice; + char Manufacturer[0x20]; + char Product[0x20]; + char SerialNumber[0x20]; +} UsbDsDeviceInfo; + +typedef struct { + u32 id; ///< urbId from post-buffer cmds + u32 requestedSize; + u32 transferredSize; + u32 urb_status; +} UsbDsReportEntry; + +typedef struct { + UsbDsReportEntry report[8]; + u32 report_count; +} UsbDsReportData; + +typedef struct { + bool initialized; + u32 interface_index; + Service h; + + Event SetupEvent; + Event CtrlInCompletionEvent; + Event CtrlOutCompletionEvent; +} UsbDsInterface; + +typedef struct { + bool initialized; + Service h; + Event CompletionEvent; +} UsbDsEndpoint; + +typedef enum { + UsbComplexId_Default = 0x2 +} UsbComplexId; + +typedef enum { + UsbDeviceSpeed_Full = 0x2, ///< USB 1.1 Full Speed + UsbDeviceSpeed_High = 0x3, ///< USB 2.0 High Speed + UsbDeviceSpeed_Super = 0x4, ///< USB 3.0 Super Speed +} UsbDeviceSpeed; + +/// Opens a session with usb:ds. +Result usbDsInitialize(void); +/// Closes the usb:ds session. Any interfaces/endpoints which are left open are automatically closed, since otherwise usb-sysmodule won't fully reset usb:ds to defaults. +void usbDsExit(void); + +/// Helpers +Result usbDsWaitReady(u64 timeout); +Result usbDsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize); + +/// IDsService +Event* usbDsGetStateChangeEvent(void); +Result usbDsGetState(u32* out); + +/// Removed in 5.0.0 +Result usbDsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name); +Result usbDsSetVidPidBcd(const UsbDsDeviceInfo* deviceinfo); + +/// Added in 5.0.0 +Result usbDsRegisterInterface(UsbDsInterface** out); +Result usbDsRegisterInterfaceEx(UsbDsInterface** out, u32 intf_num); +Result usbDsClearDeviceData(void); +Result usbDsAddUsbStringDescriptor(u8* out_index, const char* string); +Result usbDsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs); +Result usbDsDeleteUsbStringDescriptor(u8 index); +Result usbDsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor* descriptor); +Result usbDsSetBinaryObjectStore(void* bos, size_t bos_size); +Result usbDsEnable(void); +Result usbDsDisable(void); + +/// IDsInterface +void usbDsInterface_Close(UsbDsInterface* interface); + +Result usbDsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size); +Result usbDsInterface_EnableInterface(UsbDsInterface* interface); +Result usbDsInterface_DisableInterface(UsbDsInterface* interface); +Result usbDsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); +Result usbDsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId); +Result usbDsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out); +Result usbDsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out); +Result usbDsInterface_StallCtrl(UsbDsInterface* interface); + +/// Removed in 5.0.0 +Result usbDsInterface_GetDsEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, struct usb_endpoint_descriptor* descriptor); + +/// Added in 5.0.0 +Result usbDsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address); +Result usbDsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, void* buffer, size_t size); + + +/// IDsEndpoint +void usbDsEndpoint_Close(UsbDsEndpoint* endpoint); + +Result usbDsEndpoint_Cancel(UsbDsEndpoint* endpoint); +Result usbDsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId); +Result usbDsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out); +Result usbDsEndpoint_StallCtrl(UsbDsEndpoint* endpoint); +Result usbDsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt); // Sets Zero Length Termination for endpoint + diff --git a/nx/source/runtime/devices/usb_comms.c b/nx/source/runtime/devices/usb_comms.c index 9774afe9..7464881e 100644 --- a/nx/source/runtime/devices/usb_comms.c +++ b/nx/source/runtime/devices/usb_comms.c @@ -6,6 +6,7 @@ #include "kernel/rwlock.h" #include "services/fatal.h" #include "services/usb.h" +#include "services/usbds.h" #include "runtime/devices/usb_comms.h" #define TOTAL_INTERFACES 4 diff --git a/nx/source/services/usb.c b/nx/source/services/usbds.c similarity index 99% rename from nx/source/services/usb.c rename to nx/source/services/usbds.c index f734a161..9331602e 100644 --- a/nx/source/services/usb.c +++ b/nx/source/services/usbds.c @@ -5,6 +5,7 @@ #include "kernel/ipc.h" #include "kernel/detect.h" #include "services/usb.h" +#include "services/usbds.h" #include "services/sm.h" #include "runtime/util/utf.h"