libjoybus
Joybus implementation for 32-bit MCUs
Loading...
Searching...
No Matches
esp32.h
1
9
10#pragma once
11
12#include <stdbool.h>
13#include <stdint.h>
14
15#include <esp_intr_alloc.h>
16#include <esp_timer.h>
17#include <soc/gpio_num.h>
18
19#include <joybus/bus.h>
20
24#define JOYBUS_ESP32(bus) ((struct joybus_esp32 *)(bus))
25
33#ifndef JOYBUS_ESP32_ISR_IRAM_SAFE
34#define JOYBUS_ESP32_ISR_IRAM_SAFE 0
35#endif
36
37#if JOYBUS_ESP32_ISR_IRAM_SAFE && !JOYBUS_USE_RAM_FUNCS
38#error "JOYBUS_ESP32_ISR_IRAM_SAFE requires JOYBUS_USE_RAM_FUNCS"
39#endif
40
41// Private implementation details - do not access directly
43 // Bus state
44 uint8_t state;
45
46 // GPIO configuration
47 gpio_num_t gpio;
48
49 // RMT channel assignment
50 uint8_t rmt_tx_ch;
51 uint8_t rmt_rx_ch;
52 uint8_t rmt_rx_mem_ch;
53
54 // RMT interrupt
55 intr_handle_t rmt_intr;
56
57 // Pre-encoded TX symbols
58 uint32_t sym_one;
59 uint32_t sym_zero;
60 uint32_t sym_stop;
61
62 // TARGET_REPLY_FLOOR_NS in CPU cycles, re-resolved on every entry to target RX
63 uint32_t reply_floor_cycles;
64
65 // RX/TX state
66 uint8_t *read_buf;
67 uint8_t read_len;
68 uint8_t read_count;
69 uint8_t rx_skip;
70 const uint8_t *write_buf;
71 uint8_t write_len;
72 uint8_t write_count;
73
74 // One-shot timer for inter-transfer gap scheduling
75 esp_timer_handle_t transfer_start_timer;
76
77 // Transfer state
78 joybus_transfer_cb done_callback;
79 void *done_user_data;
80 uint32_t last_transfer_cycles;
81};
82
87 struct joybus base;
88 struct joybus_esp32_data data;
89};
90
96 gpio_num_t gpio;
97
99 uint32_t freq;
100
102 uint8_t rmt_tx_ch;
103
105 uint8_t rmt_rx_ch;
106};
107
115{
116 return (struct joybus_esp32_config){
117 .gpio = gpio,
118 .freq = JOYBUS_FREQ_NOMINAL,
119 .rmt_tx_ch = 0,
120 .rmt_rx_ch = 0,
121 };
122}
123
131int joybus_esp32_init(struct joybus_esp32 *esp32_bus, struct joybus_esp32_config config);
132
static struct joybus_esp32_config joybus_esp32_config_default(gpio_num_t gpio)
Build an ESP32 config with default values.
Definition esp32.h:114
int joybus_esp32_init(struct joybus_esp32 *esp32_bus, struct joybus_esp32_config config)
Initialize an ESP32 Joybus instance.
Definition joybus.c:735
void(* joybus_transfer_cb)(struct joybus *bus, int status, void *user_data)
Function type for transfer completion callbacks.
Definition bus.h:85
#define JOYBUS_FREQ_NOMINAL
Nominal Joybus frequency, matching an OEM N64/GameCube controller.
Definition bus.h:17
Configuration for an ESP32 Joybus instance.
Definition esp32.h:94
uint8_t rmt_rx_ch
RMT RX channel index (0-based among the chip's RX-capable channels).
Definition esp32.h:105
gpio_num_t gpio
GPIO pin to use for the Joybus data line (single bidirectional open-drain).
Definition esp32.h:96
uint8_t rmt_tx_ch
RMT TX channel index (0-based among the chip's TX-capable channels).
Definition esp32.h:102
uint32_t freq
Transmit frequency, in Hz.
Definition esp32.h:99
Definition esp32.h:42
An ESP32 Joybus instance.
Definition esp32.h:86
A Joybus instance.
Definition bus.h:105