better PIO dumper code

This commit is contained in:
Triss 2022-02-27 01:18:41 +01:00
parent 69ab51a5e1
commit 565d13b7d4
1 changed files with 17 additions and 7 deletions

View File

@ -4,12 +4,15 @@
#include <hardware/clocks.h>
#include <hardware/pio.h>
#include <hardware/pio_instructions.h>
#include <hardware/sync.h>
#include <hardware/timer.h>
#include "pio_sbw.h"
#include "sbw.pio.h"
static uint16_t pio_read_one(PIO pio, uint sm, uint32_t off) {
static uint16_t pio_read_one(PIO pio, uint sm, uint32_t off, int _) {
(void)_;
const int FREQ_SM = 500 * 1000; // 500 kHz
const int T_SM_US = 2; // 1/500 kHz = 2 us
@ -19,7 +22,8 @@ static uint16_t pio_read_one(PIO pio, uint sm, uint32_t off) {
pio_sm_config defcfg = pio_get_default_sm_config();
pio_sm_set_config(pio, sm, &defcfg);
// set clkdiv to something slow
pio_sm_set_clkdiv(pio, sm, 2*(float)clock_get_hz(clk_sys) / FREQ_SM);
//pio_sm_set_clkdiv(pio, sm, 2*(float)clock_get_hz(clk_sys) / FREQ_SM);
pio_sm_set_clkdiv_int_frac(pio, sm, 0, 0);
// clear PIO FIFOs
pio_sm_clear_fifos(pio, sm);
// clear debug flags
@ -35,15 +39,21 @@ static uint16_t pio_read_one(PIO pio, uint sm, uint32_t off) {
// exec jmp to offset
uint16_t jmp = pio_encode_jmp(off);
pio_sm_exec(pio, sm, jmp);
uint32_t irq = save_and_disable_interrupts();
// enable
pio_sm_set_enabled(pio, sm, true);
// wait 1 cycle
busy_wait_us_32(T_SM_US);
//busy_wait_us_32(T_SM_US);
pio_sm_clkdiv_restart(pio, sm);
// read SM insn
uint16_t ret = pio->sm[sm].instr;
// disable SM
pio_sm_set_enabled(pio, sm, false);
restore_interrupts(irq);
return ret;
}
@ -52,7 +62,7 @@ struct bin {
uint16_t noccur;
};
#define BINS 32 /* idk */
static uint16_t pio_get_one(PIO pio, uint sm, uint32_t off, int runs) {
/*static uint16_t pio_get_one(PIO pio, uint sm, uint32_t off, int runs) {
// there's some variability in the return value of pio_read_one, sometimes
// returning the next instruction. I don't know the exact reason, but a
// possible cause could be that the timing of the PIO instructions doesn't
@ -68,7 +78,7 @@ static uint16_t pio_get_one(PIO pio, uint sm, uint32_t off, int runs) {
}
for (int j = 0; j < runs; ++j) {
uint16_t v = pio_read_one(pio, sm, off);
uint16_t v = pio_read_one(pio, sm, off, 0);
for (int i = 0; i < BINS; ++i) {
if ((bins[i].value == v && bins[i].noccur > 0) || bins[i].noccur == 0) {
bins[i].value = v;
@ -87,7 +97,7 @@ static uint16_t pio_get_one(PIO pio, uint sm, uint32_t off, int runs) {
}
return bins[maxind].value;
}
}*/
extern int sbw_piosm;
void piodump_main(void) {
@ -99,7 +109,7 @@ void piodump_main(void) {
uint16_t stuff[32];
for (uint32_t i = 0; i < 32; ++i) {
stuff[i] = pio_get_one(PINOUT_SBW_PIO, (uint)sbw_piosm, i, 8);
stuff[i] = /*pio_get_one*/pio_read_one(PINOUT_SBW_PIO, (uint)sbw_piosm, i, 8);
bool good = stuff[i] == sbw_program_instructions[i];
printf("PIO_INSN[0x%02lx] = 0x%04x (%s)\n", i, stuff[i],
good ? "correct" : "wrong");