// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //

#pragma once

#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif

// -------- //
// mclk_pio //
// -------- //

#define mclk_pio_wrap_target 0
#define mclk_pio_wrap 4
#define mclk_pio_pio_version 1

static const uint16_t mclk_pio_program_instructions[] = {
            //     .wrap_target
    0xe001, //  0: set    pins, 1
    0xa042, //  1: nop
    0xe000, //  2: set    pins, 0
    0xa042, //  3: nop
    0x0000, //  4: jmp    0
            //     .wrap
};

#if !PICO_NO_HARDWARE
static const struct pio_program mclk_pio_program = {
    .instructions = mclk_pio_program_instructions,
    .length = 5,
    .origin = -1,
    .pio_version = mclk_pio_pio_version,
#if PICO_PIO_VERSION > 0
    .used_gpio_ranges = 0x0
#endif
};

static inline pio_sm_config mclk_pio_program_get_default_config(uint offset) {
    pio_sm_config c = pio_get_default_sm_config();
    sm_config_set_wrap(&c, offset + mclk_pio_wrap_target, offset + mclk_pio_wrap);
    return c;
}
#endif

// --------- //
// audio_pio //
// --------- //

#define audio_pio_wrap_target 0
#define audio_pio_wrap 17
#define audio_pio_pio_version 1

static const uint16_t audio_pio_program_instructions[] = {
            //     .wrap_target
    0x80a0, //  0: pull   block
    0x2085, //  1: wait   1 gpio, 5
    0x80a0, //  2: pull   block
    0x2005, //  3: wait   0 gpio, 5
    0x2084, //  4: wait   1 gpio, 4
    0xe02f, //  5: set    x, 15
    0x2004, //  6: wait   0 gpio, 4
    0x6001, //  7: out    pins, 1
    0x2084, //  8: wait   1 gpio, 4
    0x0046, //  9: jmp    x--, 6
    0x2085, // 10: wait   1 gpio, 5
    0x2084, // 11: wait   1 gpio, 4
    0xe02f, // 12: set    x, 15
    0x2004, // 13: wait   0 gpio, 4
    0x6001, // 14: out    pins, 1
    0x2084, // 15: wait   1 gpio, 4
    0x004d, // 16: jmp    x--, 13
    0x0002, // 17: jmp    2
            //     .wrap
};

#if !PICO_NO_HARDWARE
static const struct pio_program audio_pio_program = {
    .instructions = audio_pio_program_instructions,
    .length = 18,
    .origin = -1,
    .pio_version = audio_pio_pio_version,
#if PICO_PIO_VERSION > 0
    .used_gpio_ranges = 0x1
#endif
};

static inline pio_sm_config audio_pio_program_get_default_config(uint offset) {
    pio_sm_config c = pio_get_default_sm_config();
    sm_config_set_wrap(&c, offset + audio_pio_wrap_target, offset + audio_pio_wrap);
    return c;
}
#endif

// -------- //
// read_pio //
// -------- //

#define read_pio_wrap_target 0
#define read_pio_wrap 15
#define read_pio_pio_version 1

static const uint16_t read_pio_program_instructions[] = {
            //     .wrap_target
    0x2085, //  0: wait   1 gpio, 5
    0x2005, //  1: wait   0 gpio, 5
    0x2084, //  2: wait   1 gpio, 4
    0xe02f, //  3: set    x, 15
    0x2004, //  4: wait   0 gpio, 4
    0x2084, //  5: wait   1 gpio, 4
    0x4001, //  6: in     pins, 1
    0x0044, //  7: jmp    x--, 4
    0x2085, //  8: wait   1 gpio, 5
    0x2084, //  9: wait   1 gpio, 4
    0xe02f, // 10: set    x, 15
    0x2004, // 11: wait   0 gpio, 4
    0x2084, // 12: wait   1 gpio, 4
    0x4001, // 13: in     pins, 1
    0x004b, // 14: jmp    x--, 11
    0x0001, // 15: jmp    1
            //     .wrap
};

#if !PICO_NO_HARDWARE
static const struct pio_program read_pio_program = {
    .instructions = read_pio_program_instructions,
    .length = 16,
    .origin = -1,
    .pio_version = read_pio_pio_version,
#if PICO_PIO_VERSION > 0
    .used_gpio_ranges = 0x1
#endif
};

static inline pio_sm_config read_pio_program_get_default_config(uint offset) {
    pio_sm_config c = pio_get_default_sm_config();
    sm_config_set_wrap(&c, offset + read_pio_wrap_target, offset + read_pio_wrap);
    return c;
}

static inline void mclk_pio_program_init(PIO pio, uint sm, uint offset, uint mclk_pin) {
    pio_sm_config sm_config = mclk_pio_program_get_default_config(offset);
    sm_config_set_out_pins(&sm_config, mclk_pin, 1);
    sm_config_set_set_pins(&sm_config, mclk_pin, 1);
    pio_sm_init(pio, sm, offset, &sm_config);
    uint pin_mask = (1u << mclk_pin);
    pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask);
    pio_sm_set_pins(pio, sm, 0); // clear pins
    pio_gpio_init(pio, mclk_pin);
}
static inline void audio_pio_program_init(PIO pio, uint sm, uint offset, uint data_pin, uint lrckl_pin) {
    pio_sm_config sm_config = audio_pio_program_get_default_config(offset);
    sm_config_set_out_pins(&sm_config, data_pin, 1);
    sm_config_set_out_shift(&sm_config, false, false, 32);
    pio_sm_init(pio, sm, offset, &sm_config);
    uint pin_mask = (1u << data_pin) | (3u << (lrckl_pin-1));
    uint pin_dirs = (1u << data_pin) | (0u << lrckl_pin) | (0u << (lrckl_pin-1));
    pio_sm_set_pindirs_with_mask(pio, sm, pin_dirs, pin_mask);
    pio_gpio_init(pio, data_pin);
    pio_gpio_init(pio, lrckl_pin);
    pio_gpio_init(pio, lrckl_pin-1);
}
static inline void read_pio_program_init(PIO pio, uint sm, uint offset, uint read_pin, uint lrckl_pin) {
    pio_sm_config sm_config = read_pio_program_get_default_config(offset);
    sm_config_set_in_pins(&sm_config, read_pin);
    sm_config_set_in_shift(&sm_config, false, true, 32);
    sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_RX);
    pio_sm_init(pio, sm, offset, &sm_config);
    uint pin_mask = (1u << read_pin) | (3u << (lrckl_pin-1));
    uint pin_dirs = (0u << read_pin) | (0u << lrckl_pin) | (0u << (lrckl_pin-1));
    pio_sm_set_pindirs_with_mask(pio, sm, pin_dirs, pin_mask);
    pio_gpio_init(pio, read_pin);
    pio_gpio_init(pio, lrckl_pin);
    pio_gpio_init(pio, lrckl_pin-1);
}

#endif

