248 lines
9.1 KiB
C
248 lines
9.1 KiB
C
// -------------------------------------------------- //
|
|
// This file is autogenerated by pioasm; do not edit! //
|
|
// -------------------------------------------------- //
|
|
|
|
#pragma once
|
|
|
|
#if !PICO_NO_HARDWARE
|
|
#include "hardware/pio.h"
|
|
#endif
|
|
|
|
#define IRQ_RX_BS_ERR 1
|
|
#define IRQ_RX_EOP 2
|
|
#define IRQ_RX_START 3
|
|
#define DECODER_TRIGGER 4
|
|
|
|
// ----------------- //
|
|
// usb_edge_detector //
|
|
// ----------------- //
|
|
|
|
#define usb_edge_detector_wrap_target 3
|
|
#define usb_edge_detector_wrap 9
|
|
|
|
static const uint16_t usb_edge_detector_program_instructions[] = {
|
|
0xc022, // 0: irq wait 2
|
|
0x00c1, // 1: jmp pin, 1
|
|
0xc103, // 2: irq nowait 3 [1]
|
|
// .wrap_target
|
|
0xc104, // 3: irq nowait 4 [1]
|
|
0x00cc, // 4: jmp pin, 12
|
|
0x00cc, // 5: jmp pin, 12
|
|
0x00cc, // 6: jmp pin, 12
|
|
0x00cc, // 7: jmp pin, 12
|
|
0x00cc, // 8: jmp pin, 12
|
|
0x00cc, // 9: jmp pin, 12
|
|
// .wrap
|
|
0xa226, // 10: mov x, isr [2]
|
|
0x0040, // 11: jmp x--, 0
|
|
0xa0c3, // 12: mov isr, null
|
|
0x4001, // 13: in pins, 1
|
|
0xc004, // 14: irq nowait 4
|
|
0x00ca, // 15: jmp pin, 10
|
|
0x0005, // 16: jmp 5
|
|
};
|
|
|
|
#if !PICO_NO_HARDWARE
|
|
static const struct pio_program usb_edge_detector_program = {
|
|
.instructions = usb_edge_detector_program_instructions,
|
|
.length = 17,
|
|
.origin = -1,
|
|
};
|
|
|
|
static inline pio_sm_config usb_edge_detector_program_get_default_config(uint offset) {
|
|
pio_sm_config c = pio_get_default_sm_config();
|
|
sm_config_set_wrap(&c, offset + usb_edge_detector_wrap_target, offset + usb_edge_detector_wrap);
|
|
return c;
|
|
}
|
|
#endif
|
|
|
|
// ----------------------- //
|
|
// usb_edge_detector_debug //
|
|
// ----------------------- //
|
|
|
|
#define usb_edge_detector_debug_wrap_target 3
|
|
#define usb_edge_detector_debug_wrap 9
|
|
|
|
static const uint16_t usb_edge_detector_debug_program_instructions[] = {
|
|
0xc022, // 0: irq wait 2 side 0
|
|
0x10c1, // 1: jmp pin, 1 side 1
|
|
0xc103, // 2: irq nowait 3 side 0 [1]
|
|
// .wrap_target
|
|
0xc104, // 3: irq nowait 4 side 0 [1]
|
|
0x10cc, // 4: jmp pin, 12 side 1
|
|
0x10cc, // 5: jmp pin, 12 side 1
|
|
0x10cc, // 6: jmp pin, 12 side 1
|
|
0x10cc, // 7: jmp pin, 12 side 1
|
|
0x10cc, // 8: jmp pin, 12 side 1
|
|
0x10cc, // 9: jmp pin, 12 side 1
|
|
// .wrap
|
|
0xb226, // 10: mov x, isr side 1 [2]
|
|
0x1040, // 11: jmp x--, 0 side 1
|
|
0xb0c3, // 12: mov isr, null side 1
|
|
0x4001, // 13: in pins, 1 side 0
|
|
0xc004, // 14: irq nowait 4 side 0
|
|
0x00ca, // 15: jmp pin, 10 side 0
|
|
0x1005, // 16: jmp 5 side 1
|
|
};
|
|
|
|
#if !PICO_NO_HARDWARE
|
|
static const struct pio_program usb_edge_detector_debug_program = {
|
|
.instructions = usb_edge_detector_debug_program_instructions,
|
|
.length = 17,
|
|
.origin = -1,
|
|
};
|
|
|
|
static inline pio_sm_config usb_edge_detector_debug_program_get_default_config(uint offset) {
|
|
pio_sm_config c = pio_get_default_sm_config();
|
|
sm_config_set_wrap(&c, offset + usb_edge_detector_debug_wrap_target, offset + usb_edge_detector_debug_wrap);
|
|
sm_config_set_sideset(&c, 1, false, false);
|
|
return c;
|
|
}
|
|
#endif
|
|
|
|
// ---------------- //
|
|
// usb_nrzi_decoder //
|
|
// ---------------- //
|
|
|
|
#define usb_nrzi_decoder_wrap_target 0
|
|
#define usb_nrzi_decoder_wrap 14
|
|
|
|
static const uint16_t usb_nrzi_decoder_program_instructions[] = {
|
|
// .wrap_target
|
|
0xe046, // 0: set y, 6
|
|
0x20c4, // 1: wait 1 irq, 4
|
|
0x00c9, // 2: jmp pin, 9
|
|
0x006e, // 3: jmp !y, 14
|
|
0x0027, // 4: jmp !x, 7
|
|
0x4061, // 5: in null, 1
|
|
0x000e, // 6: jmp 14
|
|
0x40e1, // 7: in osr, 1
|
|
0x0081, // 8: jmp y--, 1
|
|
0x006e, // 9: jmp !y, 14
|
|
0x002d, // 10: jmp !x, 13
|
|
0x4021, // 11: in x, 1
|
|
0x0081, // 12: jmp y--, 1
|
|
0x4061, // 13: in null, 1
|
|
0xa029, // 14: mov x, !x
|
|
// .wrap
|
|
};
|
|
|
|
#if !PICO_NO_HARDWARE
|
|
static const struct pio_program usb_nrzi_decoder_program = {
|
|
.instructions = usb_nrzi_decoder_program_instructions,
|
|
.length = 15,
|
|
.origin = -1,
|
|
};
|
|
|
|
static inline pio_sm_config usb_nrzi_decoder_program_get_default_config(uint offset) {
|
|
pio_sm_config c = pio_get_default_sm_config();
|
|
sm_config_set_wrap(&c, offset + usb_nrzi_decoder_wrap_target, offset + usb_nrzi_decoder_wrap);
|
|
return c;
|
|
}
|
|
#endif
|
|
|
|
// ---------------------- //
|
|
// usb_nrzi_decoder_debug //
|
|
// ---------------------- //
|
|
|
|
#define usb_nrzi_decoder_debug_wrap_target 0
|
|
#define usb_nrzi_decoder_debug_wrap 14
|
|
|
|
static const uint16_t usb_nrzi_decoder_debug_program_instructions[] = {
|
|
// .wrap_target
|
|
0xe046, // 0: set y, 6
|
|
0x20c4, // 1: wait 1 irq, 4
|
|
0x00c9, // 2: jmp pin, 9
|
|
0x106e, // 3: jmp !y, 14 side 0
|
|
0x1027, // 4: jmp !x, 7 side 0
|
|
0x4061, // 5: in null, 1
|
|
0x000e, // 6: jmp 14
|
|
0x40e1, // 7: in osr, 1
|
|
0x0081, // 8: jmp y--, 1
|
|
0x186e, // 9: jmp !y, 14 side 1
|
|
0x182d, // 10: jmp !x, 13 side 1
|
|
0x4021, // 11: in x, 1
|
|
0x0081, // 12: jmp y--, 1
|
|
0x4061, // 13: in null, 1
|
|
0xa029, // 14: mov x, !x
|
|
// .wrap
|
|
};
|
|
|
|
#if !PICO_NO_HARDWARE
|
|
static const struct pio_program usb_nrzi_decoder_debug_program = {
|
|
.instructions = usb_nrzi_decoder_debug_program_instructions,
|
|
.length = 15,
|
|
.origin = -1,
|
|
};
|
|
|
|
static inline pio_sm_config usb_nrzi_decoder_debug_program_get_default_config(uint offset) {
|
|
pio_sm_config c = pio_get_default_sm_config();
|
|
sm_config_set_wrap(&c, offset + usb_nrzi_decoder_debug_wrap_target, offset + usb_nrzi_decoder_debug_wrap);
|
|
sm_config_set_sideset(&c, 2, true, false);
|
|
return c;
|
|
}
|
|
|
|
#include "hardware/clocks.h"
|
|
static __always_inline void pio_sm_set_jmp_pin(PIO pio, uint sm, uint jmp_pin) {
|
|
pio->sm[sm].execctrl =
|
|
(pio->sm[sm].execctrl & ~PIO_SM0_EXECCTRL_JMP_PIN_BITS) |
|
|
(jmp_pin << PIO_SM0_EXECCTRL_JMP_PIN_LSB);
|
|
}
|
|
static inline void usb_rx_fs_program_init(PIO pio, uint sm, uint offset, uint pin_dp, uint pin_dm, int pin_debug) {
|
|
if (pin_dp < pin_dm) {
|
|
pio_sm_set_consecutive_pindirs(pio, sm, pin_dp, 2, false);
|
|
} else {
|
|
pio_sm_set_consecutive_pindirs(pio, sm, pin_dm, 2, false);
|
|
}
|
|
gpio_pull_down(pin_dp);
|
|
gpio_pull_down(pin_dm);
|
|
gpio_set_inover(pin_dp, GPIO_OVERRIDE_INVERT);
|
|
gpio_set_inover(pin_dm, GPIO_OVERRIDE_INVERT);
|
|
pio_sm_config c;
|
|
if (pin_debug < 0) {
|
|
c = usb_nrzi_decoder_program_get_default_config(offset);
|
|
} else {
|
|
c = usb_nrzi_decoder_debug_program_get_default_config(offset);
|
|
pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug);
|
|
pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug);
|
|
pio_gpio_init(pio, pin_debug);
|
|
sm_config_set_sideset_pins(&c, pin_debug);
|
|
}
|
|
sm_config_set_in_pins(&c, pin_dp); // for WAIT, IN
|
|
sm_config_set_jmp_pin(&c, pin_dp); // for JMP
|
|
// Shift to right, autopull enabled, 8bit
|
|
sm_config_set_in_shift(&c, true, true, 8);
|
|
sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_RX);
|
|
pio_sm_init(pio, sm, offset, &c);
|
|
pio_sm_exec(pio, sm, pio_encode_mov_not(pio_osr, pio_null));
|
|
pio_sm_set_enabled(pio, sm, false);
|
|
}
|
|
static inline void eop_detect_fs_program_init(PIO pio, uint sm, uint offset,
|
|
uint pin_dp, uint pin_dm, bool is_fs, int pin_debug) {
|
|
pio_sm_config c;
|
|
if (pin_debug < 0) {
|
|
c = usb_edge_detector_program_get_default_config(offset);
|
|
} else {
|
|
c = usb_edge_detector_debug_program_get_default_config(offset);
|
|
pio_sm_set_pins_with_mask(pio, sm, 0, 1 << pin_debug);
|
|
pio_sm_set_pindirs_with_mask(pio, sm, 1 << pin_debug, 1 << pin_debug);
|
|
pio_gpio_init(pio, pin_debug);
|
|
sm_config_set_sideset_pins(&c, pin_debug);
|
|
}
|
|
sm_config_set_in_pins(&c, pin_dp); // for WAIT, IN
|
|
sm_config_set_jmp_pin(&c, pin_dm); // for JMP
|
|
sm_config_set_in_shift(&c, false, false, 8);
|
|
float div;
|
|
if (is_fs) {
|
|
div = (float)clock_get_hz(clk_sys) / (96000000);
|
|
} else {
|
|
div = (float)clock_get_hz(clk_sys) / (12000000);
|
|
}
|
|
sm_config_set_clkdiv(&c, div);
|
|
pio_sm_init(pio, sm, offset + 1, &c);
|
|
pio_sm_set_enabled(pio, sm, true);
|
|
}
|
|
|
|
#endif
|
|
|