8#include "hardware/pio.h"
15#define joybus_target_wrap_target 0
16#define joybus_target_wrap 15
17#define joybus_target_pio_version 0
19#define joybus_target_TICKS_PER_BIT 24
21#define joybus_target_offset_transmit 7u
23static const uint16_t joybus_target_program_instructions[] = {
45static const struct pio_program joybus_target_program = {
46 .instructions = joybus_target_program_instructions,
49 .pio_version = joybus_target_pio_version,
50#if PICO_PIO_VERSION > 0
51 .used_gpio_ranges = 0x0
55static inline pio_sm_config joybus_target_program_get_default_config(uint offset) {
56 pio_sm_config c = pio_get_default_sm_config();
57 sm_config_set_wrap(&c, offset + joybus_target_wrap_target, offset + joybus_target_wrap);
58 sm_config_set_sideset(&c, 1,
false,
true);
62#include "hardware/clocks.h"
63static inline void joybus_target_program_init(PIO pio, uint sm, uint offset, uint pin, uint bus_freq) {
64 pio_sm_config c = joybus_target_program_get_default_config(offset);
66 sm_config_set_in_pins(&c, pin);
67 sm_config_set_sideset_pins(&c, pin);
69 sm_config_set_out_shift(&c,
false,
true, 8);
70 sm_config_set_in_shift(&c,
false,
true, 8);
72 float div = (float)clock_get_hz(clk_sys) / (joybus_target_TICKS_PER_BIT * bus_freq);
73 sm_config_set_clkdiv(&c, div);
75 pio_sm_init(pio, sm, offset, &c);
76 pio_sm_set_enabled(pio, sm,
true);