Here is what I came up with:
Code: Select all
--- a/os/hal/ports/RP/LLD/PIOv1/rp_pio.h
+++ b/os/hal/ports/RP/LLD/PIOv1/rp_pio.h
@@ -173,6 +173,72 @@
#define PIO_IRQ_SM(n) (1U << ((n) + 8U))
/** @} */
+/**
+ * @brief Do not assume a full Pico SDK is present
+ *
+ * Header files generated by pioasm check this define
+ */
+#ifndef PICO_NO_HARDWARE
+#define PICO_NO_HARDWARE 1
+#endif
+/** @} */
+
+/**
+ * @brief PIO assembler instruction definitions
+ */
+
+#define PIO_ASM_INSTRUCTION_Pos 13U
+#define PIO_ASM_INSTRUCTION_Msk (0x07U << PIO_ASM_INSTRUCTION_Pos)
+#define PIO_ASM_DELAY_SIDESET_Pos 8U
+#define PIO_ASM_DELAY_SIDESET_Msk (0x1FU << PIO_ASM_DELAY_SIDESET_Pos)
+
+#define PIO_ASM_INSTR_JMP (0U << PIO_ASM_INSTRUCTION_Pos)
+#define PIO_ASM_JMP_CONDITION_Pos 5U
+#define PIO_ASM_JMP_CONDITION_NONE (0U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_NOT_X (1U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_X_DEC (2U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_NOT_Y (3U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_Y_DEC (4U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_X_NE_Y (5U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_PIN (6U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_CONDITION_OSRE (7U << PIO_ASM_JMP_CONDITION_Pos)
+#define PIO_ASM_JMP_DST_Pos 0U
+#define PIO_ASM_JMP_DST_Msk (0x1FU << PIO_ASM_JMP_DST_Pos)
+
+#define PIO_ASM_INSTR_WAIT (1U << PIO_ASM_INSTRUCTION_Pos)
+#define PIO_ASM_WAIT_POLARITY (1U << 7U)
+#define PIO_ASM_WAIT_SRC_Pos 5U
+#define PIO_ASM_WAIT_SRC_GPIO (0U << PIO_ASM_WAIT_SRC_Pos)
+#define PIO_ASM_WAIT_SRC_PIN (1U << PIO_ASM_WAIT_SRC_Pos)
+#define PIO_ASM_WAIT_SRC_IRQ (2U << PIO_ASM_WAIT_SRC_Pos)
+#define PIO_ASM_WAIT_SRC_JMPPIN (3U << PIO_ASM_WAIT_SRC_Pos)
+#define PIO_ASM_WAIT_INDEX_Pos 0U
+#define PIO_ASM_WAIT_INDEX_Msk (0x1FU << PIO_ASM_WAIT_INDEX_Pos)
+
+// TODO: continue for the other instructions
+
+/** @} */
+
+/**
+ * @brief PIO assembler instruction helpers
+ */
+#define PIO_ASM_JMP(delay_sideset, condition, destination) \
+ (PIO_ASM_INSTR_JMP | \
+ ((delay_sideset) << PIO_ASM_DELAY_SIDESET_Pos) | \
+ (condition) | (destination))
+
+#define PIO_ASM_WAIT(delay_sideset, polarity, source, index) \
+ (PIO_ASM_INSTR_WAIT | \
+ ((delay_sideset) << PIO_ASM_DELAY_SIDESET_Pos) | \
+ (polarity) | (source) | (index))
+
+
+// TODO: continue for the other instructions
+
+/** @} */
+
Code: Select all
// always jump to offset zero
pioSmExecX(sm_ptr, PIO_ASM_JMP(0, PIO_ASM_JMP_CONDITION_NONE, 0));