libdragon
Loading...
Searching...
No Matches
joypad_accessory.h
Go to the documentation of this file.
1
8#ifndef __LIBDRAGON_JOYPAD_ACCESSORY_H
9#define __LIBDRAGON_JOYPAD_ACCESSORY_H
10
11#include <stddef.h>
12#include <stdint.h>
13
15#include "joypad.h"
16#include "timer.h"
17
23#ifdef __cplusplus
24extern "C" {
25#endif
26
28#define JOYPAD_ACCESSORY_RETRY_LIMIT 2
29
31typedef enum
32{
33 JOYPAD_ACCESSORY_STATE_IDLE = 0,
34 // Accessory detection routine states
35 JOYPAD_ACCESSORY_STATE_DETECT_INIT,
36 JOYPAD_ACCESSORY_STATE_DETECT_CPAK_BANK_WRITE,
37 JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_BACKUP,
38 JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_WRITE,
39 JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_READ,
40 JOYPAD_ACCESSORY_STATE_DETECT_CPAK_LABEL_RESTORE,
41 JOYPAD_ACCESSORY_STATE_DETECT_RUMBLE_PROBE_WRITE,
42 JOYPAD_ACCESSORY_STATE_DETECT_RUMBLE_PROBE_READ,
43 JOYPAD_ACCESSORY_STATE_DETECT_TRANSFER_PROBE_ON,
44 JOYPAD_ACCESSORY_STATE_DETECT_TRANSFER_PROBE_READ,
45 JOYPAD_ACCESSORY_STATE_DETECT_TRANSFER_PROBE_OFF,
46 JOYPAD_ACCESSORY_STATE_DETECT_SNAP_PROBE_WRITE,
47 JOYPAD_ACCESSORY_STATE_DETECT_SNAP_PROBE_READ,
48 // Accessory read states
49 JOYPAD_ACCESSORY_STATE_READ,
50 // Accessory write states
51 JOYPAD_ACCESSORY_STATE_WRITE,
52 // Rumble Pak motor control states
53 JOYPAD_ACCESSORY_STATE_RUMBLE_WRITE,
54 // Transfer Pak power control states
55 JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_PROBE_WRITE,
56 JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_PROBE_WAIT,
57 JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_STATUS_WRITE,
58 JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_STATUS_WAIT,
59 JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_STATUS_READ,
60 // Transfer Pak cartridge read states
61 JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_STATUS_READ,
62 JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_BANK_WRITE,
63 JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_DATA_READ,
64 // Transfer Pak cartridge write states
65 JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_STATUS_READ,
66 JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_BANK_WRITE,
67 JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_DATA_WRITE,
69
71#define joypad_accessory_state_is_detecting(state) \
72 ((state) >= JOYPAD_ACCESSORY_STATE_DETECT_INIT && \
73 (state) <= JOYPAD_ACCESSORY_STATE_DETECT_SNAP_PROBE_READ)
74
76#define joypad_accessory_state_is_transfer_enabling(state) \
77 ((state) >= JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_PROBE_WRITE && \
78 (state) <= JOYPAD_ACCESSORY_STATE_TRANSFER_ENABLE_STATUS_READ)
79
81#define joypad_accessory_state_is_transfer_loading(state) \
82 ((state) >= JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_STATUS_READ && \
83 (state) <= JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_DATA_READ)
84
86#define joypad_accessory_state_is_transfer_storing(state) \
87 ((state) >= JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_STATUS_READ && \
88 (state) <= JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_DATA_WRITE)
89
102
111
113#define JOYPAD_CONTROLLER_PAK_BANK_SWITCH_ADDRESS 0x8000
114
117
119typedef struct
120{
121 uint8_t *start;
122 uint8_t *end;
123 uint8_t *cursor;
124 uint16_t cart_addr;
126 void *ctx;
128
130typedef struct
131{
132 uint8_t *start;
133 uint8_t *end;
134 uint8_t *cursor;
135 uint8_t bank;
136 uint16_t cart_addr;
137 uint16_t tpak_addr;
139
141typedef struct joypad_accessory_s
142{
143 uint8_t status;
147 unsigned retries;
148 uint8_t cpak_label_backup[JOYBUS_ACCESSORY_DATA_SIZE];
150 timer_link_t *transfer_pak_wait_timer;
151 joybus_transfer_pak_status_t transfer_pak_status;
152 joypad_transfer_pak_io_t transfer_pak_io;
154
161
182
220 joypad_port_t port,
222 uint16_t start_addr,
223 void *dst,
224 size_t len,
226 void *ctx
227);
228
248 joypad_port_t port,
250 uint16_t start_addr,
251 void *dst,
252 size_t len
253);
254
275
276
283void joypad_rumble_pak_toggle_async(joypad_port_t port, bool active);
284
293
300void joypad_transfer_pak_enable_async(joypad_port_t port, bool enabled);
301
310void joypad_transfer_pak_load_async(joypad_port_t port, uint16_t cart_addr, void *dst, size_t len);
311
320void joypad_transfer_pak_store_async(joypad_port_t port, uint16_t cart_addr, void *src, size_t len);
321
322#ifdef __cplusplus
323}
324#endif
325
/* joypad */
327
328#endif
#define JOYBUS_ACCESSORY_DATA_SIZE
Size of a Joybus N64 accessory read/write payload in bytes.
Definition joybus.h:76
Joybus N64 Transfer Pak Status wrapper.
Definition joybus_accessory_internal.h:186
joypad_accessory_xfer_t
Type of transfer performed by joypad_accessory_xfer_async.
Definition joypad_accessory.h:107
joypad_accessory_state_t
Joypad accessory states enumeration.
Definition joypad_accessory.h:32
joypad_accessory_error_t
Joypad accessory error codes.
Definition joypad_accessory.h:94
joypad_accessory_error_t joypad_controller_pak_set_bank(joypad_port_t port, uint8_t bank)
Select the active bank for a Controller Pak.
Definition joypad_accessory.c:832
void joypad_accessory_detect_async(joypad_port_t port)
Detect which accessory is inserted in an N64 controller.
Definition joypad_accessory.c:544
void joypad_transfer_pak_load_async(joypad_port_t port, uint16_t cart_addr, void *dst, size_t len)
Load data from the GB cartridge inserted in a Transfer Pak.
Definition joypad_accessory.c:1088
joypad_accessory_error_t joypad_accessory_xfer(joypad_port_t port, joypad_accessory_xfer_t xfer, uint16_t start_addr, void *dst, size_t len)
Read or write data from a joypad accessory.
Definition joypad_accessory.c:807
void joypad_rumble_pak_toggle_async(joypad_port_t port, bool active)
Turn the Rumble Pak motor on or off for a Joypad port.
Definition joypad_accessory.c:605
void joypad_accessory_xfer_async(joypad_port_t port, joypad_accessory_xfer_t xfer, uint16_t start_addr, void *dst, size_t len, joypad_accessory_io_callback_t callback, void *ctx)
Read or write data from a Joypad accessory asynchronously.
Definition joypad_accessory.c:745
void joypad_transfer_pak_enable_async(joypad_port_t port, bool enabled)
Enable or disable the Transfer Pak for a Joypad port.
Definition joypad_accessory.c:928
uint8_t joypad_get_transfer_pak_status(joypad_port_t port)
Get the Transfer Pak status byte for a Joypad port.
Definition joypad.c:897
joypad_accessory_type_t
Joypad Accessories enumeration.
Definition joypad.h:141
void joypad_transfer_pak_store_async(joypad_port_t port, uint16_t cart_addr, void *src, size_t len)
Store data on the GB cartridge inserted in a Transfer Pak.
Definition joypad_accessory.c:1255
void joypad_accessory_reset(joypad_port_t port)
Reset the accessory state for a Joypad port.
Definition joypad_accessory.c:181
void(* joypad_accessory_io_callback_t)(joypad_accessory_error_t error, void *ctx)
Callback function signature for joypad_accessory_xfer_async.
Definition joypad_accessory.h:116
joypad_port_t
Joypad Port Numbers.
Definition joypad.h:74
@ JOYPAD_ACCESSORY_XFER_WRITE
Write operation.
Definition joypad_accessory.h:109
@ JOYPAD_ACCESSORY_XFER_READ
Read operation.
Definition joypad_accessory.h:108
@ JOYPAD_ACCESSORY_ERROR_CHECKSUM
Checksum error.
Definition joypad_accessory.h:98
@ JOYPAD_ACCESSORY_ERROR_TRANSFER_PAK_STATUS_CHANGE
Transfer Pak status changed.
Definition joypad_accessory.h:99
@ JOYPAD_ACCESSORY_ERROR_UNKNOWN
Unknown error.
Definition joypad_accessory.h:100
@ JOYPAD_ACCESSORY_ERROR_PENDING
Operation is pending
Definition joypad_accessory.h:95
@ JOYPAD_ACCESSORY_ERROR_NONE
No error.
Definition joypad_accessory.h:96
@ JOYPAD_ACCESSORY_ERROR_ABSENT
Accessory is absent.
Definition joypad_accessory.h:97
Joypad Accessory I/O operation state.
Definition joypad_accessory.h:120
Joypad accessory structure.
Definition joypad_accessory.h:142
Joypad N64 Transfer Pak I/O operation state.
Definition joypad_accessory.h:131
Joybus accessory internal utilities.
Joypad Subsystem.
Timer Subsystem.