usb_tx.pio.h
1 // -------------------------------------------------- // 2 // This file is autogenerated by pioasm; do not edit! // 3 // -------------------------------------------------- // 4 5 #pragma once 6 7 #if !PICO_NO_HARDWARE 8 #include "hardware/pio.h" 9 #endif 10 11 #define IRQ_TX_EOP 0 12 13 // ----------- // 14 // usb_tx_dpdm // 15 // ----------- // 16 17 #define usb_tx_dpdm_wrap_target 1 18 #define usb_tx_dpdm_wrap 4 19 20 static const uint16_t __not_in_flash("tx_program") usb_tx_dpdm_program_instructions[] = { 21 0xc700, // 0: irq nowait 0 side 0 [7] 22 // .wrap_target 23 0x6ba2, // 1: out pc, 2 side 1 [3] 24 0xeb80, // 2: set pindirs, 0 side 1 [3] 25 0x73a2, // 3: out pc, 2 side 2 [3] 26 0xe883, // 4: set pindirs, 3 side 1 27 // .wrap 28 }; 29 30 #if !PICO_NO_HARDWARE 31 static const struct pio_program __not_in_flash("tx_program") usb_tx_dpdm_program = { 32 .instructions = usb_tx_dpdm_program_instructions, 33 .length = 5, 34 .origin = -1, 35 }; 36 37 static inline pio_sm_config usb_tx_dpdm_program_get_default_config(uint offset) { 38 pio_sm_config c = pio_get_default_sm_config(); 39 sm_config_set_wrap(&c, offset + usb_tx_dpdm_wrap_target, offset + usb_tx_dpdm_wrap); 40 sm_config_set_sideset(&c, 2, false, false); 41 return c; 42 } 43 #endif 44 45 // --------------- // 46 // usb_tx_pre_dpdm // 47 // --------------- // 48 49 #define usb_tx_pre_dpdm_wrap_target 1 50 #define usb_tx_pre_dpdm_wrap 4 51 52 static const uint16_t __not_in_flash("tx_program") usb_tx_pre_dpdm_program_instructions[] = { 53 0xcf00, // 0: irq nowait 0 side 1 [7] 54 // .wrap_target 55 0x6ba2, // 1: out pc, 2 side 1 [3] 56 0xeb80, // 2: set pindirs, 0 side 1 [3] 57 0x73a2, // 3: out pc, 2 side 2 [3] 58 0xe883, // 4: set pindirs, 3 side 1 59 // .wrap 60 }; 61 62 #if !PICO_NO_HARDWARE 63 static const struct pio_program __not_in_flash("tx_program") usb_tx_pre_dpdm_program = { 64 .instructions = usb_tx_pre_dpdm_program_instructions, 65 .length = 5, 66 .origin = -1, 67 }; 68 69 static inline pio_sm_config usb_tx_pre_dpdm_program_get_default_config(uint offset) { 70 pio_sm_config c = pio_get_default_sm_config(); 71 sm_config_set_wrap(&c, offset + usb_tx_pre_dpdm_wrap_target, offset + usb_tx_pre_dpdm_wrap); 72 sm_config_set_sideset(&c, 2, false, false); 73 return c; 74 } 75 #endif 76 77 // ----------- // 78 // usb_tx_dmdp // 79 // ----------- // 80 81 #define usb_tx_dmdp_wrap_target 1 82 #define usb_tx_dmdp_wrap 4 83 84 static const uint16_t __not_in_flash("tx_program") usb_tx_dmdp_program_instructions[] = { 85 0xc700, // 0: irq nowait 0 side 0 [7] 86 // .wrap_target 87 0x73a2, // 1: out pc, 2 side 2 [3] 88 0xf380, // 2: set pindirs, 0 side 2 [3] 89 0x6ba2, // 3: out pc, 2 side 1 [3] 90 0xf083, // 4: set pindirs, 3 side 2 91 // .wrap 92 }; 93 94 #if !PICO_NO_HARDWARE 95 static const struct pio_program __not_in_flash("tx_program") usb_tx_dmdp_program = { 96 .instructions = usb_tx_dmdp_program_instructions, 97 .length = 5, 98 .origin = -1, 99 }; 100 101 static inline pio_sm_config usb_tx_dmdp_program_get_default_config(uint offset) { 102 pio_sm_config c = pio_get_default_sm_config(); 103 sm_config_set_wrap(&c, offset + usb_tx_dmdp_wrap_target, offset + usb_tx_dmdp_wrap); 104 sm_config_set_sideset(&c, 2, false, false); 105 return c; 106 } 107 #endif 108 109 // --------------- // 110 // usb_tx_pre_dmdp // 111 // --------------- // 112 113 #define usb_tx_pre_dmdp_wrap_target 1 114 #define usb_tx_pre_dmdp_wrap 4 115 116 static const uint16_t __not_in_flash("tx_program") usb_tx_pre_dmdp_program_instructions[] = { 117 0xd700, // 0: irq nowait 0 side 2 [7] 118 // .wrap_target 119 0x73a2, // 1: out pc, 2 side 2 [3] 120 0xf380, // 2: set pindirs, 0 side 2 [3] 121 0x6ba2, // 3: out pc, 2 side 1 [3] 122 0xf083, // 4: set pindirs, 3 side 2 123 // .wrap 124 }; 125 126 #if !PICO_NO_HARDWARE 127 static const struct pio_program __not_in_flash("tx_program") usb_tx_pre_dmdp_program = { 128 .instructions = usb_tx_pre_dmdp_program_instructions, 129 .length = 5, 130 .origin = -1, 131 }; 132 133 static inline pio_sm_config usb_tx_pre_dmdp_program_get_default_config(uint offset) { 134 pio_sm_config c = pio_get_default_sm_config(); 135 sm_config_set_wrap(&c, offset + usb_tx_pre_dmdp_wrap_target, offset + usb_tx_pre_dmdp_wrap); 136 sm_config_set_sideset(&c, 2, false, false); 137 return c; 138 } 139 140 #include "hardware/clocks.h" 141 #include "sdk_compat.h" 142 static void __no_inline_not_in_flash_func(usb_tx_configure_pins)(PIO pio, uint sm, uint pin_dp, uint pin_dm) { 143 if (pin_dp < pin_dm) { 144 pio_sm_set_out_pins(pio, sm, pin_dp, 2); 145 pio_sm_set_set_pins(pio, sm, pin_dp, 2); 146 pio_sm_set_sideset_pins(pio, sm, pin_dp); 147 } else { 148 pio_sm_set_out_pins(pio, sm, pin_dm, 2); 149 pio_sm_set_set_pins(pio, sm, pin_dm, 2); 150 pio_sm_set_sideset_pins(pio, sm, pin_dm); 151 } 152 } 153 static inline void usb_tx_fs_program_init(PIO pio, uint sm, uint offset, 154 uint pin_dp, uint pin_dm) { 155 pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dp), ((1ull << pin_dp) | (1ull << pin_dm))); 156 gpio_pull_down(pin_dp); 157 gpio_pull_down(pin_dm); 158 pio_gpio_init(pio, pin_dp); 159 pio_gpio_init(pio, pin_dm); 160 pio_sm_config c = usb_tx_dpdm_program_get_default_config(offset); 161 // shifts to left, autopull, 8bit 162 sm_config_set_out_shift(&c, false, true, 8); 163 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); 164 // run at 48MHz 165 // clk_sys should be multiply of 12MHz 166 float div = (float)clock_get_hz(clk_sys) / (48000000UL); 167 sm_config_set_clkdiv(&c, div); 168 pio_sm_init(pio, sm, offset + 1, &c); 169 usb_tx_configure_pins(pio, sm, pin_dp, pin_dm); 170 pio_sm_set_enabled(pio, sm, true); 171 } 172 static inline void usb_tx_ls_program_init(PIO pio, uint sm, uint offset, 173 uint pin_dp, uint pin_dm) { 174 pio_sm_set_pins_with_mask64(pio, sm, (1ull << pin_dm), ((1ull << pin_dp) | (1ull << pin_dm))); 175 gpio_pull_down(pin_dp); 176 gpio_pull_down(pin_dm); 177 pio_gpio_init(pio, pin_dp); 178 pio_gpio_init(pio, pin_dm); 179 pio_sm_config c = usb_tx_dmdp_program_get_default_config(offset); 180 // shifts to left, autopull, 8bit 181 sm_config_set_out_shift(&c, false, true, 8); 182 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX); 183 // run at 6MHz 184 // clk_sys should be multiply of 12MHz 185 float div = (float)clock_get_hz(clk_sys) / (6000000UL); 186 sm_config_set_clkdiv(&c, div); 187 pio_sm_init(pio, sm, offset + 1, &c); 188 usb_tx_configure_pins(pio, sm, pin_dp, pin_dm); 189 pio_sm_set_enabled(pio, sm, true); 190 } 191 192 #endif 193