libnx v4.9.0
Loading...
Searching...
No Matches
usbds.h
Go to the documentation of this file.
1/**
2 * @file usbds.h
3 * @brief USB (usb:ds) service IPC wrapper.
4 * @brief Switch-as-device<>host USB comms, see also here: https://switchbrew.org/wiki/USB_services
5 * @author SciresM, yellows8
6 * @copyright libnx Authors
7 */
8#pragma once
9#include "../types.h"
10#include "../sf/service.h"
11#include "../services/usb.h"
12#include "../kernel/event.h"
13
14#define USBDS_DEFAULT_InterfaceNumber 0x4 ///Value for usb_interface_descriptor bInterfaceNumber for automatically allocating the actual bInterfaceNumber.
15
16typedef struct {
17 bool initialized;
18 u8 interface_index;
19 Service s;
20
21 Event SetupEvent;
22 Event CtrlInCompletionEvent;
23 Event CtrlOutCompletionEvent;
25
26typedef struct {
27 bool initialized;
28 Service s;
29 Event CompletionEvent;
31
32typedef struct {
33 u16 idVendor; ///< VID
34 u16 idProduct; ///< PID
35 u16 bcdDevice;
36 char Manufacturer[0x20];
37 char Product[0x20];
38 char SerialNumber[0x20];
40
41typedef struct {
42 u32 id; ///< urbId from post-buffer cmds
43 u32 requestedSize;
44 u32 transferredSize;
45 u32 urb_status;
47
48typedef struct {
49 UsbDsReportEntry report[8];
50 u32 report_count;
52
53typedef enum {
54 UsbComplexId_Default = 0x2
55} UsbComplexId;
56
57typedef enum {
58 UsbDeviceSpeed_Full = 0x2, ///< USB 1.1 Full Speed
59 UsbDeviceSpeed_High = 0x3, ///< USB 2.0 High Speed
60 UsbDeviceSpeed_Super = 0x4, ///< USB 3.0 Super Speed
62
63/// Opens a session with usb:ds.
65
66/// 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.
67void usbDsExit(void);
68
69/// Gets the Service object for the actual usb:ds service session.
71
72/// Helper func.
74
75/// Helper func.
76Result usbDsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize);
77
78///@name IDsService
79///@{
80
81Event* usbDsGetStateChangeEvent(void);
82
83/// Gets the device state. See \ref UsbState.
85
86/// Removed in [5.0.0+].
87Result usbDsGetDsInterface(UsbDsInterface** out, struct usb_interface_descriptor* descriptor, const char* interface_name);
88
89/// Removed in [5.0.0+].
91
92/// Only available on [5.0.0+].
94
95/// Only available on [5.0.0+].
97
98/// Only available on [5.0.0+].
100
101/// Only available on [5.0.0+].
102Result usbDsAddUsbStringDescriptor(u8* out_index, const char* string);
103
104/// Only available on [5.0.0+].
105Result usbDsAddUsbLanguageStringDescriptor(u8* out_index, const u16* lang_ids, u16 num_langs);
106
107/// Only available on [5.0.0+].
109
110/// Only available on [5.0.0+].
112
113/// Only available on [5.0.0+].
114Result usbDsSetBinaryObjectStore(const void* bos, size_t bos_size);
115
116/// Only available on [5.0.0+].
118
119/// Only available on [5.0.0+].
121
122///@}
123
124///@name IDsInterface
125///@{
126
127void usbDsInterface_Close(UsbDsInterface* interface);
128
129Result usbDsInterface_GetSetupPacket(UsbDsInterface* interface, void* buffer, size_t size);
130Result usbDsInterface_EnableInterface(UsbDsInterface* interface);
131Result usbDsInterface_DisableInterface(UsbDsInterface* interface);
132Result usbDsInterface_CtrlInPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId);
133Result usbDsInterface_CtrlOutPostBufferAsync(UsbDsInterface* interface, void* buffer, size_t size, u32* urbId);
134Result usbDsInterface_GetCtrlInReportData(UsbDsInterface* interface, UsbDsReportData* out);
135Result usbDsInterface_GetCtrlOutReportData(UsbDsInterface* interface, UsbDsReportData* out);
136Result usbDsInterface_StallCtrl(UsbDsInterface* interface);
137
138/// Removed in [5.0.0+].
140
141/// Only available on [5.0.0+].
142Result usbDsInterface_RegisterEndpoint(UsbDsInterface* interface, UsbDsEndpoint** endpoint, u8 endpoint_address);
143
144/// Only available on [5.0.0+].
145Result usbDsInterface_AppendConfigurationData(UsbDsInterface* interface, UsbDeviceSpeed speed, const void* buffer, size_t size);
146
147///@}
148
149///@name IDsEndpoint
150///@{
151
152void usbDsEndpoint_Close(UsbDsEndpoint* endpoint);
153
154Result usbDsEndpoint_Cancel(UsbDsEndpoint* endpoint);
155Result usbDsEndpoint_PostBufferAsync(UsbDsEndpoint* endpoint, void* buffer, size_t size, u32* urbId);
156Result usbDsEndpoint_GetReportData(UsbDsEndpoint* endpoint, UsbDsReportData* out);
157Result usbDsEndpoint_Stall(UsbDsEndpoint* endpoint);
158Result usbDsEndpoint_SetZlt(UsbDsEndpoint* endpoint, bool zlt); // Sets Zero Length Termination for endpoint
159
160///@}
161
Kernel-mode event structure.
Definition event.h:13
Service object structure.
Definition service.h:14
Definition usbds.h:32
u16 idProduct
PID.
Definition usbds.h:34
u16 idVendor
VID.
Definition usbds.h:33
Definition usbds.h:26
Definition usbds.h:16
Definition usbds.h:48
Definition usbds.h:41
u32 id
urbId from post-buffer cmds
Definition usbds.h:42
Imported from libusb, with some adjustments.
Definition usb.h:48
Imported from libusb, with some adjustments.
Definition usb.h:25
Imported from libusb, with some adjustments.
Definition usb.h:35
uint64_t u64
64-bit unsigned integer.
Definition types.h:22
uint8_t u8
8-bit unsigned integer.
Definition types.h:19
uint16_t u16
16-bit unsigned integer.
Definition types.h:20
u32 Result
Function error code result type.
Definition types.h:44
uint32_t u32
32-bit unsigned integer.
Definition types.h:21
UsbState
USB Device States, per USB 2.0 spec.
Definition usb.h:211
Result usbDsRegisterInterface(UsbDsInterface **out)
Only available on [5.0.0+].
Result usbDsDisable(void)
Only available on [5.0.0+].
Result usbDsGetDsInterface(UsbDsInterface **out, struct usb_interface_descriptor *descriptor, const char *interface_name)
Removed in [5.0.0+].
Result usbDsWaitReady(u64 timeout)
Helper func.
Result usbDsInterface_RegisterEndpoint(UsbDsInterface *interface, UsbDsEndpoint **endpoint, u8 endpoint_address)
Only available on [5.0.0+].
Result usbDsAddUsbStringDescriptor(u8 *out_index, const char *string)
Only available on [5.0.0+].
Result usbDsSetBinaryObjectStore(const void *bos, size_t bos_size)
Only available on [5.0.0+].
Result usbDsClearDeviceData(void)
Only available on [5.0.0+].
Result usbDsSetUsbDeviceDescriptor(UsbDeviceSpeed speed, struct usb_device_descriptor *descriptor)
Only available on [5.0.0+].
Service * usbDsGetServiceSession(void)
Gets the Service object for the actual usb:ds service session.
Result usbDsParseReportData(UsbDsReportData *reportdata, u32 urbId, u32 *requestedSize, u32 *transferredSize)
Helper func.
Result usbDsGetState(UsbState *out)
Gets the device state. See UsbState.
Result usbDsEnable(void)
Only available on [5.0.0+].
Result usbDsInitialize(void)
Opens a session with usb:ds.
void usbDsExit(void)
Closes the usb:ds session. Any interfaces/endpoints which are left open are automatically closed,...
Result usbDsAddUsbLanguageStringDescriptor(u8 *out_index, const u16 *lang_ids, u16 num_langs)
Only available on [5.0.0+].
Result usbDsInterface_AppendConfigurationData(UsbDsInterface *interface, UsbDeviceSpeed speed, const void *buffer, size_t size)
Only available on [5.0.0+].
Result usbDsRegisterInterfaceEx(UsbDsInterface **out, u8 intf_num)
Only available on [5.0.0+].
UsbDeviceSpeed
Definition usbds.h:57
@ UsbDeviceSpeed_Full
USB 1.1 Full Speed.
Definition usbds.h:58
@ UsbDeviceSpeed_High
USB 2.0 High Speed.
Definition usbds.h:59
@ UsbDeviceSpeed_Super
USB 3.0 Super Speed.
Definition usbds.h:60
Result usbDsDeleteUsbStringDescriptor(u8 index)
Only available on [5.0.0+].
Result usbDsSetVidPidBcd(const UsbDsDeviceInfo *deviceinfo)
Removed in [5.0.0+].
Result usbDsInterface_GetDsEndpoint(UsbDsInterface *interface, UsbDsEndpoint **endpoint, struct usb_endpoint_descriptor *descriptor)
Removed in [5.0.0+].