libjoybus
Joybus implementation for 32-bit MCUs
Loading...
Searching...
No Matches
joybus_target.pio.h
1// ---------------------------------------------------------------- //
2// This file is autogenerated by pioasm version 2.2.0; do not edit! //
3// ---------------------------------------------------------------- //
4
5#pragma once
6
7#if !PICO_NO_HARDWARE
8#include "hardware/pio.h"
9#endif
10
11// ------------- //
12// joybus_target //
13// ------------- //
14
15#define joybus_target_wrap_target 0
16#define joybus_target_wrap 15
17#define joybus_target_pio_version 0
18
19#define joybus_target_TICKS_PER_BIT 24
20
21#define joybus_target_offset_transmit 7u
22
23static const uint16_t joybus_target_program_instructions[] = {
24 // .wrap_target
25 0xe027, // 0: set x, 7 side 0
26 0x2820, // 1: wait 0 pin, 0 side 0 [8]
27 0x4001, // 2: in pins, 1 side 0
28 0x20a0, // 3: wait 1 pin, 0 side 0
29 0x0041, // 4: jmp x--, 1 side 0
30 0xc010, // 5: irq nowait 0 rel side 0
31 0x0000, // 6: jmp 0 side 0
32 0x8ba0, // 7: pull block side 0 [11]
33 0xa542, // 8: nop side 0 [5]
34 0x7021, // 9: out x, 1 side 1
35 0x142c, // 10: jmp !x, 12 side 1 [4]
36 0x0b0d, // 11: jmp 13 side 0 [11]
37 0xbb42, // 12: nop side 1 [11]
38 0x05e9, // 13: jmp !osre, 9 side 0 [5]
39 0xbb42, // 14: nop side 1 [11]
40 0xc010, // 15: irq nowait 0 rel side 0
41 // .wrap
42};
43
44#if !PICO_NO_HARDWARE
45static const struct pio_program joybus_target_program = {
46 .instructions = joybus_target_program_instructions,
47 .length = 16,
48 .origin = -1,
49 .pio_version = joybus_target_pio_version,
50#if PICO_PIO_VERSION > 0
51 .used_gpio_ranges = 0x0
52#endif
53};
54
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);
59 return c;
60}
61
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);
65 // Set pin configuration
66 sm_config_set_in_pins(&c, pin);
67 sm_config_set_sideset_pins(&c, pin);
68 // Auto-pull and auto-push with 8-bit thresholds
69 sm_config_set_out_shift(&c, false, true, 8);
70 sm_config_set_in_shift(&c, false, true, 8);
71 // Set clock divider based on desired bus frequency and internal timing
72 float div = (float)clock_get_hz(clk_sys) / (joybus_target_TICKS_PER_BIT * bus_freq);
73 sm_config_set_clkdiv(&c, div);
74 // Initialize and enable the state machine
75 pio_sm_init(pio, sm, offset, &c);
76 pio_sm_set_enabled(pio, sm, true);
77}
78
79#endif
80