diff --git a/src/cmd.c b/src/cmd.c index b21e9e1..01204ed 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -261,7 +261,7 @@ void parse_command(const uint8_t *s, uint8_t n) break; #ifdef HAVE_FPGA case 'O': - r = fpga_power(); + r = fpga_status(); if (bflg & 1) // "O1" power off fpga_power_off(); diff --git a/src/dose.py b/src/dose.py index e08cbe7..2707e61 100755 --- a/src/dose.py +++ b/src/dose.py @@ -1,6 +1,6 @@ #! /usr/bin/ipython3 --profile=thhor -import sys, time, getopt, fileinput, struct +import sys, os, time, getopt, fileinput, struct import uart from base85 import base85_encode, base85_decode from map import memmap @@ -383,18 +383,21 @@ class dose_cmd(uart.uart): self.cmd(c, page[16*i:16*(i+1)]) return self.cmd("B4 t+timeout: + if self._verbose: + print(f"write_pipe timeout {i=} {b=}", file=sys.stderr) + break + time.sleep(s) + s *= 2 + if s > 1: + s = 1 + if nn: + break + if parity and b==7: + self.cmd("B@4", page[8]) + if b >= len(page): + break + for j in range(4): + self.cmd(f"B{j}", page[b][16*j:16*(j+1)]) + if self._verbose >= 2: + self.peek("pipe", 11) + i += 1 + if n and i >= n: + break + if n and i >= n: + break + if nn: + break + if f: + f.close() + return i + + def fpga_config_p(self, filename="../fpga/quartus/thhor_crs.rbf"): + self.fpga_reset() + n = (os.stat(filename).st_size + 63) // 64 + self.pipe("CMD", "CONFIG", n=n*64) + self.write_pipe(filename, n=n) + def fix_page(self, page): if self.load_galois(): page = bch.fix_page(page) diff --git a/src/fpga.c b/src/fpga.c index fc01a79..9204ce5 100644 --- a/src/fpga.c +++ b/src/fpga.c @@ -30,7 +30,7 @@ void fpga_reset() nCONFIG_VPORT.OUT &=~ (1<>8, FS_Read|FS_528); + flash_start_stream(page, count >> 3, FS_Read|FS_528); } diff --git a/src/fpga.h b/src/fpga.h index 0e24b32..86096d2 100644 --- a/src/fpga.h +++ b/src/fpga.h @@ -27,7 +27,11 @@ void fpga_config(uint16_t page, uint16_t count); static inline uint8_t fpga_power() { return !!(PEN_VPORT.IN & (1<