libjoybus
Joybus implementation for 32-bit MCUs
Loading...
Searching...
No Matches
rp2xxx.h
1
9
10#pragma once
11
12#include <hardware/irq.h>
13#include <hardware/pio.h>
14#include <hardware/timer.h>
15
16#include <joybus/bus.h>
17
21#define JOYBUS_RP2XXX(bus) ((struct joybus_rp2xxx *)(bus))
22
23struct joybus_rp2xxx;
24
25// Private implementation details - do not access directly
27 // Bus state
28 uint8_t state;
29
30 // GPIO configuration
31 uint gpio;
32
33 // PIO instance and state machine
34 PIO pio;
35 uint pio_sm;
36 bool pio_configured;
37
38 // DMA configuration
39 uint dma_chan_tx;
40 uint dma_chan_rx;
41
42 // RX/TX state
43 uint8_t *read_buf;
44 uint8_t read_len;
45 uint8_t read_count;
46 uint8_t *write_buf;
47 uint8_t write_len;
48 // Hardware alarm the timeouts run on, shared with any other bus on it
49 timer_hw_t *timer;
50 uint alarm_num;
51 struct joybus_rp2xxx *alarm_next;
52
53 // How the PIO and alarm handlers reach their vectors
54 void (*set_irq_handler)(uint irq_num, irq_handler_t handler);
55
56 // What this bus is waiting for, if anything
57 uint64_t alarm_target_us;
58 void (*alarm_callback)(void *user_data);
59
60 // Transfer state
61 joybus_transfer_cb done_callback;
62 void *done_user_data;
63 uint64_t last_transfer_us;
64};
65
70 struct joybus base;
71 struct joybus_rp2xxx_data data;
72};
73
79 uint8_t gpio;
80
82 PIO pio;
83
85 timer_hw_t *timer;
86
89
91 uint32_t freq;
92
94 void (*set_irq_handler)(uint irq_num, irq_handler_t handler);
95};
96
103static inline void joybus_rp2xxx_set_irq_handler_sdk(uint irq_num, irq_handler_t handler)
104{
105 irq_set_exclusive_handler(irq_num, handler);
106 irq_set_enabled(irq_num, true);
107}
108
118{
119 return (struct joybus_rp2xxx_config){
120 .gpio = gpio,
121 .pio = pio0,
122 .timer = PICO_DEFAULT_TIMER_INSTANCE(),
123 .alarm_num = 0,
124 .freq = JOYBUS_FREQ_NOMINAL,
125 .set_irq_handler = joybus_rp2xxx_set_irq_handler_sdk,
126 };
127}
128
136int joybus_rp2xxx_init(struct joybus_rp2xxx *rp2xxx_bus, struct joybus_rp2xxx_config config);
137
int joybus_rp2xxx_init(struct joybus_rp2xxx *rp2xxx_bus, struct joybus_rp2xxx_config config)
Initialize a RP2xxx Joybus instance.
Definition joybus.c:551
static void joybus_rp2xxx_set_irq_handler_sdk(uint irq_num, irq_handler_t handler)
Install an interrupt handler through the pico-sdk.
Definition rp2xxx.h:103
static struct joybus_rp2xxx_config joybus_rp2xxx_config_default(uint8_t gpio)
Build a RP2xxx config with default values.
Definition rp2xxx.h:117
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 a RP2xxx Joybus instance.
Definition rp2xxx.h:77
uint8_t gpio
GPIO pin to use for the Joybus data line, 0 to 31.
Definition rp2xxx.h:79
uint alarm_num
Which of that timer's alarms to claim.
Definition rp2xxx.h:88
uint32_t freq
Transmit frequency, in Hz.
Definition rp2xxx.h:91
void(* set_irq_handler)(uint irq_num, irq_handler_t handler)
Installs an interrupt handler and enables the line.
Definition rp2xxx.h:94
timer_hw_t * timer
Timer instance the reply timeouts run on.
Definition rp2xxx.h:85
PIO pio
PIO instance to use (eg. pio0 or pio1)
Definition rp2xxx.h:82
Definition rp2xxx.h:26
A RP2xxx Joybus instance.
Definition rp2xxx.h:69
A Joybus instance.
Definition bus.h:105