; SPDX-License-Identifier: MIT
; Copyright (c) 2023 Raspberry Pi Ltd

; 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);
}

%}
