; Output-enable active-low variant of the SWD probe

; This program is very similar to the one in probe.pio. The only difference is
; that here write_cmd and turnaround_cmd are split into two separate routines,
; whose difference is OEn being high/low.

; SWDIO_OEn is pin 0, SWCLK pin 1, SWDIO (out) pin 2, SWDI (in) pin 3.
; Pin 0 and 1 are sideset pins

.program probe
.side_set 2 opt

public turnaround_cmd:
    pull
turnaround_bitloop:
    nop                         [1]  side 0x1
    jmp x-- turnaround_bitloop  [1]  side 0x3
    jmp get_next_cmd

public write_cmd:
    pull
write_bitloop:
    out pins, 1                 [1]  side 0x0   ; Data is output by host on negedge
    jmp x-- write_bitloop       [1]  side 0x2   ; ...and captured by target on posedge
                                                ; Fall through to next command
.wrap_target
public get_next_cmd:
    pull                             side 0x1   ; SWCLK initially low, OEn disabled
    out x, 8                                    ; Get bit count
    out pindirs, 1                              ; Set SWDIO direction
    out pc, 5                                   ; Go to command routine

read_bitloop:
    nop                                         ; Additional delay on taken loop branch
public read_cmd:
    in pins, 1                  [1]  side 0x3   ; Data is captured by host on posedge
    jmp x-- read_bitloop             side 0x1
    push
.wrap                                           ; Wrap to next command


; Implement probe_gpio_init() and probe_sm_init() methods here - set pins, offsets, sidesets etc
% c-sdk {

static inline void probe_gpio_init()
{
#if defined(PROBE_PIN_RESET)
    // Target reset pin: pull up, input to emulate open drain pin
    gpio_pull_up(PROBE_PIN_RESET);
    // gpio_init will leave the pin cleared and set as input
    gpio_init(PROBE_PIN_RESET);
#endif
    // Funcsel pins
    pio_gpio_init(pio0, PROBE_PIN_SWDIOEN);
    pio_gpio_init(pio0, PROBE_PIN_SWCLK);
    pio_gpio_init(pio0, PROBE_PIN_SWDIO);

    // Make sure SWDIO has a pullup on it. Idle state is high
    gpio_pull_up(PROBE_PIN_SWDIO);
    gpio_pull_up(PROBE_PIN_SWDIOEN);
}

static inline void probe_sm_init(pio_sm_config* sm_config) {

    // Set SWDIOEN and SWCLK as sideset pins
    sm_config_set_sideset_pins(sm_config, PROBE_PIN_SWDIOEN);

    // Set SWDIO offset
    sm_config_set_out_pins(sm_config, PROBE_PIN_SWDIO, 1);
    sm_config_set_set_pins(sm_config, PROBE_PIN_SWDIO, 1);
    sm_config_set_in_pins(sm_config, PROBE_PIN_SWDI);

    // Set SWDIOEN, SWD and SWDIO pins as output to start. This will be set in the sm
    pio_sm_set_consecutive_pindirs(pio0, PROBE_SM, PROBE_PIN_OFFSET, 3, true);

    // shift output right, autopull off, autopull threshold
    sm_config_set_out_shift(sm_config, true, false, 0);
    // shift input right as swd data is lsb first, autopush off
    sm_config_set_in_shift(sm_config, true, false, 0);
}

%}
