libnx v4.9.0
Loading...
Searching...
No Matches
hidbus.h
Go to the documentation of this file.
1/**
2 * @file hidbus.h
3 * @brief hidbus service IPC wrapper, for using external devices attached to HID controllers. See also: https://switchbrew.org/wiki/HID_services#hidbus
4 * @note Only available on [5.0.0+].
5 * @author yellows8
6 */
7#pragma once
8#include "../types.h"
9#include "../kernel/event.h"
10#include "../services/hid.h"
11#include "../sf/service.h"
12
13/// BusType
14typedef enum {
15 HidbusBusType_LeftJoyRail = 0, ///< LeftJoyRail
16 HidbusBusType_RightJoyRail = 1, ///< RightJoyRail
17 HidbusBusType_RightLarkRail = 2, ///< [6.0.0+] RightLarkRail (for microphone).
19
20/// JoyPollingMode
21typedef enum {
22 HidbusJoyPollingMode_SixAxisSensorDisable = 0, ///< SixAxisSensorDisable
23 HidbusJoyPollingMode_SixAxisSensorEnable = 1, ///< JoyEnableSixAxisPollingData
24 HidbusJoyPollingMode_ButtonOnly = 2, ///< [6.0.0+] ButtonOnly
26
27/// BusHandle
28typedef struct {
29 u32 abstracted_pad_id; ///< AbstractedPadId
30 u8 internal_index; ///< InternalIndex
31 u8 player_number; ///< PlayerNumber
32 u8 bus_type_id; ///< BusTypeId
33 u8 is_valid; ///< IsValid
35
36/// JoyPollingReceivedData
37typedef struct {
38 u8 data[0x30]; ///< Data.
39 u64 out_size; ///< Size of data.
40 u64 sampling_number; ///< SamplingNumber
42
43/// HidbusDataAccessorHeader
44typedef struct {
45 Result res; ///< Result.
46 u32 pad; ///< Padding.
47 u8 unused[0x18]; ///< Initialized sysmodule-side, not used by sdknso.
48 u64 latest_entry; ///< Latest entry.
49 u64 total_entries; ///< Total entries.
51
52/// HidbusJoyDisableSixAxisPollingDataAccessorEntryData
53typedef struct {
54 u8 data[0x26]; ///< Data.
55 u8 out_size; ///< Size of data.
56 u8 pad; ///< Padding.
57 u64 sampling_number; ///< SamplingNumber
59
60/// HidbusJoyDisableSixAxisPollingDataAccessorEntry
61typedef struct {
62 u64 sampling_number; ///< SamplingNumber
63 HidbusJoyDisableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntryData
65
66/// HidbusJoyEnableSixAxisPollingDataAccessorEntryData
67typedef struct {
68 u8 data[0x8]; ///< Data.
69 u8 out_size; ///< Size of data.
70 u8 pad[7]; ///< Padding.
71 u64 sampling_number; ///< SamplingNumber
73
74/// HidbusJoyEnableSixAxisPollingDataAccessorEntry
75typedef struct {
76 u64 sampling_number; ///< SamplingNumber
77 HidbusJoyEnableSixAxisPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
79
80/// HidbusJoyButtonOnlyPollingDataAccessorEntryData
81typedef struct {
82 u8 data[0x2c]; ///< Data.
83 u8 out_size; ///< Size of data.
84 u8 pad[3]; ///< Padding.
85 u64 sampling_number; ///< SamplingNumber
87
88/// HidbusJoyButtonOnlyPollingDataAccessorEntry
89typedef struct {
90 u64 sampling_number; ///< SamplingNumber
91 HidbusJoyButtonOnlyPollingDataAccessorEntryData data; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntryData
93
94/// HidbusJoyDisableSixAxisPollingDataAccessor
95typedef struct {
96 HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
97 HidbusJoyDisableSixAxisPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyDisableSixAxisPollingDataAccessorEntry
99
100/// HidbusJoyEnableSixAxisPollingDataAccessor
101typedef struct {
102 HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
103 HidbusJoyEnableSixAxisPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyEnableSixAxisPollingDataAccessorEntry
105
106/// HidbusJoyButtonOnlyPollingDataAccessor
107typedef struct {
108 HidbusDataAccessorHeader hdr; ///< \ref HidbusDataAccessorHeader
109 HidbusJoyButtonOnlyPollingDataAccessorEntry entries[0xb]; ///< \ref HidbusJoyButtonOnlyPollingDataAccessorEntry
111
112/// Common data for HidbusStatusManagerEntry*.
113typedef struct {
114 u8 is_connected; ///< IsConnected
115 u8 pad[3]; ///< Padding.
116 Result is_connected_result; ///< IsConnectedResult
117 u8 is_enabled; ///< Flag indicating whether a device is enabled (\ref hidbusEnableExternalDevice).
118 u8 is_in_focus; ///< Flag indicating whether this entry is valid.
119 u8 is_polling_mode; ///< Flag indicating whether polling is enabled (\ref hidbusEnableJoyPollingReceiveMode).
120 u8 reserved; ///< Reserved
121 u32 polling_mode; ///< \ref HidbusJoyPollingMode
123
124/// HidbusStatusManagerEntry on 5.x.
125typedef struct {
126 HidbusStatusManagerEntryCommon common; ///< \ref HidbusStatusManagerEntryCommon
127 u8 unk_x10[0xf0]; ///< Ignored by official sw.
129
130/// HidbusStatusManagerEntry
131typedef struct {
132 HidbusStatusManagerEntryCommon common; ///< \ref HidbusStatusManagerEntryCommon
133 u8 unk_x10[0x70]; ///< Ignored by official sw.
135
136/// StatusManager on 5.x.
137typedef struct {
138 HidbusStatusManagerEntryV5 entries[0x10]; ///< \ref HidbusStatusManagerEntryV5
140
141/// StatusManager
142typedef struct {
143 HidbusStatusManagerEntry entries[0x13]; ///< \ref HidbusStatusManagerEntry
144 u8 unused[0x680]; ///< Unused.
146
147/// Gets the Service object for the actual hidbus service session. This object must be closed by the user once finished using cmds with this.
149
150/// Gets the SharedMemory addr (\ref HidbusStatusManagerV5 on 5.x, otherwise \ref HidbusStatusManager). Only valid when at least one BusHandle is currently initialized (\ref hidbusInitialize).
152
153/**
154 * @brief GetBusHandle
155 * @param[out] handle \ref HidbusBusHandle
156 * @param[out] flag Output flag indicating whether the handle is valid.
157 * @param[in] id \ref HidNpadIdType
158 * @param[in] bus_type \ref HidbusBusType
159 */
161
162/**
163 * @brief Initialize
164 * @param[in] handle \ref HidbusBusHandle
165 */
167
168/**
169 * @brief Finalize
170 * @param[in] handle \ref HidbusBusHandle
171 */
173
174/**
175 * @brief EnableExternalDevice
176 * @note This uses \ref hidLaShowControllerFirmwareUpdate if needed.
177 * @param[in] handle \ref HidbusBusHandle
178 * @param[in] flag Whether to enable the device (true = enable, false = disable). When false, this will internally use \ref hidbusDisableJoyPollingReceiveMode if needed.
179 * @param[in] device_id ExternalDeviceId which must match the connected device. Only used when flag is set.
180 */
182
183/**
184 * @brief SendAndReceive
185 * @param[in] handle \ref HidbusBusHandle
186 * @param[in] inbuf Input buffer, containing the command data.
187 * @param[in] inbuf_size Input buffer size, must be <0x26.
188 * @param[out] outbuf Output buffer, containing the command reply data.
189 * @param[in] outbuf_size Output buffer max size.
190 * @param[out] out_size Actual output size.
191 */
192Result hidbusSendAndReceive(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* outbuf, size_t outbuf_size, u64 *out_size);
193
194/**
195 * @brief EnableJoyPollingReceiveMode
196 * @param[in] handle \ref HidbusBusHandle
197 * @param[in] inbuf Input buffer, containing the command data.
198 * @param[in] inbuf_size Input buffer size, must be <0x26.
199 * @param[out] workbuf TransferMemory buffer, must be 0x1000-byte aligned. This buffer must not be written to until after \ref hidbusDisableJoyPollingReceiveMode is used.
200 * @param[in] workbuf_size TransferMemory buffer size, must be 0x1000-byte aligned.
201 * @param[in] polling_mode \ref HidbusJoyPollingMode
202 */
203Result hidbusEnableJoyPollingReceiveMode(HidbusBusHandle handle, const void* inbuf, size_t inbuf_size, void* workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode);
204
205/**
206 * @brief DisableJoyPollingReceiveMode
207 * @note This can also be used via \ref hidbusEnableExternalDevice with flag=false.
208 * @param[in] handle \ref HidbusBusHandle
209 */
211
212/**
213 * @brief GetJoyPollingReceivedData
214 * @param[in] handle \ref HidbusBusHandle
215 * @param[out] recv_data Output array of \ref HidbusJoyPollingReceivedData.
216 * @param[in] count Total entries for the recv_data array. The maximum is 0xa. Official apps use range 0x1-0x9.
217 */
219
HidNpadIdType
HID controller IDs.
Definition hid.h:214
HidbusJoyPollingMode
JoyPollingMode.
Definition hidbus.h:21
@ HidbusJoyPollingMode_SixAxisSensorEnable
JoyEnableSixAxisPollingData.
Definition hidbus.h:23
@ HidbusJoyPollingMode_ButtonOnly
[6.0.0+] ButtonOnly
Definition hidbus.h:24
@ HidbusJoyPollingMode_SixAxisSensorDisable
SixAxisSensorDisable.
Definition hidbus.h:22
HidbusBusType
BusType.
Definition hidbus.h:14
@ HidbusBusType_RightLarkRail
[6.0.0+] RightLarkRail (for microphone).
Definition hidbus.h:17
@ HidbusBusType_LeftJoyRail
LeftJoyRail.
Definition hidbus.h:15
@ HidbusBusType_RightJoyRail
RightJoyRail.
Definition hidbus.h:16
Result hidbusFinalize(HidbusBusHandle handle)
Finalize.
Result hidbusGetServiceSession(Service *srv_out)
Gets the Service object for the actual hidbus service session. This object must be closed by the user...
Result hidbusGetJoyPollingReceivedData(HidbusBusHandle handle, HidbusJoyPollingReceivedData *recv_data, s32 count)
GetJoyPollingReceivedData.
Result hidbusSendAndReceive(HidbusBusHandle handle, const void *inbuf, size_t inbuf_size, void *outbuf, size_t outbuf_size, u64 *out_size)
SendAndReceive.
Result hidbusEnableJoyPollingReceiveMode(HidbusBusHandle handle, const void *inbuf, size_t inbuf_size, void *workbuf, size_t workbuf_size, HidbusJoyPollingMode polling_mode)
EnableJoyPollingReceiveMode.
void * hidbusGetSharedmemAddr(void)
Gets the SharedMemory addr (HidbusStatusManagerV5 on 5.x, otherwise HidbusStatusManager)....
Result hidbusGetBusHandle(HidbusBusHandle *handle, bool *flag, HidNpadIdType id, HidbusBusType bus_type)
GetBusHandle.
Result hidbusDisableJoyPollingReceiveMode(HidbusBusHandle handle)
DisableJoyPollingReceiveMode.
Result hidbusEnableExternalDevice(HidbusBusHandle handle, bool flag, u32 device_id)
EnableExternalDevice.
Result hidbusInitialize(HidbusBusHandle handle)
Initialize.
BusHandle.
Definition hidbus.h:28
u8 player_number
PlayerNumber.
Definition hidbus.h:31
u8 bus_type_id
BusTypeId.
Definition hidbus.h:32
u8 is_valid
IsValid.
Definition hidbus.h:33
u8 internal_index
InternalIndex.
Definition hidbus.h:30
u32 abstracted_pad_id
AbstractedPadId.
Definition hidbus.h:29
HidbusDataAccessorHeader.
Definition hidbus.h:44
u64 total_entries
Total entries.
Definition hidbus.h:49
u64 latest_entry
Latest entry.
Definition hidbus.h:48
Result res
Result.
Definition hidbus.h:45
u32 pad
Padding.
Definition hidbus.h:46
HidbusJoyButtonOnlyPollingDataAccessorEntryData.
Definition hidbus.h:81
u8 out_size
Size of data.
Definition hidbus.h:83
u64 sampling_number
SamplingNumber.
Definition hidbus.h:85
HidbusJoyButtonOnlyPollingDataAccessorEntry.
Definition hidbus.h:89
HidbusJoyButtonOnlyPollingDataAccessorEntryData data
HidbusJoyEnableSixAxisPollingDataAccessorEntryData
Definition hidbus.h:91
u64 sampling_number
SamplingNumber.
Definition hidbus.h:90
HidbusJoyButtonOnlyPollingDataAccessor.
Definition hidbus.h:107
HidbusDataAccessorHeader hdr
HidbusDataAccessorHeader
Definition hidbus.h:108
HidbusJoyDisableSixAxisPollingDataAccessorEntryData.
Definition hidbus.h:53
u8 out_size
Size of data.
Definition hidbus.h:55
u64 sampling_number
SamplingNumber.
Definition hidbus.h:57
HidbusJoyDisableSixAxisPollingDataAccessorEntry.
Definition hidbus.h:61
u64 sampling_number
SamplingNumber.
Definition hidbus.h:62
HidbusJoyDisableSixAxisPollingDataAccessorEntryData data
HidbusJoyDisableSixAxisPollingDataAccessorEntryData
Definition hidbus.h:63
HidbusJoyDisableSixAxisPollingDataAccessor.
Definition hidbus.h:95
HidbusDataAccessorHeader hdr
HidbusDataAccessorHeader
Definition hidbus.h:96
HidbusJoyEnableSixAxisPollingDataAccessorEntryData.
Definition hidbus.h:67
u64 sampling_number
SamplingNumber.
Definition hidbus.h:71
u8 out_size
Size of data.
Definition hidbus.h:69
HidbusJoyEnableSixAxisPollingDataAccessorEntry.
Definition hidbus.h:75
HidbusJoyEnableSixAxisPollingDataAccessorEntryData data
HidbusJoyEnableSixAxisPollingDataAccessorEntryData
Definition hidbus.h:77
u64 sampling_number
SamplingNumber.
Definition hidbus.h:76
HidbusJoyEnableSixAxisPollingDataAccessor.
Definition hidbus.h:101
HidbusDataAccessorHeader hdr
HidbusDataAccessorHeader
Definition hidbus.h:102
JoyPollingReceivedData.
Definition hidbus.h:37
u64 sampling_number
SamplingNumber.
Definition hidbus.h:40
u64 out_size
Size of data.
Definition hidbus.h:39
Common data for HidbusStatusManagerEntry*.
Definition hidbus.h:113
u8 is_enabled
Flag indicating whether a device is enabled (hidbusEnableExternalDevice).
Definition hidbus.h:117
u32 polling_mode
HidbusJoyPollingMode
Definition hidbus.h:121
u8 is_polling_mode
Flag indicating whether polling is enabled (hidbusEnableJoyPollingReceiveMode).
Definition hidbus.h:119
u8 reserved
Reserved.
Definition hidbus.h:120
u8 is_in_focus
Flag indicating whether this entry is valid.
Definition hidbus.h:118
Result is_connected_result
IsConnectedResult.
Definition hidbus.h:116
u8 is_connected
IsConnected.
Definition hidbus.h:114
HidbusStatusManagerEntry on 5.x.
Definition hidbus.h:125
HidbusStatusManagerEntryCommon common
HidbusStatusManagerEntryCommon
Definition hidbus.h:126
HidbusStatusManagerEntry.
Definition hidbus.h:131
HidbusStatusManagerEntryCommon common
HidbusStatusManagerEntryCommon
Definition hidbus.h:132
StatusManager on 5.x.
Definition hidbus.h:137
StatusManager.
Definition hidbus.h:142
Service object structure.
Definition service.h:14
uint64_t u64
64-bit unsigned integer.
Definition types.h:22
uint8_t u8
8-bit unsigned integer.
Definition types.h:19
u32 Result
Function error code result type.
Definition types.h:44
int32_t s32
32-bit signed integer.
Definition types.h:27
uint32_t u32
32-bit unsigned integer.
Definition types.h:21