8#ifndef __LIBDRAGON_JOYPAD_ACCESSORY_H
9#define __LIBDRAGON_JOYPAD_ACCESSORY_H
28#define JOYPAD_ACCESSORY_RETRY_LIMIT 2
33 JOYPAD_ACCESSORY_STATE_IDLE = 0,
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,
49 JOYPAD_ACCESSORY_STATE_READ,
51 JOYPAD_ACCESSORY_STATE_WRITE,
53 JOYPAD_ACCESSORY_STATE_RUMBLE_WRITE,
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,
61 JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_STATUS_READ,
62 JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_BANK_WRITE,
63 JOYPAD_ACCESSORY_STATE_TRANSFER_LOAD_DATA_READ,
65 JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_STATUS_READ,
66 JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_BANK_WRITE,
67 JOYPAD_ACCESSORY_STATE_TRANSFER_STORE_DATA_WRITE,
71#define joypad_accessory_state_is_detecting(state) \
72 ((state) >= JOYPAD_ACCESSORY_STATE_DETECT_INIT && \
73 (state) <= JOYPAD_ACCESSORY_STATE_DETECT_SNAP_PROBE_READ)
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)
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)
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)
113#define JOYPAD_CONTROLLER_PAK_BANK_SWITCH_ADDRESS 0x8000
141typedef struct joypad_accessory_s
#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
Timer structure.
Definition timer.h:52
Joybus accessory internal utilities.