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

// DAP interface says all pins have to be High-Z when disabled
static inline void probe_gpio_deinit()
{
#if defined(PROBE_PIN_RESET)
	gpio_deinit(PROBE_PIN_RESET);
	gpio_disable_pulls(PROBE_PIN_RESET);
#endif
	gpio_deinit(PROBE_PIN_SWCLK);
	gpio_disable_pulls(PROBE_PIN_SWCLK);
// Note for SWDIOEN - make sure the driver output enable is removed before removing drive - leave pull-up enabled
	gpio_deinit(PROBE_PIN_SWDIOEN);
	gpio_deinit(PROBE_PIN_SWDIO);
	gpio_disable_pulls(PROBE_PIN_SWDIO);
}

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

%}
