Kaynağa Gözat

update: get closer to a working JTAG update infrastructure

- Make it possible to build FPGA images differing only in SRAM
  payload without needing to re-run the mapper and fitter.

- Written-compiled-but-not-debugged JTAG flash FPGA firmware
H. Peter Anvin 3 yıl önce
ebeveyn
işleme
6375646603

+ 15 - 16
fpga/.gitignore

@@ -1,20 +1,19 @@
-output/*.bin
-output/*.jam
-output/*.map
-output/*.jdi
-output/*.pof
-output/*.jbc
-output/*.sld
-output/*.htm*
-output/*.cof
-output/*.svf
-output/*.rbf
-output/*.rpd
-output/*.xsvf
-output/v?boot.jic
-output/v?boot.pof
-output/v?boot.rpd*
 output_files/
+var/
+mif/
+*.bin
+*.jam
+*.map
+*.jdi
+*.pof
+*.jbc
+*.sld
+*.htm*
+*.cof
+*.svf
+*.rbf
+*.rpd
+*.xsvf
 *.cdf
 *.stp
 .qsys_edit

+ 40 - 14
fpga/Makefile

@@ -1,7 +1,8 @@
 MAKEFLAGS      += -R -r
 
 PROJECT		= max80
-REVISIONS	= v1 v2 v2boot
+REVISIONS	= v1 v2
+VARIANTS        = jtagupd
 QU        	= quartus
 
 # Common options for all Quartus tools
@@ -20,6 +21,7 @@ QASM    	= $(QU)_asm $(QOPT)
 QPOW    	= $(QU)_pow $(QOPT)
 
 outdir		= output
+mifdir		= mif
 
 PERL		= perl
 PYTHON		= python
@@ -27,15 +29,17 @@ SED		= sed
 GZIP		= gzip
 
 SUBDIRS     = usb
-PREREQFILES = $(outdir)/sram.mif \
+PREREQFILES = $(mifdir)/sram.mif \
 	      $(foreach rev,$(REVISIONS),$(foreach coffmt,jic pof, \
 		$(outdir)/$(rev).$(coffmt).cof))
 
 alltarg := sof pof jic svf svf.gz xsvf xsvf.gz rbf rbf.gz \
 	   rpd rpd.gz pow.rpt sta.rpt
 allout   = $(foreach o,$(alltarg),$(outdir)/$(1).$(o))
+vartarg := sof svf svf.gz rbf rbf.gz
+varout   = $(foreach o,$(vartarg),$(outdir)/$(1).$(o))
 
-sram_src = ../rv32/boot.bin
+sram_src = ../rv32/
 
 .SUFFIXES:
 
@@ -45,9 +49,10 @@ sram_src = ../rv32/boot.bin
 
 all:
 	$(MAKE) prereq
-	$(MAKE) $(foreach rev,$(REVISIONS),$(rev).targets)
+	$(MAKE) $(REVISIONS:=.targets)
+	$(MAKE) $(VARIANTS)
 
--include $(foreach rev,$(REVISIONS),$(rev).deps)
+-include $(REVISIONS:=.deps)
 
 .PHONY: $(REVISIONS)
 $(REVISIONS):
@@ -58,20 +63,40 @@ $(REVISIONS):
 %.targets:
 	$(MAKE) $(call allout,$*)
 
-$(outdir)/%.map.rpt: %.qsf | $(outdir)/sram.bin
+.PHONY: $(VARIANTS)
+$(VARIANTS):
+	$(MAKE) $@.variant
+
+.PHONY: %.vtargets
+%.vtargets:
+	$(MAKE) --old-file=$(outdir)/$*.fit.rpt $(call varout,$*)
+
+.PHONY: %.variant
+%.variant: mif/%.mif $(foreach rev,$(REVISIONS),$(outdir)/$(rev).fit.rpt)
+	-rm -rf var/$*
+	mkdir -p var/$* var/$*/mif $(outdir)/$*
+	ln *.qpf *.qsf Makefile *.deps var/$*/
+	ln $< var/$*/mif/sram.mif
+	( cd var/$* && ln -s ../../db ../../incremental_db . )
+	( cd var/$* && ln -s ../../$(outdir)/$* ./output )
+	$(MAKE) -C var/$* -f ../../Makefile -I ../.. \
+		$(REVISIONS:=.vtargets)
+
+$(outdir)/%.map.rpt: %.qsf | $(mifdir)/sram.mif
 	$(QMAP) $(PROJECT) -c $*
 
 $(outdir)/%.fit.rpt: $(outdir)/%.map.rpt
 	$(QFIT) $(PROJECT) -c $*
 
-$(outdir)/sram.bin: $(sram_src) $(all_map_deps)
+$(mifdir)/%.bin: $(sram_src)/%.bin $(all_map_deps)
 	LC_ALL=C date | tr '\n' '\0' | cat $< - > $@
 
 sram_depth  := 8192
 sram_width  := 32
 sram_stride := 1
-$(outdir)/%.mif: $(outdir)/%.bin ../tools/bin2mif.pl
-	$(PERL) ../tools/bin2mif.pl $< $@ $($*_depth) $($*_width) $($*_stride)
+$(mifdir)/%.mif: $(mifdir)/%.bin ../tools/bin2mif.pl
+	$(PERL) ../tools/bin2mif.pl $< $@ \
+		$(sram_depth) $(sram_width) $(sram_stride)
 
 $(outdir)/%.mif_update.rpt: $(outdir)/%.fit.rpt
 	[ -z '$($*_asm_deps)' ] || $(QCDB) --update_mif $(PROJECT) -c $*
@@ -118,10 +143,11 @@ $(outdir)/%.gz: $(outdir)/%
 	$(GZIP) -9 < $< > $@
 
 # Prerequisite directories and files
+.PHONY: prereq
 prereq:
-	mkdir -p $(outdir)
-	$(MAKE) $(PREREQFILES)
+	mkdir -p $(outdir) $(mifdir)
 	for d in $(SUBDIRS); do $(MAKE) -C $$d; done
+	$(MAKE) $(PREREQFILES)
 
 # Clean out SignalTap
 signalclean:
@@ -148,8 +174,8 @@ flash-%: $(outdir)/%.jic
 
 clean:
 	for d in $(SUBDIRS); do $(MAKE) -C $$d clean; done
-	rm -rf db incremental_db simulation/modelsim \
-	greybox_tmp */greybox_tmp iodevs.vh output_files
+	rm -rf db incremental_db var simulation/modelsim \
+	greybox_tmp */greybox_tmp iodevs.vh output_files $(mifdir)
 	for d in $(REVISIONS); do \
 		$$d/*.rpt $$d/*.rpt $$d/*.summary $$d/*.smsg  \
 		$$d/*.htm $$d/*.htm_files $$d/*.map $$d/*.eqn $$d/*.sld \
@@ -158,7 +184,7 @@ clean:
 
 spotless:
 	for d in $(SUBDIRS); do $(MAKE) -C $$d spotless; done
-	rm -rf $(outdir) *.deps *~ \#*~
+	rm -rf $(outdir) $(mifdir) *.deps *~ \#*~
 
 iodevs.vh: ../iodevs.conf ../tools/iodevs.pl
 	$(PERL) ../tools/iodevs.pl v $< $@

+ 2 - 4
fpga/max80.qpf

@@ -19,16 +19,14 @@
 #
 # Quartus Prime
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
-# Date created = 00:52:55  February 10, 2022
+# Date created = 23:11:40  February 13, 2022
 #
 # -------------------------------------------------------------------------- #
 
 QUARTUS_VERSION = "21.1"
-DATE = "00:52:55  February 10, 2022"
+DATE = "23:11:40  February 13, 2022"
 
 # Revisions
 
 PROJECT_REVISION = "v1"
-PROJECT_REVISION = "v2boot"
 PROJECT_REVISION = "v2"
-PROJECT_REVISION = "v2alt"

+ 1 - 2
fpga/max80.qsf

@@ -217,9 +217,8 @@ set_global_assignment -name SYSTEMVERILOG_FILE sysclock.sv
 set_global_assignment -name SYSTEMVERILOG_FILE i2c.sv
 set_global_assignment -name SYSTEMVERILOG_FILE abcbus.sv
 set_global_assignment -name VERILOG_FILE ip/abcmapram.v
-set_global_assignment -name VERILOG_FILE ip/fastmem_ip.v
 set_global_assignment -name SYSTEMVERILOG_FILE fast_mem.sv
-set_global_assignment -name MIF_FILE output/sram.mif
+set_global_assignment -name MIF_FILE mif/sram.mif
 set_global_assignment -name VERILOG_FILE picorv32.v
 set_global_assignment -name SYSTEMVERILOG_FILE functions.sv
 set_global_assignment -name SYSTEMVERILOG_FILE spi_master.sv

+ 1 - 1
fpga/max80.sv

@@ -567,7 +567,7 @@ module max80
    wire [31:0] 		vjtag_sram_wdata;
 
    fast_mem #(.words_lg2(SRAM_BITS-2),
-	      .data_file("output/sram.mif"))
+	      .data_file("mif/sram.mif"))
    fast_mem(
 	    .rst_n ( rst_n ),
 	    .clk   ( sys_clk ),

BIN
fpga/output/jtagupd/v1.rbf.gz


BIN
fpga/output/jtagupd/v1.sof


BIN
fpga/output/jtagupd/v1.svf.gz


BIN
fpga/output/jtagupd/v2.rbf.gz


BIN
fpga/output/jtagupd/v2.sof


BIN
fpga/output/jtagupd/v2.svf.gz


+ 0 - 1759
fpga/output/sram.mif

@@ -1,1759 +0,0 @@
--- generated from output/sram.bin
-DEPTH = 8192;
-WIDTH = 32;
-ADDRESS_RADIX = HEX;
-DATA_RADIX = HEX;
-CONTENT BEGIN
-0000 : 00000000;
-0001 : 00000000;
-0002 : F0181CE9;
-0003 : 00200000;
-0004 : C0102473;
-0005 : 00008137;
-0006 : 2880006F;
-0007 : 00000000;
-0008 : 0001210B;
-0009 : 008DF413;
-000A : 00040863;
-000B : 319000EF;
-000C : 408D8DB3;
-000D : 060D8063;
-000E : 00000493;
-000F : 0FFDF293;
-0010 : 00029663;
-0011 : 008DDD93;
-0012 : 02048493;
-0013 : 00FDF293;
-0014 : 00029663;
-0015 : 004DDD93;
-0016 : 01048493;
-0017 : 003DF293;
-0018 : 00029663;
-0019 : 002DDD93;
-001A : 00848493;
-001B : 001DF293;
-001C : 00029663;
-001D : 001DDD93;
-001E : 00448493;
-001F : 0024D513;
-0020 : 000D0593;
-0021 : 0B0480E7;
-0022 : 001DDD93;
-0023 : 00448493;
-0024 : FA0D96E3;
-0025 : 30200073;
-0026 : 00000000;
-0027 : 00000013;
-0028 : 00008067;
-0029 : 0000250B;
-002A : 0005B00B;
-002B : 00000000;
-002C : 1230006F;
-002D : 5880006F;
-002E : 5780006F;
-002F : 2890006F;
-0030 : 5880006F;
-0031 : 10F0006F;
-0032 : 7D80106F;
-0033 : 1070006F;
-0034 : 1030006F;
-0035 : 1470006F;
-0036 : 0FB0006F;
-0037 : 0F70006F;
-0038 : 0F30006F;
-0039 : 0EF0006F;
-003A : 0EB0006F;
-003B : 00000000;
-003C : 7C5C2D2F;
-003D : 4101D0A0;
-003E : FFFFFFFF;
-003F : FFFFFFFF;
-0040 : 00001AD0;
-0041 : 00000040;
-0042 : 00000000;
-0043 : 00000000;
-0044 : 00000000;
-0045 : 00000000;
-0046 : 00000000;
-0047 : 00000000;
-0048 : 00000000;
-0049 : 00000000;
-004A : 00000000;
-004B : 00000000;
-004C : 00000000;
-004D : 00000000;
-004E : 00000000;
-004F : 00000000;
-0050 : 00000000;
-0051 : 00000000;
-0052 : 00000000;
-0053 : 00000000;
-0054 : 00000000;
-0055 : 00000000;
-0056 : 00000000;
-0057 : 00000000;
-0058 : 00000000;
-0059 : 00000000;
-005A : 00000000;
-005B : 00000000;
-005C : 00000000;
-005D : 00000000;
-005E : 00000000;
-005F : 00000000;
-0060 : 00000000;
-0061 : 00000000;
-0062 : 00000000;
-0063 : 00000000;
-0064 : 00000000;
-0065 : 00000000;
-0066 : 00000000;
-0067 : 00000000;
-0068 : 00000000;
-0069 : 00000000;
-006A : 00000000;
-006B : 00000000;
-006C : 00000000;
-006D : 00000000;
-006E : 00000000;
-006F : 00000000;
-0070 : 00000000;
-0071 : 00000000;
-0072 : 00000000;
-0073 : 00000000;
-0074 : 00000000;
-0075 : 00000000;
-0076 : 00000000;
-0077 : 00000000;
-0078 : 00000000;
-0079 : 00000000;
-007A : 00000000;
-007B : 00000000;
-007C : 00000000;
-007D : 00000000;
-007E : 00000000;
-007F : 00000000;
-0080 : 00000000;
-0081 : 00000000;
-0082 : 00000000;
-0083 : 00000000;
-0084 : 00000000;
-0085 : 00000000;
-0086 : 00000000;
-0087 : 00000000;
-0088 : 00000000;
-0089 : 00000000;
-008A : 00000000;
-008B : 00000000;
-008C : 00000000;
-008D : 00000000;
-008E : 00000000;
-008F : 00000000;
-0090 : 00000000;
-0091 : 00000000;
-0092 : 00000000;
-0093 : 00000000;
-0094 : 00000000;
-0095 : 00000000;
-0096 : 00000000;
-0097 : 00000000;
-0098 : 00000000;
-0099 : 00000000;
-009A : 00000000;
-009B : 00000000;
-009C : 00000000;
-009D : 00000000;
-009E : 00000000;
-009F : 00000000;
-00A0 : 00000000;
-00A1 : 00000000;
-00A2 : 00000000;
-00A3 : 00000000;
-00A4 : 00000000;
-00A5 : 00000000;
-00A6 : 00000000;
-00A7 : 00000000;
-00A8 : FFF04293;
-00A9 : 0602800B;
-00AA : 00000193;
-00AB : 0001A18B;
-00AC : 12000513;
-00AD : 2A000593;
-00AE : 00052023;
-00AF : 00052223;
-00B0 : 00052423;
-00B1 : 00052623;
-00B2 : 00052823;
-00B3 : 00052A23;
-00B4 : 00052C23;
-00B5 : 00052E23;
-00B6 : 02050513;
-00B7 : FCB56EE3;
-00B8 : 12802023;
-00B9 : 0040006F;
-00BA : CE061101;
-00BB : CA26CC22;
-00BC : C64EC84A;
-00BD : C256C452;
-00BE : 2659C05A;
-00BF : 16204283;
-00C0 : 00028663;
-00C1 : 40007097;
-00C2 : C42080E7;
-00C3 : 400074B7;
-00C4 : 40007937;
-00C5 : 5AFD4981;
-00C6 : F9848493;
-00C7 : 00F90913;
-00C8 : 40007A37;
-00C9 : 0750008B;
-00CA : 0810878B;
-00CB : 16304303;
-00CC : 00030663;
-00CD : 40001097;
-00CE : 688080E7;
-00CF : 37F000EF;
-00D0 : 89C02403;
-00D1 : FE89F0E3;
-00D2 : 00845393;
-00D3 : 0FF47593;
-00D4 : 93638626;
-00D5 : 864A0003;
-00D6 : FA2A0513;
-00D7 : 40001097;
-00D8 : 384080E7;
-00D9 : BF7D89A2;
-00DA : 00000697;
-00DB : D3468693;
-00DC : 897D4690;
-00DD : 8E49053E;
-00DE : 8682C290;
-00DF : 00000697;
-00E0 : D2068693;
-00E1 : 897D46D0;
-00E2 : 8E49051E;
-00E3 : 8682C290;
-00E4 : F713C25D;
-00E5 : 17930FF5;
-00E6 : E2B30107;
-00E7 : 931300E7;
-00E8 : 76930082;
-00E9 : 63B30015;
-00EA : 87AA0053;
-00EB : 4805EAC9;
-00EC : 08C87163;
-00ED : 0027F893;
-00EE : 08089F63;
-00EF : F6634EFD;
-00F0 : 0F1308CE;
-00F1 : 7F93FE06;
-00F2 : 8F13FE0F;
-00F3 : 87330207;
-00F4 : A01901EF;
-00F5 : 020F0F13;
-00F6 : 0077A023;
-00F7 : 0077A223;
-00F8 : 0077A423;
-00F9 : 0077A623;
-00FA : 0077A823;
-00FB : 0077AA23;
-00FC : 0077AC23;
-00FD : 0077AE23;
-00FE : 87FA86FA;
-00FF : FDE71CE3;
-0100 : 428D8A7D;
-0101 : 02C2F363;
-0102 : FFC60313;
-0103 : FFC37893;
-0104 : 00478E93;
-0105 : 01D88E33;
-0106 : 0E91A011;
-0107 : 0076A023;
-0108 : 86F687F6;
-0109 : FFCE9BE3;
-010A : 73938A0D;
-010B : 90630026;
-010C : 8A050203;
-010D : 8082E211;
-010E : 00B78023;
-010F : 07938082;
-0110 : 00230015;
-0111 : 167D0075;
-0112 : 86BEB79D;
-0113 : 9023BF5D;
-0114 : 078900B7;
-0115 : 9023BFF9;
-0116 : 16790077;
-0117 : BFB90789;
-0118 : 00000000;
-0119 : 00B567B3;
-011A : 8B8D8FD1;
-011B : 04079263;
-011C : 00C50733;
-011D : 8A7186AA;
-011E : 40C007B3;
-011F : 4A478067;
-0120 : 02000613;
-0121 : CEDC4DDC;
-0122 : CE9C4D9C;
-0123 : CADC49DC;
-0124 : CA9C499C;
-0125 : C6DC45DC;
-0126 : C69C459C;
-0127 : C2DC41DC;
-0128 : C29C419C;
-0129 : 96B295B2;
-012A : FCE6ECE3;
-012B : 00018082;
-012C : 00C50733;
-012D : 00050693;
-012E : 0005C783;
-012F : 00F68023;
-0130 : 06850585;
-0131 : FEE6EAE3;
-0132 : 00008082;
-0133 : 46254721;
-0134 : 01C55693;
-0135 : 05700793;
-0136 : 64630512;
-0137 : 079300D6;
-0138 : 82B30300;
-0139 : 002300D7;
-013A : 177D9850;
-013B : 8082F375;
-013C : CE061101;
-013D : CA26CC22;
-013E : C64EC84A;
-013F : C256C452;
-0140 : 297387AA;
-0141 : 84933430;
-0142 : 64090015;
-0143 : FFE4FA13;
-0144 : 8B440693;
-0145 : FFCA0993;
-0146 : 8B440413;
-0147 : 4AB54E29;
-0148 : 0006C703;
-0149 : E3710685;
-014A : 483548A9;
-014B : 0007C083;
-014C : 93630785;
-014D : 02930C00;
-014E : 45290084;
-014F : C30343B5;
-0150 : 02850002;
-0151 : 0C031163;
-0152 : 3749854E;
-0153 : 00F40393;
-0154 : 45B54629;
-0155 : 0003C503;
-0156 : ED4D0385;
-0157 : 0029D583;
-0158 : FFCA5803;
-0159 : 01059613;
-015A : 01060533;
-015B : 08933785;
-015C : 43290144;
-015D : C98342B5;
-015E : 08850008;
-015F : 0A099363;
-0160 : 4935854A;
-0161 : 4A2937A1;
-0162 : 99200023;
-0163 : 99400023;
-0164 : 491D4481;
-0165 : 02000A13;
-0166 : 49A14AB5;
-0167 : 85334401;
-0168 : 33D90084;
-0169 : 0E133725;
-016A : 15630200;
-016B : 00230124;
-016C : 4E299950;
-016D : 99C00023;
-016E : 12E30405;
-016F : 04A1FF34;
-0170 : FD449EE3;
-0171 : C0102EF3;
-0172 : 1908BF37;
-0173 : 0FFF0F93;
-0174 : C01026F3;
-0175 : 41D68733;
-0176 : FEEFFCE3;
-0177 : 878B57FD;
-0178 : 40850607;
-0179 : 80102623;
-017A : 1463BFF5;
-017B : 002301C7;
-017C : 00239950;
-017D : B72D98E0;
-017E : 01109463;
-017F : 99000023;
-0180 : 98100023;
-0181 : 1463B725;
-0182 : 002300A3;
-0183 : 00239870;
-0184 : B7359860;
-0185 : 00C51463;
-0186 : 98B00023;
-0187 : 98A00023;
-0188 : 9463BF15;
-0189 : 00230069;
-018A : 00239850;
-018B : B7A19930;
-018C : 11416509;
-018D : 8DA50513;
-018E : 3D5DC606;
-018F : 11416509;
-0190 : 8E550513;
-0191 : 356DC606;
-0192 : 12400293;
-0193 : 0002A783;
-0194 : 00178313;
-0195 : 0062A023;
-0196 : 01F37393;
-0197 : 02039163;
-0198 : 00535513;
-0199 : 00357593;
-019A : 0F000693;
-019B : 00B68833;
-019C : 00084883;
-019D : 00234E21;
-019E : 00239910;
-019F : 808299C0;
-01A0 : CE061101;
-01A1 : CA26CC22;
-01A2 : C64EC84A;
-01A3 : 2773C452;
-01A4 : 2423C010;
-01A5 : 009312E0;
-01A6 : 078BDE90;
-01A7 : 64090610;
-01A8 : 8B440293;
-01A9 : 04528313;
-01AA : 8B440413;
-01AB : 4F354FA9;
-01AC : 00034383;
-01AD : 95630305;
-01AE : 64890803;
-01AF : B3E48513;
-01B0 : 4EB546A9;
-01B1 : 00054583;
-01B2 : E1D10505;
-01B3 : 00234635;
-01B4 : 46A998C0;
-01B5 : 98D00023;
-01B6 : 2423481D;
-01B7 : 58FD8100;
-01B8 : 0710090B;
-01B9 : 20097993;
-01BA : FE098CE3;
-01BB : 40007A37;
-01BC : 720A0E13;
-01BD : 000E2E83;
-01BE : 01234F37;
-01BF : 567F0F93;
-01C0 : 720A0493;
-01C1 : 01FE9963;
-01C2 : E7B740D8;
-01C3 : 809398BA;
-01C4 : 0A63CFE7;
-01C5 : C2B71017;
-01C6 : 03B7193A;
-01C7 : 75B74000;
-01C8 : 76B74000;
-01C9 : 8313F4D5;
-01CA : 5A7D6042;
-01CB : 49014981;
-01CC : 8E134501;
-01CD : 86130003;
-01CE : 8E937285;
-01CF : AA3925F6;
-01D0 : 01F39463;
-01D1 : 99E00023;
-01D2 : 98700023;
-01D3 : 9463B795;
-01D4 : 002300D5;
-01D5 : 002399D0;
-01D6 : B7AD98B0;
-01D7 : 00A79463;
-01D8 : 98500023;
-01D9 : 98F00023;
-01DA : 0000C783;
-01DB : F7FD0085;
-01DC : 80800493;
-01DD : A0234319;
-01DE : 45950064;
-01DF : 0913C08C;
-01E0 : 46291114;
-01E1 : 43834A35;
-01E2 : 09050009;
-01E3 : 20039763;
-01E4 : C0102E73;
-01E5 : 1908B9B7;
-01E6 : 0FF98A13;
-01E7 : C0102673;
-01E8 : 41C606B3;
-01E9 : FEDA7CE3;
-01EA : 00234EB5;
-01EB : 4F2999D0;
-01EC : 99E00023;
-01ED : 12C40F93;
-01EE : 43B54E29;
-01EF : 000FC883;
-01F0 : 93630F85;
-01F1 : 18371E08;
-01F2 : 04934000;
-01F3 : 89134348;
-01F4 : 09930104;
-01F5 : 00230200;
-01F6 : 40889930;
-01F7 : 31FD0491;
-01F8 : FE991BE3;
-01F9 : 13D40713;
-01FA : 40B545A9;
-01FB : 00074503;
-01FC : 12630705;
-01FD : 10971C05;
-01FE : 80E74000;
-01FF : 0413C3E0;
-0200 : 43291534;
-0201 : 428347B5;
-0202 : 04050004;
-0203 : 1A029C63;
-0204 : 40F24462;
-0205 : 494244D2;
-0206 : 4A2249B2;
-0207 : 13176105;
-0208 : 00674000;
-0209 : 0093C3A3;
-020A : 452907A4;
-020B : BF2D42B5;
-020C : 000E2F83;
-020D : 48B30E11;
-020E : 033301F3;
-020F : 2E2303D3;
-0210 : 2803FF1E;
-0211 : 957EFFCE;
-0212 : FFFE2E23;
-0213 : 01184733;
-0214 : 00E96933;
-0215 : 01F9E9B3;
-0216 : 01FA7A33;
-0217 : FCCE6AE3;
-0218 : 09A40813;
-0219 : 4EB54F29;
-021A : 00084883;
-021B : 98630805;
-021C : 39A90A08;
-021D : 0B040513;
-021E : 463546A9;
-021F : 00054F03;
-0220 : 15630505;
-0221 : 25030A0F;
-0222 : 31890080;
-0223 : 00234735;
-0224 : 47A998E0;
-0225 : 98F00023;
-0226 : 0BB40293;
-0227 : 43B54E29;
-0228 : 0002C083;
-0229 : 9A630285;
-022A : 85520800;
-022B : 0A133105;
-022C : C5130200;
-022D : 0023FFF9;
-022E : 39099940;
-022F : 432949B5;
-0230 : 99300023;
-0231 : 98600023;
-0232 : 0D440393;
-0233 : 433545A9;
-0234 : 0003CE03;
-0235 : 19630385;
-0236 : 4088060E;
-0237 : 05933EC5;
-0238 : 00230200;
-0239 : 40C898B0;
-023A : 36CD44B5;
-023B : 00234629;
-023C : 00239890;
-023D : 1C6398C0;
-023E : 78B70609;
-023F : 35374000;
-0240 : 4A014001;
-0241 : 72888993;
-0242 : 0A050293;
-0243 : 0659E663;
-0244 : E60A00E3;
-0245 : 0F840713;
-0246 : 4FB54F29;
-0247 : 9463A895;
-0248 : 002301E8;
-0249 : 002399D0;
-024A : BF3D9910;
-024B : 00DF1463;
-024C : 98C00023;
-024D : 99E00023;
-024E : 9463B791;
-024F : 002301C0;
-0250 : 00239870;
-0251 : BFA99810;
-0252 : 00BE1463;
-0253 : 98600023;
-0254 : 99C00023;
-0255 : 1463BFB5;
-0256 : 00230128;
-0257 : 002398D0;
-0258 : C8039900;
-0259 : 0E85000E;
-025A : FE0817E3;
-025B : 0E93B779;
-025C : 49290E04;
-025D : B7F546B5;
-025E : 0009A083;
-025F : 6A330991;
-0260 : B769001A;
-0261 : 01E79463;
-0262 : 99F00023;
-0263 : 98F00023;
-0264 : 00074783;
-0265 : F7FD0705;
-0266 : 9463BBE1;
-0267 : 002300C3;
-0268 : 00239940;
-0269 : B3C59870;
-026A : 01C89463;
-026B : 98700023;
-026C : 99100023;
-026D : 1463B521;
-026E : 002300B5;
-026F : 00239810;
-0270 : B52D98A0;
-0271 : 00629463;
-0272 : 98F00023;
-0273 : 98500023;
-0274 : 4785BD1D;
-0275 : 00A79533;
-0276 : FFF54293;
-0277 : 0655050B;
-0278 : 27038082;
-0279 : 02B700C0;
-027A : 20233B00;
-027B : 8333A0A0;
-027C : 03B300E2;
-027D : 053700B3;
-027E : 22232D00;
-027F : 8E49A070;
-0280 : A0C02423;
-0281 : 20238082;
-0282 : 07B7A0A0;
-0283 : 22232000;
-0284 : 8DDDA000;
-0285 : A0B02423;
-0286 : 02938082;
-0287 : A70312C0;
-0288 : 06930002;
-0289 : A0230017;
-028A : CB1900D2;
-028B : 0E634785;
-028C : 03930EF7;
-028D : 05932000;
-028E : 878BDFF0;
-028F : 808206B3;
-0290 : C6061141;
-0291 : 0093C422;
-0292 : 0337A040;
-0293 : A0235000;
-0294 : 03930060;
-0295 : 0437A080;
-0296 : A0230100;
-0297 : 05130083;
-0298 : 060B2000;
-0299 : 06370805;
-029A : A0231100;
-029B : 05B700C0;
-029C : A0230200;
-029D : 060B00B3;
-029E : 08370805;
-029F : A0234B00;
-02A0 : 08B70100;
-02A1 : A0231500;
-02A2 : 068B0113;
-02A3 : 0E370805;
-02A4 : A0231400;
-02A5 : 068B01C3;
-02A6 : 0E930805;
-02A7 : AF03A100;
-02A8 : 0413000E;
-02A9 : 22231780;
-02AA : 07B701E4;
-02AB : A0230400;
-02AC : 078B00F3;
-02AD : A2830805;
-02AE : 0737000E;
-02AF : 70B74000;
-02B0 : 06934000;
-02B1 : 83130007;
-02B2 : 45817280;
-02B3 : 00542023;
-02B4 : 40D30633;
-02B5 : 00070513;
-02B6 : 03B73729;
-02B7 : 0F93D000;
-02B8 : 8F130074;
-02B9 : 05930083;
-02BA : 88130390;
-02BB : C8830883;
-02BC : D513000F;
-02BD : 06130048;
-02BE : F4630305;
-02BF : 061300C5;
-02C0 : FE130375;
-02C1 : 202300F8;
-02C2 : 0E9300CF;
-02C3 : F463030E;
-02C4 : 0E9301D5;
-02C5 : 2423037E;
-02C6 : 0F4101DF;
-02C7 : 18E31FFD;
-02C8 : 40B2FD0F;
-02C9 : 01414422;
-02CA : 72B78082;
-02CB : 36B74000;
-02CC : 87134001;
-02CD : 83137282;
-02CE : 05B30A06;
-02CF : 851340E3;
-02D0 : B5D17282;
-02D1 : CE061101;
-02D2 : CC22CA26;
-02D3 : C64EC84A;
-02D4 : 5783C452;
-02D5 : 00938880;
-02D6 : 94931480;
-02D7 : F2930107;
-02D8 : A4030FF7;
-02D9 : 80C10000;
-02DA : 12028263;
-02DB : 89104303;
-02DC : 89004583;
-02DD : 76134695;
-02DE : F5930FF3;
-02DF : E4630FF5;
-02E0 : 4F051066;
-02E1 : 14CF6F63;
-02E2 : 10061463;
-02E3 : 14040D63;
-02E4 : 00442F83;
-02E5 : 020F8963;
-02E6 : 8713401C;
-02E7 : C0180017;
-02E8 : 00B78023;
-02E9 : 01D44083;
-02EA : 01444283;
-02EB : 0050F333;
-02EC : 00640EA3;
-02ED : 88600AA3;
-02EE : 83934054;
-02EF : 2223FFF6;
-02F0 : 98630074;
-02F1 : 03B30203;
-02F2 : 8B2300C4;
-02F3 : 5A0300B3;
-02F4 : 55330104;
-02F5 : 791340CA;
-02F6 : 0C630015;
-02F7 : 09930009;
-02F8 : 98130086;
-02F9 : 08B30029;
-02FA : AE030104;
-02FB : 85220008;
-02FC : F5939E02;
-02FD : C1A11004;
-02FE : 0D634450;
-02FF : 0E931406;
-0300 : 2623FFF6;
-0301 : 876301D4;
-0302 : 4083140E;
-0303 : 428301D4;
-0304 : F6B30154;
-0305 : 0EA30050;
-0306 : 0AA300D4;
-0307 : 238388D0;
-0308 : 8A130084;
-0309 : 24230013;
-030A : C5030144;
-030B : 0E230003;
-030C : 0A2300A4;
-030D : F91388A0;
-030E : 05632004;
-030F : 48030209;
-0310 : 498301D4;
-0311 : 0AA38950;
-0312 : 58838900;
-0313 : F5930104;
-0314 : FE130FF9;
-0315 : 07632008;
-0316 : 2E83000E;
-0317 : 460503C4;
-0318 : 9E828522;
-0319 : 5F83444C;
-031A : 40400104;
-031B : 00B03633;
-031C : 00861F13;
-031D : 01FF6733;
-031E : 008037B3;
-031F : 00E7E333;
-0320 : 08236093;
-0321 : 439DA09D;
-0322 : 06760F63;
-0323 : A8A1F03D;
-0324 : 03F5FA13;
-0325 : 002A1913;
-0326 : 19000813;
-0327 : 012808B3;
-0328 : 0008A403;
-0329 : 11400223;
-032A : 0080A023;
-032B : 08200313;
-032C : 2E03C015;
-032D : 5F8300C4;
-032E : 405C0104;
-032F : 01C03EB3;
-0330 : 008E9F13;
-0331 : 01FF6733;
-0332 : 00F030B3;
-0333 : 00E0E2B3;
-0334 : 0822E313;
-0335 : 88601523;
-0336 : C0114681;
-0337 : 2A234C54;
-0338 : 12E388D0;
-0339 : 0093EE04;
-033A : 92930820;
-033B : E4B30100;
-033C : 24230092;
-033D : 40F28890;
-033E : 44D24462;
-033F : 49B24942;
-0340 : 61054A22;
-0341 : 05138082;
-0342 : 4A030400;
-0343 : A0231040;
-0344 : 02230000;
-0345 : 061310A0;
-0346 : 15230820;
-0347 : 2A2388C0;
-0348 : 44018800;
-0349 : 19000913;
-034A : 10000993;
-034B : 00890833;
-034C : 00082503;
-034D : 5883CD01;
-034E : FE130105;
-034F : 07630808;
-0350 : 2E83000E;
-0351 : 461D0405;
-0352 : 9E8285D2;
-0353 : 1FE30411;
-0354 : BF51FD34;
-0355 : 01F44F83;
-0356 : 89404F03;
-0357 : 01F40E23;
-0358 : 89F00A23;
-0359 : 01045703;
-035A : 0FFF7593;
-035B : 10077793;
-035C : EC0783E3;
-035D : 03842303;
-035E : 85224601;
-035F : BD659302;
-0360 : 575D47A1;
-0361 : 06E7828B;
-0362 : 2383C10C;
-0363 : C1501480;
-0364 : 00D50EA3;
-0365 : 02751663;
-0366 : 5E03454C;
-0367 : 36330105;
-0368 : 36B300C0;
-0369 : 981300B0;
-036A : 68B30086;
-036B : EEB30106;
-036C : EF1301C8;
-036D : 1523082E;
-036E : 4D4889E0;
-036F : 88A02A23;
-0370 : 0082FF93;
-0371 : 878B57DD;
-0372 : 808206FF;
-0373 : 575D47A1;
-0374 : 06E7828B;
-0375 : 00158313;
-0376 : 2423C550;
-0377 : C3830065;
-0378 : 0EA30005;
-0379 : 268300D5;
-037A : 0E231480;
-037B : 17630075;
-037C : 280302D5;
-037D : 5F030045;
-037E : 36330105;
-037F : 38B300C0;
-0380 : 1E130100;
-0381 : EEB30086;
-0382 : EFB301C8;
-0383 : E79301EE;
-0384 : 1523082F;
-0385 : 4D4888F0;
-0386 : 88A02A23;
-0387 : 0082F293;
-0388 : 878B575D;
-0389 : 808206E2;
-038A : 575D47A1;
-038B : 06E7828B;
-038C : 00C52303;
-038D : 00B50FA3;
-038E : 00031A63;
-038F : 14802603;
-0390 : 00B50E23;
-0391 : 00C51463;
-0392 : 88B00A23;
-0393 : 0082F513;
-0394 : 078B55DD;
-0395 : 808206B5;
-0396 : 575D47A1;
-0397 : 06E7828B;
-0398 : 14802383;
-0399 : 00B50EA3;
-039A : 00751463;
-039B : 88B00AA3;
-039C : 0082F513;
-039D : 078B55DD;
-039E : 808206B5;
-039F : 09400793;
-03A0 : 00F51823;
-03A1 : 00050EA3;
-03A2 : 88000AA3;
-03A3 : 04F54283;
-03A4 : 040506A3;
-03A5 : 0012E313;
-03A6 : 046507A3;
-03A7 : 47838082;
-03A8 : E29304F5;
-03A9 : 07A30027;
-03AA : 80820455;
-03AB : 04F54783;
-03AC : 0047E293;
-03AD : 045507A3;
-03AE : 71158082;
-03AF : CF86C7CE;
-03B0 : C1DACDA2;
-03B1 : C9CACBA6;
-03B2 : C3D6C5D2;
-03B3 : DD62DF5E;
-03B4 : D96ADB66;
-03B5 : 0093D76E;
-03B6 : 2B030F80;
-03B7 : A2831240;
-03B8 : 24830000;
-03B9 : F4138800;
-03BA : 80630054;
-03BB : 63091762;
-03BC : A1834383;
-03BD : 0F800B93;
-03BE : 0013F513;
-03BF : 1097C171;
-03C0 : 80E74000;
-03C1 : 79131F40;
-03C2 : 05630015;
-03C3 : 4A850009;
-03C4 : A8D94A01;
-03C5 : 80800A93;
-03C6 : 000AAA03;
-03C7 : 40007CB7;
-03C8 : 40013D37;
-03C9 : 002A6C13;
-03CA : 018AA023;
-03CB : 85934605;
-03CC : 051300FC;
-03CD : 4097E60D;
-03CE : 80E74000;
-03CF : C1050760;
-03D0 : 400077B7;
-03D1 : 3F078513;
-03D2 : 40000097;
-03D3 : 798080E7;
-03D4 : 000AA983;
-03D5 : FFD9F293;
-03D6 : 005AA023;
-03D7 : 0850BF4D;
-03D8 : 8513100C;
-03D9 : 002300FC;
-03DA : CA020201;
-03DB : 40005097;
-03DC : EBA080E7;
-03DD : 7DB74652;
-03DE : 100C4000;
-03DF : 409D8513;
-03E0 : 40000097;
-03E1 : 760080E7;
-03E2 : 082C0870;
-03E3 : 00FC8513;
-03E4 : 5097CC02;
-03E5 : 80E74000;
-03E6 : 4E72D2C0;
-03E7 : 7FB745E2;
-03E8 : 5E834000;
-03E9 : 2F0300AE;
-03EA : 851301CE;
-03EB : 9693437F;
-03EC : 0613009E;
-03ED : 0097FFEF;
-03EE : 80E74000;
-03EF : BF8172A0;
-03F0 : 40001097;
-03F1 : 0E4080E7;
-03F2 : 00157593;
-03F3 : 0813F1A9;
-03F4 : 270314C0;
-03F5 : 46FD0008;
-03F6 : 40EB08B3;
-03F7 : 0716F563;
-03F8 : 01682023;
-03F9 : 4A054A81;
-03FA : 016BA023;
-03FB : 0FC00093;
-03FC : 0000A703;
-03FD : 0014FB93;
-03FE : C002C25E;
-03FF : 0A870E63;
-0400 : 80800313;
-0401 : 0080A023;
-0402 : 00032383;
-0403 : 0014F593;
-0404 : 00259613;
-0405 : FFB3F513;
-0406 : 00A66833;
-0407 : 400078B7;
-0408 : 01032023;
-0409 : 3BD88913;
-040A : 4C354329;
-040B : 00094683;
-040C : EE990905;
-040D : C8A98891;
-040E : 40007A37;
-040F : 3D2A0D13;
-0410 : 4CB54C29;
-0411 : 4A81A01D;
-0412 : 4A81B5E1;
-0413 : BF794A01;
-0414 : 00669463;
-0415 : 99800023;
-0416 : 98D00023;
-0417 : 9463BFC1;
-0418 : 0023018D;
-0419 : 00239990;
-041A : 4D8399B0;
-041B : 0D05000D;
-041C : FE0D97E3;
-041D : 15634E12;
-041E : 7EB7160E;
-041F : 87934000;
-0420 : 4FA93D9E;
-0421 : A82149B5;
-0422 : 40007AB7;
-0423 : 3CCA8D13;
-0424 : 9463BF45;
-0425 : 002301F2;
-0426 : 00239930;
-0427 : C2839850;
-0428 : 07850007;
-0429 : FE0297E3;
-042A : 57138C39;
-042B : 4B050024;
-042C : 00177A93;
-042D : 4A05C05A;
-042E : C0B76389;
-042F : 63094000;
-0430 : B3038513;
-0431 : 00008D13;
-0432 : 4B014B81;
-0433 : 00008493;
-0434 : A1830C13;
-0435 : 4583C42A;
-0436 : 886304ED;
-0437 : 8763100A;
-0438 : 846A1005;
-0439 : 4DA14901;
-043A : 2AE44783;
-043B : 0017F293;
-043C : 04028463;
-043D : 001C4703;
-043E : 00177313;
-043F : 00031863;
-0440 : 05040513;
-0441 : 40005097;
-0442 : 820080E7;
-0443 : 2AE44383;
-0444 : FFE3F093;
-0445 : 2A140723;
-0446 : 04CD4503;
-0447 : FFF50593;
-0448 : 04BD0623;
-0449 : 2AF44803;
-044A : 00487893;
-044B : 00089663;
-044C : FFE87613;
-044D : 2AC40723;
-044E : 04130905;
-044F : 15E32E84;
-0450 : 0723FBB9;
-0451 : 4682040D;
-0452 : 856AC691;
-0453 : 40002097;
-0454 : 9F6080E7;
-0455 : 49814E12;
-0456 : 020E0E63;
-0457 : 4EA15CDD;
-0458 : 079E870B;
-0459 : 0F936F09;
-045A : 07B3B90F;
-045B : 8DB303FB;
-045C : C98300F4;
-045D : 87A304FD;
-045E : F993040D;
-045F : 068B0FF9;
-0460 : F2930790;
-0461 : 8D630069;
-0462 : 856A2002;
-0463 : 40002097;
-0464 : 9B6080E7;
-0465 : 04ED4603;
-0466 : 46061063;
-0467 : 87936F89;
-0468 : 0B05B90F;
-0469 : 9D3E4291;
-046A : 16E39BBE;
-046B : 0A63F25B;
-046C : 0493000A;
-046D : AA038080;
-046E : 7A930004;
-046F : A023FFDA;
-0470 : 40FE0154;
-0471 : 44DE446E;
-0472 : 49BE494E;
-0473 : 4A9E4A2E;
-0474 : 5BFA4B0E;
-0475 : 5CDA5C6A;
-0476 : 5DBA5D4A;
-0477 : 8082612D;
-0478 : 40007F37;
-0479 : 3E5F0793;
-047A : FDB1BD69;
-047B : 000C4603;
-047C : 00167813;
-047D : F40819E3;
-047E : 88002883;
-047F : 8D936689;
-0480 : F913B3B6;
-0481 : 15630048;
-0482 : 4CA20009;
-0483 : 00AC8D93;
-0484 : 03000E13;
-0485 : 02F00E93;
-0486 : 01CD8023;
-0487 : 01DD80A3;
-0488 : 000D8123;
-0489 : 2A8D0413;
-048A : 09138CEA;
-048B : 2F030300;
-048C : 7FB7044D;
-048D : 874A4000;
-048E : 008F0693;
-048F : 469F8613;
-0490 : 85224591;
-0491 : 400079B7;
-0492 : DA840D93;
-0493 : 40005097;
-0494 : 340080E7;
-0495 : 57498993;
-0496 : 0009A683;
-0497 : 12068363;
-0498 : 400077B7;
-0499 : 86138722;
-049A : 05934717;
-049B : 10080400;
-049C : 40005097;
-049D : 31C080E7;
-049E : 2AECC283;
-049F : 0012F713;
-04A0 : 4083CB05;
-04A1 : F313001C;
-04A2 : 17630010;
-04A3 : 856E0003;
-04A4 : 40004097;
-04A5 : 694080E7;
-04A6 : 2AECC383;
-04A7 : FFE3F513;
-04A8 : 2AAC8723;
-04A9 : 04CD4583;
-04AA : FFF58613;
-04AB : 04CD0623;
-04AC : 2AFCC803;
-04AD : 00487893;
-04AE : 0E089263;
-04AF : 0FE87F93;
-04B0 : 2BFC8723;
-04B1 : 002FF693;
-04B2 : E2914605;
-04B3 : 100C460D;
-04B4 : C632856E;
-04B5 : 40004097;
-04B6 : D38080E7;
-04B7 : CE034EA9;
-04B8 : 1A632AEC;
-04B9 : 4F3201D5;
-04BA : 002F7F93;
-04BB : 000F8563;
-04BC : 002E6F93;
-04BD : 4785B7F1;
-04BE : 4791C111;
-04BF : 00FE62B3;
-04C0 : 2A5C8723;
-04C1 : 0012F713;
-04C2 : 79B7CB51;
-04C3 : 10104000;
-04C4 : 851385A2;
-04C5 : 00974769;
-04C6 : 80E74000;
-04C7 : 03133CA0;
-04C8 : 03930220;
-04C9 : A8230084;
-04CA : A0232A6C;
-04CB : 55FD0A7C;
-04CC : 856E567D;
-04CD : 40004097;
-04CE : 612080E7;
-04CF : 7DB7C911;
-04D0 : 85A24000;
-04D1 : 48AD8513;
-04D2 : 40000097;
-04D3 : 398080E7;
-04D4 : 044D2603;
-04D5 : 064CA083;
-04D6 : 060CA583;
-04D7 : 00265883;
-04D8 : 01809513;
-04D9 : 0085D813;
-04DA : 01056633;
-04DB : 00C8F363;
-04DC : 96238646;
-04DD : 46832ACC;
-04DE : 8E1304CD;
-04DF : 06230016;
-04E0 : 090505CD;
-04E1 : 03800E93;
-04E2 : 2E840413;
-04E3 : 2E8C8C93;
-04E4 : E9D91FE3;
-04E5 : 07234F05;
-04E6 : B37505ED;
-04E7 : BD6D0991;
-04E8 : 0019F713;
-04E9 : DE0708E3;
-04EA : 049D4303;
-04EB : 048D4603;
-04EC : 53936505;
-04ED : 05930063;
-04EE : 90937905;
-04EF : 88330083;
-04F0 : 88B300BB;
-04F1 : 79130100;
-04F2 : 7C930016;
-04F3 : 84330073;
-04F4 : 00630114;
-04F5 : 06930409;
-04F6 : 8DB32E80;
-04F7 : 8E3302DC;
-04F8 : 8EB300FD;
-04F9 : CF0301C4;
-04FA : 7F932AEE;
-04FB : 9963001F;
-04FC : 0893040F;
-04FD : 06A3F800;
-04FE : 0593051D;
-04FF : 856A0800;
-0500 : 04233425;
-0501 : 4603040D;
-0502 : 7693048D;
-0503 : 0423FFE6;
-0504 : 4D8304DD;
-0505 : FE13048D;
-0506 : 0463002D;
-0507 : 58030A0E;
-0508 : F593010D;
-0509 : 0423FFDD;
-050A : 689304BD;
-050B : 18231008;
-050C : 4685011D;
-050D : 10000613;
-050E : 856A85A2;
-050F : BB993A41;
-0510 : 1097856A;
-0511 : 80E74000;
-0512 : E9016940;
-0513 : 02100813;
-0514 : 050D06A3;
-0515 : 02100593;
-0516 : 0793B75D;
-0517 : D0028080;
-0518 : 0007A283;
-0519 : 856A4595;
-051A : 0022E713;
-051B : 32EDC398;
-051C : 050B8313;
-051D : 006D83B3;
-051E : 8933856A;
-051F : 10970074;
-0520 : 80E74000;
-0521 : 15936260;
-0522 : 46010085;
-0523 : 4097854A;
-0524 : 80E74000;
-0525 : C5114B80;
-0526 : 06A345A1;
-0527 : 45A104BD;
-0528 : 1014BFB9;
-0529 : 10000613;
-052A : 854A85A2;
-052B : 40004097;
-052C : E84080E7;
-052D : 5082F175;
-052E : 10000513;
-052F : FCA09EE3;
-0530 : FE93B799;
-0531 : 8563004D;
-0532 : 5083020E;
-0533 : F913010D;
-0534 : 0423FFBD;
-0535 : E513052D;
-0536 : 18230010;
-0537 : 069300AD;
-0538 : 06130410;
-0539 : 85A21000;
-053A : F0EF856A;
-053B : B15D897F;
-053C : 008DFF13;
-053D : 040F0563;
-053E : 0F936789;
-053F : 82932E80;
-0540 : 8CB3B907;
-0541 : 073303FC;
-0542 : 8333025B;
-0543 : 8DB300EC;
-0544 : C3830064;
-0545 : F9132AED;
-0546 : 1E630013;
-0547 : 02930209;
-0548 : 06A3F800;
-0549 : 0593045D;
-054A : 856A0800;
-054B : 042338F5;
-054C : 4703040D;
-054D : 7313048D;
-054E : 0423FF77;
-054F : 4D83046D;
-0550 : 856A048D;
-0551 : 00FDF393;
-0552 : 047D0423;
-0553 : 40001097;
-0554 : 5C2080E7;
-0555 : F093B181;
-0556 : 89630023;
-0557 : 07930000;
-0558 : 06A30400;
-0559 : 059304FD;
-055A : B7C10400;
-055B : 1097856A;
-055C : 80E74000;
-055D : E9015680;
-055E : 02100F93;
-055F : 05FD06A3;
-0560 : 02100593;
-0561 : D002B75D;
-0562 : 80800513;
-0563 : 8893410C;
-0564 : 8633050B;
-0565 : E813011C;
-0566 : 20230025;
-0567 : 856A0105;
-0568 : 00C48CB3;
-0569 : 40001097;
-056A : 500080E7;
-056B : 00851593;
-056C : 85664601;
-056D : 40004097;
-056E : 392080E7;
-056F : 0F13C901;
-0570 : 06A30200;
-0571 : 059305ED;
-0572 : B7850200;
-0573 : 2AEDC683;
-0574 : 10000613;
-0575 : EE1385A2;
-0576 : 87230086;
-0577 : 10142BCD;
-0578 : 40978566;
-0579 : 80E74000;
-057A : F971F3C0;
-057B : 0E935402;
-057C : 16E31000;
-057D : BF35FDD4;
-057E : 000A1663;
-057F : 0049F993;
-0580 : B8098EE3;
-0581 : 4D81846A;
-0582 : 46834CA1;
-0583 : FE132AE4;
-0584 : 0E630086;
-0585 : 0513000E;
-0586 : 40970504;
-0587 : 80E74000;
-0588 : 4E831520;
-0589 : FF132AE4;
-058A : 0723FF7E;
-058B : 0D852BE4;
-058C : 2E840413;
-058D : FD9D9BE3;
-058E : 4783B695;
-058F : E29301D5;
-0590 : 0EA30047;
-0591 : 0AA30055;
-0592 : 80828850;
-0593 : 01D54783;
-0594 : 0027E293;
-0595 : 00550EA3;
-0596 : 88500AA3;
-0597 : 71798082;
-0598 : D606D422;
-0599 : 0045F793;
-059A : CFCD842E;
-059B : 01D54083;
-059C : 16D00313;
-059D : 0FB0F293;
-059E : 00550EA3;
-059F : 88500AA3;
-05A0 : 00734383;
-05A1 : AE1485B7;
-05A2 : AE158893;
-05A3 : 14700613;
-05A4 : 02760833;
-05A5 : 00634703;
-05A6 : 00534F03;
-05A7 : 00334583;
-05A8 : 00175093;
-05A9 : 03FF7F93;
-05AA : 005F9793;
-05AB : 01F0F293;
-05AC : 0057E6B3;
-05AD : 00234783;
-05AE : 0313BE33;
-05AF : 00434383;
-05B0 : 00134303;
-05B1 : 00F7F093;
-05B2 : 01F3F613;
-05B3 : 01509293;
-05B4 : CC02073E;
-05B5 : 4785CE02;
-05B6 : 01C80EB3;
-05B7 : 00B61813;
-05B8 : 01F5FE13;
-05B9 : 0106E8B3;
-05BA : 010E1F13;
-05BB : EFB30EC6;
-05BC : 069301E8;
-05BD : D8930143;
-05BE : E3B3011E;
-05BF : 65B3005F;
-05C0 : 96130117;
-05C1 : E8330196;
-05C2 : 9E1300C3;
-05C3 : CA420105;
-05C4 : 00B11C23;
-05C5 : 010E5F13;
-05C6 : 91E01223;
-05C7 : 91002023;
-05C8 : 16F001A3;
-05C9 : 04047093;
-05CA : 00008D63;
-05CB : 01D54283;
-05CC : E6934621;
-05CD : 05930402;
-05CE : C62A16D0;
-05CF : E44FF0EF;
-05D0 : 04624532;
-05D1 : 41845313;
-05D2 : 0A035263;
-05D3 : 01D54683;
-05D4 : 16500713;
-05D5 : 0FD6FE93;
-05D6 : 01D50EA3;
-05D7 : 89D00AA3;
-05D8 : 90002883;
-05D9 : 90402603;
-05DA : DF934851;
-05DB : 00230158;
-05DC : CC320107;
-05DD : 00FFF793;
-05DE : 0108D093;
-05DF : 00F65813;
-05E0 : 01230646;
-05E1 : F29300F7;
-05E2 : 07B701F0;
-05E3 : 509300C8;
-05E4 : 01A30116;
-05E5 : B2B30057;
-05E6 : DE130217;
-05E7 : CA460198;
-05E8 : FECE0F13;
-05E9 : 00B8D393;
-05EA : 0058D313;
-05EB : 01F8F893;
-05EC : 01E700A3;
-05ED : 00189E13;
-05EE : 00187F13;
-05EF : 01F3F413;
-05F0 : 03F37693;
-05F1 : 01EE6FB3;
-05F2 : 00D702A3;
-05F3 : 00870223;
-05F4 : 01F70323;
-05F5 : 005703A3;
-05F6 : 50B25422;
-05F7 : 080EE693;
-05F8 : 05934621;
-05F9 : 61451650;
-05FA : DE4FF06F;
-05FB : 542250B2;
-05FC : 80826145;
-05FD : 99805783;
-05FE : 17504603;
-05FF : 01079293;
-0600 : 0102D313;
-0601 : 03938F1A;
-0602 : C2111750;
-0603 : 7593C595;
-0604 : B8130103;
-0605 : 80230015;
-0606 : ED990103;
-0607 : 99004703;
-0608 : 0FF77893;
-0609 : 01150E23;
-060A : 01150FA3;
-060B : 99805E03;
-060C : 010E1E93;
-060D : 010EDF13;
-060E : 010F1F93;
-060F : 010FD793;
-0610 : 007F5293;
-0611 : 001F5693;
-0612 : 98F01F23;
-0613 : 009F5813;
-0614 : 0082F313;
-0615 : 0126F613;
-0616 : 0003C383;
-0617 : 00C365B3;
-0618 : 00487713;
-0619 : 00E5C8B3;
-061A : 0E68CE13;
-061B : 14802F83;
-061C : 007E4EB3;
-061D : 01D50EA3;
-061E : 01F51563;
-061F : 2A234D48;
-0620 : 808288A0;
-0621 : 98B00823;
-0622 : 03E00793;
-0623 : 98F00023;
-0624 : B78D4581;
-0625 : 03C00793;
-0626 : 98F00023;
-0627 : BF994585;
-0628 : 02300793;
-0629 : 00236509;
-062A : 458198F0;
-062B : A8C50513;
-062C : 0000B791;
-062D : 4F525245;
-062E : 00203A52;
-062F : 20746120;
-0630 : 20007830;
-0631 : 00783028;
-0632 : 61420A29;
-0633 : 64612064;
-0634 : 73657264;
-0635 : 30203A73;
-0636 : 696D0078;
-0637 : 696C6173;
-0638 : 64656E67;
-0639 : 766E6900;
-063A : 64696C61;
-063B : 736E6920;
-063C : 63757274;
-063D : 6E6F6974;
-063E : 2A0A0A00;
-063F : 48202A2A;
-0640 : 6F6C6C65;
-0641 : 6F57202C;
-0642 : 21646C72;
-0643 : 2A2A2A20;
-0644 : 58414D0A;
-0645 : 66203038;
-0646 : 776D7269;
-0647 : 20657261;
-0648 : 706D6F63;
-0649 : 64656C69;
-064A : 3A6E6F20;
-064B : 44530020;
-064C : 204D4152;
-064D : 6D656573;
-064E : 6B6F2073;
-064F : 73202D20;
-0650 : 7070696B;
-0651 : 20676E69;
-0652 : 74736574;
-0653 : 4453000A;
-0654 : 204D4152;
-0655 : 61746164;
-0656 : 65686320;
-0657 : 75736B63;
-0658 : 00203A6D;
-0659 : 70786520;
-065A : 65746365;
-065B : 42002064;
-065C : 20737469;
-065D : 61776C61;
-065E : 73207379;
-065F : 202C7465;
-0660 : 61656C63;
-0661 : 00203A72;
-0662 : 74736554;
-0663 : 74616420;
-0664 : 00203A61;
-0665 : 41524453;
-0666 : 6572204D;
-0667 : 772F6461;
-0668 : 65746972;
-0669 : 72726520;
-066A : 000A726F;
-066B : 41524453;
-066C : 622E204D;
-066D : 69207373;
-066E : 6F6E2073;
-066F : 657A2074;
-0670 : 0A216F72;
-0671 : 69615700;
-0672 : 676E6974;
-0673 : 73203520;
-0674 : 726F6620;
-0675 : 73657420;
-0676 : 676E6974;
-0677 : 002E2E2E;
-0678 : 41524453;
-0679 : 756A204D;
-067A : 7420706D;
-067B : 3A747365;
-067C : 754A0A00;
-067D : 6E69706D;
-067E : 6F742067;
-067F : 52445320;
-0680 : 2E2E4D41;
-0681 : 6200202E;
-0682 : 206B6361;
-0683 : 53206E69;
-0684 : 2E4D4152;
-0685 : 0000000A;
-0686 : 00000101;
-0687 : 00000000;
-0688 : 00000000;
-0689 : 00000000;
-068A : 00000000;
-068B : 00000000;
-068C : 00000000;
-068D : 00000000;
-068E : 00000000;
-068F : 00000000;
-0690 : 00000000;
-0691 : 00000000;
-0692 : 00000000;
-0693 : 00000000;
-0694 : 00000000;
-0695 : 00000000;
-0696 : 00000105;
-0697 : 00007FBF;
-0698 : 00000000;
-0699 : D3030300;
-069A : 0000163A;
-069B : 00000000;
-069C : 0000165E;
-069D : 00000000;
-069E : 00000000;
-069F : 00000000;
-06A0 : 0000164C;
-06A1 : 00000000;
-06A2 : 00000000;
-06A3 : 00000000;
-06A4 : 00000000;
-06A5 : 00000000;
-06A6 : 00000000;
-06A7 : 00000101;
-06A8 : 0000FFFF;
-06A9 : 00000000;
-06AA : 0003F600;
-06AB : 00001884;
-06AC : 00000000;
-06AD : 00000000;
-06AE : 00000000;
-06AF : 00000000;
-06B0 : 00000000;
-06B1 : 00001894;
-06B2 : 00000000;
-06B3 : 00000000;
-06B4 : 00000000;
-06B5 : 00000000;
-06B6 : 00000000;
-06B7 : 00000000;
-06B8 : 00000000;
-06B9 : 00000000;
-06BA : 00000000;
-06BB : 00000000;
-06BC : 00000000;
-06BD : 00000000;
-06BE : 00000000;
-06BF : 00000000;
-06C0 : 00000000;
-06C1 : 00000000;
-06C2 : 00000000;
-06C3 : 00000000;
-06C4 : 00000000;
-06C5 : 00000000;
-06C6 : 00000000;
-06C7 : 00000000;
-06C8 : 00000000;
-06C9 : 00000000;
-06CA : 00000000;
-06CB : 00000000;
-06CC : 6362612F;
-06CD : 6B736964;
-06CE : 3030382E;
-06CF : 6854002F;
-06D0 : 65462075;
-06D1 : 30312062;
-06D2 : 3A303020;
-06D3 : 343A3934;
-06D4 : 53502037;
-06D5 : 30322054;
-06D6 : 003232;
-[06D7..1FFF] : 00;
-END;

BIN
fpga/output/v1.jic


BIN
fpga/output/v1.rbf.gz


BIN
fpga/output/v1.rpd.gz


BIN
fpga/output/v1.sof


BIN
fpga/output/v1.svf.gz


BIN
fpga/output/v1.xsvf.gz


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.rbf.gz


BIN
fpga/output/v2.rpd.gz


BIN
fpga/output/v2.sof


BIN
fpga/output/v2.svf.gz


BIN
fpga/output/v2.xsvf.gz


+ 0 - 327
fpga/output/v2boot.pin

@@ -1,327 +0,0 @@
- -- Copyright (C) 2021  Intel Corporation. All rights reserved.
- -- Your use of Intel Corporation's design tools, logic functions 
- -- and other software and tools, and any partner logic 
- -- functions, and any output files from any of the foregoing 
- -- (including device programming or simulation files), and any 
- -- associated documentation or information are expressly subject 
- -- to the terms and conditions of the Intel Program License 
- -- Subscription Agreement, the Intel Quartus Prime License Agreement,
- -- the Intel FPGA IP License Agreement, or other applicable license
- -- agreement, including, without limitation, that your use is for
- -- the sole purpose of programming logic devices manufactured by
- -- Intel and sold by Intel or its authorized distributors.  Please
- -- refer to the applicable agreement for further details, at
- -- https://fpgasoftware.intel.com/eula.
- -- 
- -- This is a Quartus Prime output file. It is for reporting purposes only, and is
- -- not intended for use as a Quartus Prime input file. This file cannot be used
- -- to make Quartus Prime pin assignments - for instructions on how to make pin
- -- assignments, please see Quartus Prime help.
- ---------------------------------------------------------------------------------
-
-
-
- ---------------------------------------------------------------------------------
- -- NC            : No Connect. This pin has no internal connection to the device.
- -- DNU           : Do Not Use. This pin MUST NOT be connected.
- -- VCCINT        : Dedicated power pin, which MUST be connected to VCC  (1.2V).
- -- VCCIO         : Dedicated power pin, which MUST be connected to VCC
- --                 of its bank.
- --                  Bank 1:       3.3V
- --                  Bank 2:       3.3V
- --                  Bank 3:       3.3V
- --                  Bank 4:       3.3V
- --                  Bank 5:       2.5V
- --                  Bank 6:       3.3V
- --                  Bank 7:       3.3V
- --                  Bank 8:       3.3V
- -- GND           : Dedicated ground pin. Dedicated GND pins MUST be connected to GND.
- --                  It can also be used to report unused dedicated pins. The connection
- --                  on the board for unused dedicated pins depends on whether this will
- --                  be used in a future design. One example is device migration. When
- --                  using device migration, refer to the device pin-tables. If it is a
- --                  GND pin in the pin table or if it will not be used in a future design
- --                  for another purpose the it MUST be connected to GND. If it is an unused
- --                  dedicated pin, then it can be connected to a valid signal on the board
- --                  (low, high, or toggling) if that signal is required for a different
- --                  revision of the design.
- -- GND+          : Unused input pin. It can also be used to report unused dual-purpose pins.
- --                  This pin should be connected to GND. It may also be connected  to a
- --                  valid signal  on the board  (low, high, or toggling)  if that signal
- --                  is required for a different revision of the design.
- -- GND*          : Unused  I/O  pin. Connect each pin marked GND* directly to GND
- --                  or leave it unconnected.
- -- RESERVED      : Unused I/O pin, which MUST be left unconnected.
- -- RESERVED_INPUT    : Pin is tri-stated and should be connected to the board.
- -- RESERVED_INPUT_WITH_WEAK_PULLUP    : Pin is tri-stated with internal weak pull-up resistor.
- -- RESERVED_INPUT_WITH_BUS_HOLD       : Pin is tri-stated with bus-hold circuitry.
- -- RESERVED_OUTPUT_DRIVEN_HIGH        : Pin is output driven high.
- ---------------------------------------------------------------------------------
-
-
-
- ---------------------------------------------------------------------------------
- -- Pin directions (input, output or bidir) are based on device operating in user mode.
- ---------------------------------------------------------------------------------
-
-Quartus Prime Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
-CHIP  "v2boot"  ASSIGNED TO AN: EP4CE15F17C8
-
-Pin Name/Usage               : Location  : Dir.   : I/O Standard      : Voltage : I/O Bank  : User Assignment
--------------------------------------------------------------------------------------------------------------
-VCCIO8                       : A1        : power  :                   : 3.3V    : 8         :                
-abc_int800_x                 : A2        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-abc_nmi_x                    : A3        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_dq[11]                    : A4        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_dq[8]                     : A5        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[9]                      : A6        : output : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[7]                      : A7        : output : 3.3-V LVTTL       :         : 8         : Y              
-GND+                         : A8        :        :                   :         : 8         :                
-GND+                         : A9        :        :                   :         : 7         :                
-sr_dq[7]                     : A10       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-sr_dq[5]                     : A11       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-sr_dq[0]                     : A12       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-sr_ba[0]                     : A13       : output : 3.3-V LVTTL       :         : 7         : Y              
-sr_a[0]                      : A14       : output : 3.3-V LVTTL       :         : 7         : Y              
-sr_a[3]                      : A15       : output : 3.3-V LVTTL       :         : 7         : Y              
-VCCIO7                       : A16       : power  :                   : 3.3V    : 7         :                
-abc_xm_x                     : B1        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-GND                          : B2        : gnd    :                   :         :           :                
-abc_int80_x                  : B3        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-abc_rdy_x                    : B4        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_dq[10]                    : B5        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[12]                     : B6        : output : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[8]                      : B7        : output : 3.3-V LVTTL       :         : 8         : Y              
-GND+                         : B8        :        :                   :         : 8         :                
-GND+                         : B9        :        :                   :         : 7         :                
-sr_dq[6]                     : B10       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-sr_dq[4]                     : B11       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-sr_ras_n                     : B12       : output : 3.3-V LVTTL       :         : 7         : Y              
-sr_ba[1]                     : B13       : output : 3.3-V LVTTL       :         : 7         : Y              
-sr_a[1]                      : B14       : output : 3.3-V LVTTL       :         : 7         : Y              
-GND                          : B15       : gnd    :                   :         :           :                
-rtc_int_n                    : B16       : input  : 3.3-V LVTTL       :         : 6         : Y              
-flash_io[0]                  : C1        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-abc_host                     : C2        : output : 3.3-V LVTTL       :         : 1         : Y              
-RESERVED_INPUT_WITH_WEAK_PULLUP : C3        :        :                   :         : 8         :                
-VCCIO8                       : C4        : power  :                   : 3.3V    : 8         :                
-GND                          : C5        : gnd    :                   :         :           :                
-sr_dq[14]                    : C6        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-VCCIO8                       : C7        : power  :                   : 3.3V    : 8         :                
-sr_a[11]                     : C8        : output : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[4]                      : C9        : output : 3.3-V LVTTL       :         : 7         : Y              
-VCCIO7                       : C10       : power  :                   : 3.3V    : 7         :                
-sr_dq[3]                     : C11       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-GND                          : C12       : gnd    :                   :         :           :                
-VCCIO7                       : C13       : power  :                   : 3.3V    : 7         :                
-sr_a[10]                     : C14       : output : 3.3-V LVTTL       :         : 7         : Y              
-i2c_sda                      : C15       : bidir  : 3.3-V LVTTL       :         : 6         : Y              
-usb_pu                       : C16       : output : 3.3-V LVTTL       :         : 6         : Y              
-abc_a[3]                     : D1        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-flash_cs_n                   : D2        : output : 3.3-V LVTTL       :         : 1         : Y              
-sr_clk                       : D3        : output : 3.3-V LVTTL       :         : 8         : Y              
-VCCD_PLL3                    : D4        : power  :                   : 1.2V    :           :                
-sr_dq[15]                    : D5        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_dq[13]                    : D6        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-GND                          : D7        : gnd    :                   :         :           :                
-sr_dqm[1]                    : D8        : output : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[5]                      : D9        : output : 3.3-V LVTTL       :         : 7         : Y              
-GND                          : D10       : gnd    :                   :         :           :                
-sr_dq[2]                     : D11       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-sr_cs_n                      : D12       : output : 3.3-V LVTTL       :         : 7         : Y              
-VCCD_PLL2                    : D13       : power  :                   : 1.2V    :           :                
-sr_a[2]                      : D14       : output : 3.3-V LVTTL       :         : 7         : Y              
-usb_dp                       : D15       : bidir  : 3.3-V LVTTL       :         : 6         : Y              
-usb_dn                       : D16       : bidir  : 3.3-V LVTTL       :         : 6         : Y              
-GND+                         : E1        :        :                   :         : 1         :                
-GND                          : E2        : gnd    :                   :         :           :                
-VCCIO1                       : E3        : power  :                   : 3.3V    : 1         :                
-GND                          : E4        : gnd    :                   :         :           :                
-GNDA3                        : E5        : gnd    :                   :         :           :                
-sr_dq[12]                    : E6        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_dq[9]                     : E7        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_a[6]                      : E8        : output : 3.3-V LVTTL       :         : 8         : Y              
-sr_cas_n                     : E9        : output : 3.3-V LVTTL       :         : 7         : Y              
-sr_dqm[0]                    : E10       : output : 3.3-V LVTTL       :         : 7         : Y              
-sr_dq[1]                     : E11       : bidir  : 3.3-V LVTTL       :         : 7         : Y              
-GNDA2                        : E12       : gnd    :                   :         :           :                
-GND                          : E13       : gnd    :                   :         :           :                
-VCCIO6                       : E14       : power  :                   : 3.3V    : 6         :                
-rtc_32khz                    : E15       : input  : 3.3-V LVTTL       :         : 6         : Y              
-GND+                         : E16       :        :                   :         : 6         :                
-abc_a[7]                     : F1        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-abc_cs_n                     : F2        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-abc_a[5]                     : F3        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-nSTATUS                      : F4        :        :                   :         : 1         :                
-VCCA3                        : F5        : power  :                   : 2.5V    :           :                
-GND                          : F6        : gnd    :                   :         :           :                
-VCCINT                       : F7        : power  :                   : 1.2V    :           :                
-abc_a[0]                     : F8        : bidir  : 3.3-V LVTTL       :         : 8         : Y              
-sr_we_n                      : F9        : output : 3.3-V LVTTL       :         : 7         : Y              
-GND                          : F10       : gnd    :                   :         :           :                
-VCCINT                       : F11       : power  :                   : 1.2V    :           :                
-VCCA2                        : F12       : power  :                   : 2.5V    :           :                
-rngio[2]                     : F13       : bidir  : 3.3-V LVTTL       :         : 6         : Y              
-abc_a[2]                     : F14       : bidir  : 3.3-V LVTTL       :         : 6         : Y              
-sd_do                        : F15       : input  : 3.3-V LVTTL       :         : 6         : Y              
-sd_cs_n                      : F16       : output : 3.3-V LVTTL       :         : 6         : Y              
-abc_a[8]                     : G1        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-abc_out_n[0]                 : G2        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-VCCIO1                       : G3        : power  :                   : 3.3V    : 1         :                
-GND                          : G4        : gnd    :                   :         :           :                
-abc_a[4]                     : G5        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-VCCINT                       : G6        : power  :                   : 1.2V    :           :                
-VCCINT                       : G7        : power  :                   : 1.2V    :           :                
-VCCINT                       : G8        : power  :                   : 1.2V    :           :                
-VCCINT                       : G9        : power  :                   : 1.2V    :           :                
-VCCINT                       : G10       : power  :                   : 1.2V    :           :                
-i2c_scl                      : G11       : bidir  : 3.3-V LVTTL       :         : 6         : Y              
-MSEL2                        : G12       :        :                   :         : 6         :                
-GND                          : G13       : gnd    :                   :         :           :                
-VCCIO6                       : G14       : power  :                   : 3.3V    : 6         :                
-sd_clk                       : G15       : output : 3.3-V LVTTL       :         : 6         : Y              
-sd_di                        : G16       : output : 3.3-V LVTTL       :         : 6         : Y              
-flash_sck                    : H1        : output : 3.3-V LVTTL       :         : 1         : Y              
-flash_io[1]                  : H2        : bidir  : 3.3-V LVTTL       :         : 1         : Y              
-TCK                          : H3        : input  :                   :         : 1         :                
-TDI                          : H4        : input  :                   :         : 1         :                
-nCONFIG                      : H5        :        :                   :         : 1         :                
-VCCINT                       : H6        : power  :                   : 1.2V    :           :                
-GND                          : H7        : gnd    :                   :         :           :                
-GND                          : H8        : gnd    :                   :         :           :                
-GND                          : H9        : gnd    :                   :         :           :                
-GND                          : H10       : gnd    :                   :         :           :                
-VCCINT                       : H11       : power  :                   : 1.2V    :           :                
-MSEL1                        : H12       :        :                   :         : 6         :                
-MSEL0                        : H13       :        :                   :         : 6         :                
-CONF_DONE                    : H14       :        :                   :         : 6         :                
-GND                          : H15       : gnd    :                   :         :           :                
-GND                          : H16       : gnd    :                   :         :           :                
-abc_a[9]                     : J1        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_out_n[1]                 : J2        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-nCE                          : J3        :        :                   :         : 1         :                
-TDO                          : J4        : output :                   :         : 1         :                
-TMS                          : J5        : input  :                   :         : 1         :                
-VCCINT                       : J6        : power  :                   : 1.2V    :           :                
-GND                          : J7        : gnd    :                   :         :           :                
-GND                          : J8        : gnd    :                   :         :           :                
-GND                          : J9        : gnd    :                   :         :           :                
-GND                          : J10       : gnd    :                   :         :           :                
-GND                          : J11       : gnd    :                   :         :           :                
-RESERVED_INPUT_WITH_WEAK_PULLUP : J12       :        :                   :         : 5         :                
-RESERVED_INPUT_WITH_WEAK_PULLUP : J13       :        :                   :         : 5         :                
-RESERVED_INPUT_WITH_WEAK_PULLUP : J14       :        :                   :         : 5         :                
-hdmi_clk                     : J15       : output : LVDS              :         : 5         : Y              
-hdmi_clk(n)                  : J16       : output : LVDS              :         : 5         : Y              
-abc_a[11]                    : K1        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_out_n[4]                 : K2        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-VCCIO2                       : K3        : power  :                   : 3.3V    : 2         :                
-GND                          : K4        : gnd    :                   :         :           :                
-abc_out_n[2]                 : K5        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-RESERVED_INPUT_WITH_WEAK_PULLUP : K6        :        :                   :         : 2         :                
-VCCINT                       : K7        : power  :                   : 1.2V    :           :                
-GND                          : K8        : gnd    :                   :         :           :                
-RESERVED_INPUT_WITH_WEAK_PULLUP : K9        :        :                   :         : 4         :                
-board_id                     : K10       : input  : 3.3-V LVTTL       :         : 4         : Y              
-VCCINT                       : K11       : power  :                   : 1.2V    :           :                
-RESERVED_INPUT_WITH_WEAK_PULLUP : K12       :        :                   :         : 5         :                
-GND                          : K13       : gnd    :                   :         :           :                
-VCCIO5                       : K14       : power  :                   : 2.5V    : 5         :                
-hdmi_d[0]                    : K15       : output : LVDS              :         : 5         : Y              
-hdmi_d[0](n)                 : K16       : output : LVDS              :         : 5         : Y              
-abc_a[12]                    : L1        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_inp_n[0]                 : L2        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_out_n[3]                 : L3        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_a[10]                    : L4        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-VCCA1                        : L5        : power  :                   : 2.5V    :           :                
-rngio[0]                     : L6        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-gpio[0]                      : L7        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-esp_io0                      : L8        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-RESERVED_INPUT_WITH_WEAK_PULLUP : L9        :        :                   :         : 4         :                
-abc_xoutpstb_n               : L10       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-RESERVED_INPUT_WITH_WEAK_PULLUP : L11       :        :                   :         : 4         :                
-VCCA4                        : L12       : power  :                   : 2.5V    :           :                
-usb_rx(n)                    : L13       : input  : Bus LVDS          :         : 5         : Y              
-RESERVED_INPUT_WITH_WEAK_PULLUP : L14       :        :                   :         : 5         :                
-sd_cd_n                      : L15       : input  : 2.5 V             :         : 5         : Y              
-usb_rx                       : L16       : input  : Bus LVDS          :         : 5         : Y              
-GND+                         : M1        :        :                   :         : 2         :                
-GND+                         : M2        :        :                   :         : 2         :                
-VCCIO2                       : M3        : power  :                   : 3.3V    : 2         :                
-GND                          : M4        : gnd    :                   :         :           :                
-GNDA1                        : M5        : gnd    :                   :         :           :                
-abc_d[1]                     : M6        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-spi_miso                     : M7        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-spi_mosi                     : M8        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-abc_inp_n[1]                 : M9        : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-abc_a[6]                     : M10       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-hdmi_scl                     : M11       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-GNDA4                        : M12       : gnd    :                   :         :           :                
-GND                          : M13       : gnd    :                   :         :           :                
-VCCIO5                       : M14       : power  :                   : 2.5V    : 5         :                
-clock_16                     : M15       : input  : 3.3-V LVTTL       :         : 5         : Y              
-GND+                         : M16       :        :                   :         : 5         :                
-abc_a[15]                    : N1        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_a[14]                    : N2        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_xmemfl_n                 : N3        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-VCCD_PLL1                    : N4        : power  :                   : 1.2V    :           :                
-abc_d[2]                     : N5        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-spi_cs_flash_n               : N6        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-GND                          : N7        : gnd    :                   :         :           :                
-spi_cs_esp_n                 : N8        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-exth_hb                      : N9        : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-GND                          : N10       : gnd    :                   :         :           :                
-exth_hg                      : N11       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-exth_ha                      : N12       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-VCCD_PLL4                    : N13       : power  :                   : 1.2V    :           :                
-RESERVED_INPUT_WITH_WEAK_PULLUP : N14       :        :                   :         : 5         :                
-hdmi_d[1]                    : N15       : output : LVDS              :         : 5         : Y              
-hdmi_d[1](n)                 : N16       : output : LVDS              :         : 5         : Y              
-abc_xmemw800_n               : P1        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_rst_n                    : P2        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-abc_d[0]                     : P3        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-VCCIO3                       : P4        : power  :                   : 3.3V    : 3         :                
-GND                          : P5        : gnd    :                   :         :           :                
-spi_clk                      : P6        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-VCCIO3                       : P7        : power  :                   : 3.3V    : 3         :                
-esp_int                      : P8        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-gpio[1]                      : P9        : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-VCCIO4                       : P10       : power  :                   : 3.3V    : 4         :                
-rngio[1]                     : P11       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-GND                          : P12       : gnd    :                   :         :           :                
-VCCIO4                       : P13       : power  :                   : 3.3V    : 4         :                
-led[1]                       : P14       : output : 3.3-V LVTTL       :         : 4         : Y              
-RESERVED_INPUT_WITH_WEAK_PULLUP : P15       :        :                   :         : 5         :                
-hdmi_d[2](n)                 : P16       : output : LVDS              :         : 5         : Y              
-abc_xmemw80_n                : R1        : bidir  : 3.3-V LVTTL       :         : 2         : Y              
-GND                          : R2        : gnd    :                   :         :           :                
-abc_d[4]                     : R3        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-abc_d[6]                     : R4        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-abc_d_oe                     : R5        : output : 3.3-V LVTTL       :         : 3         : Y              
-abc_resin_x                  : R6        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-gpio[5]                      : R7        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-exth_hh                      : R8        : input  : 3.3-V LVTTL       :         : 3         : Y              
-GND+                         : R9        :        :                   :         : 4         :                
-gpio[3]                      : R10       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-exth_hd                      : R11       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-exth_he                      : R12       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-hdmi_sda                     : R13       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-led[0]                       : R14       : output : 3.3-V LVTTL       :         : 4         : Y              
-GND                          : R15       : gnd    :                   :         :           :                
-hdmi_d[2]                    : R16       : output : LVDS              :         : 5         : Y              
-VCCIO3                       : T1        : power  :                   : 3.3V    : 3         :                
-abc_d[3]                     : T2        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-abc_d[5]                     : T3        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-abc_d[7]                     : T4        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-abc_clk                      : T5        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-gpio[2]                      : T6        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-gpio[4]                      : T7        : bidir  : 3.3-V LVTTL       :         : 3         : Y              
-GND+                         : T8        :        :                   :         : 3         :                
-exth_hc                      : T9        : input  : 3.3-V LVTTL       :         : 4         : Y              
-abc_a[1]                     : T10       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-exth_hf                      : T11       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-abc_xinpstb_n                : T12       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-led[2]                       : T13       : output : 3.3-V LVTTL       :         : 4         : Y              
-abc_a[13]                    : T14       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-hdmi_hpd                     : T15       : bidir  : 3.3-V LVTTL       :         : 4         : Y              
-VCCIO4                       : T16       : power  :                   : 3.3V    : 4         :                

BIN
fpga/output/v2boot.rbf.gz


BIN
fpga/output/v2boot.sof


BIN
fpga/output/v2boot.svf.gz


BIN
fpga/output/v2boot.xsvf.gz


+ 113 - 0
fpga/scripts/getvir.pl

@@ -0,0 +1,113 @@
+#!/usr/bin/perl
+
+use strict;
+use integer;
+
+our %consts;
+
+require '../iodevs.conf';
+
+my $ramaddr    = $consts{'SDRAM_ADDR'};
+my $flashcmd   = 0xabc80046;
+my $flashpfx   = 0xabc80fed;
+my $maxdatalen = 16 << 20;
+
+my($rptfile, $binfile, $svffile) = @ARGV;
+
+open(my $in, '<', $rptfile)
+    or die "$0: $rptfile: $!\n";
+
+my @vjif;
+
+while (defined(my $l = <$in>)) {
+    my @lf = split(/\s*\;\s*/, $l);
+
+    if ($lf[8] =~ /\|vjtag\:vjtag\|/) {
+	@vjif = @lf;
+    }
+}
+close($in);
+
+# [0] - blank
+# [1] - instance index
+# [2] - auto index
+# [3] - index changed
+# [4] - IR width
+# [5] - VIR base address
+# [6] - USER1 DR length
+# [7] - VIR capture command
+# [8] - hierarchial entity name
+
+my $virbits  = $vjif[6];
+my $virbase  = hex $vjif[5];
+my $vircap   = hex $vjif[7];
+
+open(my $bin, '<', $binfile)
+    or die "$0: $binfile: $!\n";
+binmode($bin);
+my $bindata;
+my $binlen = read($bin, $bindata, $maxdatalen);
+close($bin);
+
+open(my $svf, '>', $svffile)
+        or die "$0: $svffile: $!\n";
+
+
+sub print_bitstring($$$) {
+    my($svf, $len, $data) = @_;
+
+    my $lenbytes = ($len+7) >> 3;
+
+    if (length($data) < $lenbytes) {
+	$data = ("\0" x ($len - $lenbytes)) . $data;
+    }
+
+    my $b = -1 - (length($data)-$lenbytes);
+    my $bytes = 0;
+    while ($len > 7) {
+	printf $svf "%02X", unpack("C", substr($data, $b--, 1));
+	if (!(++$bytes & 63)) {
+	    print $svf "\n\t";
+	}
+	$len -= 8;
+    }
+
+    if ($len) {
+	my $lb = unpack("C", substr($data, $b--, 1));
+	$lb &= (1 << $len)-1;
+	printf $svf "%0".(($len+3)>>2)."X", $lb;
+    }
+}
+
+sub virt_sir($$) {
+    my($svf, $cmd) = @_;
+
+    print $svf "SIR 10 TDI (00E);\n";
+    printf $svf "SDR %d TDI (", $virbits;
+    print_bitstring($svf, $virbits, pack("V", $virbase | $cmd));
+    print $svf ");\n";
+    print $svf "SIR 10 TDI (00C);\n";
+}
+
+# Set address command
+my $ramaddr = 0x40000000;
+
+virt_sir($svf, 0x12);
+printf $svf "SDR 32 TDI (%08X);\n", $ramaddr;
+
+# Write data to SDRAM
+virt_sir($svf, 0x16);
+$bindata = pack("V", $flashpfx) . $bindata;
+my $binbits = length($bindata) << 3;
+printf $svf "SDR %d\n   TDI (", $binbits;
+print_bitstring($svf, $binbits, $bindata);
+print $svf ");\n";
+
+# Trigger flash command to firmware
+virt_sir($svf, 0x1a);
+printf $svf "SDR 32 TDI (%08X);\n", $flashcmd;
+
+# Idle JTAG
+print $svf "SIR 10 TDI (3FF);\n";
+print $svf "STATE IDLE;\n";
+

+ 35 - 31
fpga/spirom.sv

@@ -242,7 +242,10 @@ module spirom (
    reg	       spi_in_req;
    reg	       spi_in_req_q;
 
-   localparam spi_cs_wait_lg2 = 0; // 8 bit times between CS# and first clock
+   // Wait these many bit times between low CS# and the first data
+   // clock (tSHCH), and between CS# high and the next CS# high
+   // (tSHSL). The worst of these is tSHSL2 = 50 ns = 8 cycles @ 134 MHz.
+   localparam spi_cs_wait_lg2 = 3;
    reg [spi_cs_wait_lg2:0]   spi_cs_ctr;
    wire			     spi_cs_ready = spi_cs_ctr[spi_cs_wait_lg2];
 
@@ -268,21 +271,21 @@ module spirom (
    always @(negedge rst_n or posedge rom_clk)
      if (~rst_n)
        begin
-	  spi_cmd_ctr  <= 6'b0;
-	  spi_clk_en   <= 1'b0;
-	  spi_clk_en_q <= 'b0;
-	  spi_data_ctr <= 27'b0;
-	  spi_cs_n     <= 1'b1;
-	  spi_cs_ctr   <= 'b0;
-	  spi_in_req   <= 1'b0;
-	  spi_in_req_q <= 1'b0;
+	  spi_cmd_ctr    <= 6'b0;
+	  spi_clk_en     <= 1'b0;
+	  spi_clk_en_q   <= 'b0;
+	  spi_data_ctr   <= 27'b0;
+	  spi_cs_n       <= 1'b1;
+	  spi_cs_ctr     <= 'b0;
+	  spi_in_req     <= 1'b0;
+	  spi_in_req_q   <= 1'b0;
 	  spi_ram_in_req <= 1'b0;
-	  spi_mosi_en  <= 1'b1;
-	  spi_in_shr   <= 32'b0;
-	  spi_active   <= 1'b0;
-	  spi_active_q <= 1'b0;
-	  spi_more_q   <= 1'b0;
-	  spi_out_shr  <= 32'b0;
+	  spi_mosi_en    <= 1'b1;
+	  spi_in_shr     <= 32'b0;
+	  spi_active     <= 1'b0;
+	  spi_active_q   <= 1'b0;
+	  spi_more_q     <= 1'b0;
+	  spi_out_shr    <= 32'b0;
        end
      else
        begin
@@ -306,14 +309,11 @@ module spirom (
 	  if ( spi_clk_en_q )
 	    spi_out_shr <= { spi_out_shr[30:0], 1'b1 };
 
-	  // After asserting CS#, wait 8 SPI clock times
-	  if (spi_cs_n)
-	    spi_cs_ctr <= 'b0;
-	  else
-	    spi_cs_ctr <= spi_cs_ctr + !spi_cs_ready;
+	  // CS# delay counter (see above)
+	  spi_cs_ctr <= spi_cs_ctr + !spi_cs_ready;
 
 	  // Note: datalen <- spi_data_ctr is a 2-cycle multipath
-	  if (go_spi_s & ~spi_active)
+	  if (go_spi_s & ~spi_active & spi_cs_ready)
 	    begin
 	       // Starting new transaction
 	       spi_cmd_ctr  <= { cmdlen,  3'b0 };
@@ -328,13 +328,17 @@ module spirom (
 	       // Transaction completed
 	       spi_clk_en  <= 1'b0;
 	       spi_mosi_en <= 1'b1;
-	       spi_active  <= 1'b0;
 	       spi_cs_n    <= ~spi_more_q;
+	       spi_active  <= 1'b0;
+	       if (~spi_more_q)
+		 spi_cs_ctr <= 'b0;
 	    end
 	  else
 	    begin
 	       spi_active   <= 1'b1;
 	       spi_cs_n     <= 1'b0;
+	       if ( ~spi_active )
+		 spi_cs_ctr <= 'b0;
 
 	       if ( spi_active & spi_cs_ready )
 		 begin
@@ -346,16 +350,16 @@ module spirom (
 
 		    if ( spi_clk_en & ~|spi_cmd_ctr )
 		      spi_in_req <= spi_data_ctr[-3] | spi_dual;
-		 end // if ( spi_active & spi_cs_ready )
 
-	       if ( (spi_active & ~spi_active_q) | spi_clk_en )
-		 begin
-		    // This is either the kickoff cycle or advancing
-		    if ( ~|spi_cmd_ctr )
-		      spi_data_ctr <= spi_data_ctr - (1'b1 << spi_dual);
-		    else
-		      spi_cmd_ctr <= spi_cmd_ctr - 1'b1;
-		 end // if ( spi_clk_en )
+		    if (  ~spi_active_q | spi_clk_en )
+		      begin
+			 // This is either the kickoff cycle or advancing
+			 if ( ~|spi_cmd_ctr )
+			   spi_data_ctr <= spi_data_ctr - (1'b1 << spi_dual);
+			 else
+			   spi_cmd_ctr <= spi_cmd_ctr - 1'b1;
+		      end // if ( spi_clk_en )
+		 end // if ( spi_active & spi_cs_ready )
 	    end // else: !if( ~|{spi_data_ctr, spi_cmd_ctr} )
        end // else: !if(~rst_n)
 

+ 0 - 13
fpga/v2boot.qsf

@@ -1,13 +0,0 @@
-# -*- tcl -*-
-
-set_global_assignment -name TOP_LEVEL_ENTITY v2boot
-set_global_assignment -name SOURCE_FILE "output/v2boot.jic.cof"
-set_global_assignment -name SYSTEMVERILOG_FILE v2boot.sv
-set_global_assignment -name SYSTEMVERILOG_FILE bootldr.sv
-
-set_global_assignment -name SOURCE_TCL_SCRIPT_FILE v2_common.qsf
-
-#nodeps: output/sram.mif
-
-# Quartus insists on this line...
-set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top

+ 0 - 1
fpga/v2boot_description.txt

@@ -1 +0,0 @@
-Boot loader configuration for MAX80 v2

+ 27 - 28
rv32/Makefile

@@ -16,14 +16,13 @@ include ../riscv-opts.mk
 CPPFLAGS  = $(INCLUDE) $(riscv_flags)
 CFLAGS    = $(CPPFLAGS) -W -Wextra
 SFLAGS    = $(CPPFLAGS) -D__ASSEMBLY__
-LDSCRIPT  = max80.ild
 LDFLAGS   = $(CFLAGS) \
 	    -Wl,-Map=$*.map \
 	    -Wl,--gc-sections \
 	    -Wl,--sort-section=alignment \
-	    -Wl,-T,$(LDSCRIPT) \
 	    -Wl,-z,common-page-size=16 \
-	    -Wl,-z,max-page-size=16
+	    -Wl,-z,max-page-size=16 \
+	    -Wl,-z muldefs
 
 gendeps   = -MD -MF $(@D)/.$(@F).d -MT $@
 
@@ -36,30 +35,26 @@ gendeps   = -MD -MF $(@D)/.$(@F).d -MT $@
 genhdrs = iodevs.h irqtable.h
 gensrcs =
 
-all: boot.bin dram.bin.gz dram.hex checksum.h
+all: sram.bin jtagupd.bin dram.bin.gz dram.hex checksum.h
+
+LIBS    = max80.a fatfs.a zlib.a
+
 
 ROMS    := $(wildcard roms/*.rom)
 ROMOBJS  = $(ROMS:.rom=.o)
 
-max80.elf: head.o dummy.o die.o main.o system.o \
-	  ioregsa.o irqasm.o irqtable.o spurious_irq.o sbrk.o \
-	  console.o rtc.o romcopy.o spiflash.o \
-	  sdcard.o diskcache.o \
-	  abcmem.o abcio.o abcdisk.o abcrtc.o abcpun80.o \
-	  memset.o memcpy.o \
-	  runtest.o start_test.o \
-	  $(ROMOBJS) \
-	  testimg.o \
-	  fatfs.a
-
-testimg.elf: head.o dummy.o die.o test/main.o test/system.o \
-	  ioregsa.o irqasm.o irqtable.o spurious_irq.o sbrk.o \
-	  console.o rtc.o romcopy.o spiflash.o \
-	  sdcard.o diskcache.o \
-	  abcmem.o abcio.o abcdisk.o abcrtc.o abcpun80.o \
-	  memset.o memcpy.o \
-	  testdata.o $(ROMOBJS) \
-	  fatfs.a
+LIBOBJ   = head.o dummy.o die.o system.o \
+	   ioregsa.o irqasm.o irqtable.o spurious_irq.o sbrk.o \
+	   console.o rtc.o romcopy.o spiflash.o \
+	   sdcard.o diskcache.o \
+	   abcmem.o abcio.o abcdisk.o abcrtc.o abcpun80.o \
+	   memset.o memcpy.o \
+	   runtest.o start_test.o \
+	   $(ROMOBJS)
+
+max80.a: $(LIBOBJ)
+	rm -f $@
+	$(AR) cq $@ $(LIBOBJ)
 
 FATFS_C = $(wildcard fatfs/source/*.c)
 FATFS_O = $(FATFS_C:.c=.o)
@@ -84,17 +79,20 @@ CFLAGS_memset.c := -O2
 %.mem: %.bin
 	$(BIN2MEM) $< > $@
 
-boot.bin: max80.elf
+sram.bin: max80.elf
 	$(OBJCOPY) -O binary -R '.dram*' $< $@
 
 dram.bin: max80.elf
 	$(OBJCOPY) -O binary -j '.dram*' $< $@
 
+%.bin: %.elf
+	$(OBJCOPY) -O binary $< $@
+
 %.gz: %
 	$(GZIP) -9 < $< > $@
 
-checksum.h: dram.bin boot.bin checksum.pl
-	$(PERL) checksum.pl -o $@ -p boot.bin \
+checksum.h: dram.bin sram.bin checksum.pl
+	$(PERL) checksum.pl -o $@ -p sram.bin \
 		-l $$(($$($(NM) -n max80.elf --radix=decimal | \
 			grep ' [A-Z] __dram_init_end$$' | \
 	                awk '{ print $$1; }') - (1 << 30))) \
@@ -108,8 +106,9 @@ testimg.o: testimg.S testimg.bin
 %.hex: %.bin
 	$(OBJCOPY) -I binary -O ihex $< $@
 
-%.elf: $(LDSCRIPT)
-	$(CC) $(LDFLAGS) -o $@ $(filter-out $(LDSCRIPT),$^)
+%.elf: %.ild %.o $(LIBS)
+	$(CC) $(LDFLAGS) -Wl,-T,$< -o $@ \
+		-Wl,--start-group $(filter-out $<,$^)
 
 %.o: %.c | $(genhdrs)
 	$(CC) $(CFLAGS) $(CFLAGS_$<) $(gendeps) -c -o $@ $<

+ 1 - 1
rv32/checksum.h

@@ -1,4 +1,4 @@
 #ifndef CHECKSUM_H
 #define CHECKSUM_H
-#define SDRAM_SUM 0xf0001ce9
+#define SDRAM_SUM 0xb5bad356
 #endif

+ 3 - 3
rv32/console.h

@@ -20,7 +20,7 @@ static __always_inline void __con_wait_tx_ready(void)
     while (CON_FLOW_CTL &&
 	   (CON_STATUS & (TTY_STATUS_TX_HIGH|TTY_STATUS_DTR_IN))
 	   == (TTY_STATUS_TX_HIGH|TTY_STATUS_DTR_IN))
-	pause();
+	relax();
 }
 
 static __always_inline void __con_putc(char c)
@@ -42,7 +42,7 @@ static __always_inline void _con_putc(char c)
 static __always_inline void _con_puts(const char *str)
 {
     char c;
-    
+
     __con_wait_tx_ready();
 
     while ((c = *str++))
@@ -73,7 +73,7 @@ static __always_inline void con_puts(const char *str)
 static __always_inline void con_flush(void)
 {
     while (CON_FLOW_CTL && !(CON_STATUS & TTY_STATUS_TX_EMPTY))
-	pause();
+	relax();
 }
 
 void con_print_hex(unsigned int); /* For pre-SDRAM capable code */

+ 4 - 0
rv32/fw.h

@@ -26,6 +26,9 @@ extern const size_t __rom_offset;
 extern const uint32_t __dram_checksum;
 extern const char __datestamp[];
 
+extern char __dram_init_start[], __dram_init_end[];
+extern char __dram_bss_start[],  __dram_bss_end[];
+
 extern no_return _die(void);
 extern no_return exit(int);
 extern no_return _exit(int);
@@ -67,4 +70,5 @@ extern qword_t rom_serial;
 
 extern void run_test_image(void);
 
+extern void rom_flash_from_memory(void *, size_t);
 #endif /* FW_H */

+ 3 - 3
rv32/io.h

@@ -10,7 +10,7 @@
 
 #define barrier() do { asm volatile("" : : : "memory"); } while (0)
 
-static __always_inline void pause(void)
+static __always_inline void relax(void)
 {
     /* Placeholder for anything that might want to be done while waiting */
 }
@@ -70,7 +70,7 @@ static __always_inline void udelay(uint32_t us)
 	uint32_t start = rdtime();
 
 	while (rdtime() - start < cycles)
-	    pause();
+	    relax();
     }
 }
 
@@ -82,7 +82,7 @@ static inline void i2c_set_speed(unsigned int khz)
 static __always_inline void wait_romcopy_done(void)
 {
     while (~irqmask() & (1 << ROMCOPY_IRQ))
-	pause();
+	relax();
 
     barrier();
 }

+ 55 - 0
rv32/jtagupd.c

@@ -0,0 +1,55 @@
+#include "fw.h"
+#include "io.h"
+#include "sys.h"
+#include "console.h"
+
+#define VJTAG_FLASH_CMD	0xabc80046
+
+/* IRQ handler not needed in this system */
+IRQHANDLER_DECL(spurious,0);
+
+IRQHANDLER(abc,0)
+{
+    irqhandler_spurious_0(vector, pc);
+}
+IRQHANDLER(tty,1)
+{
+    irqhandler_spurious_0(vector, pc);
+}
+IRQHANDLER(romcopy,0)
+{
+    irqhandler_spurious_0(vector, pc);
+}
+
+/*
+ * SDRAM upload buffer - always first in SDRAM
+ */
+static uint8_t __attribute__((section(".jtag_flash_buffer")))
+jtag_flash_buf[17 << 20];	/* 16 MB + some slack */
+
+void main(void)
+{
+    static const char hello[] =
+	"\n\nMAX80 JTAG update firmware compiled on: ";
+
+    unmask_irqs((1U << EBREAK_IRQ)|(1U << BUSERR_IRQ));
+
+    romcopy_bzero(__dram_bss_start, __dram_bss_end - __dram_bss_start);
+
+    con_puts(hello);
+    con_puts(__datestamp);
+    con_putc('\n');
+
+    while (1) {
+	uint32_t cmd;
+
+	waitfor(VJTAG_IRQ);
+	cmd = VJTAG_CPUCMD;
+
+	if (cmd != VJTAG_FLASH_CMD)
+	    con_printf("JTAG: unknown command: 0x%08x\n", cmd);
+
+	con_puts("JTAG: starting firmware flash process\n");
+	rom_flash_from_memory(jtag_flash_buf, sizeof jtag_flash_buf);
+    }
+}

+ 297 - 0
rv32/jtagupd.ld

@@ -0,0 +1,297 @@
+/* -*- ld-script -*-
+ *
+ * Linker script for MAX80 flash bootloader firmware
+ * There is no flash available here; DRAM may be used for bss alone,
+ * and the flash data buffer must come first.
+ */
+
+#define __ASSEMBLY__
+#define __LDSCRIPT__
+#include "sys.h"
+#include "iodevs.h"
+#include "iodeva.h"
+
+OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv",
+              "elf32-littleriscv")
+OUTPUT_ARCH(riscv)
+ENTRY(___reset)
+
+MEMORY
+{
+	SRAM	: org = SRAM_ADDR,  len = SRAM_SIZE
+	DRAM	: org = SDRAM_ADDR, len = SDRAM_SIZE
+	DRAM2   : org = SDRAM_ADDR+SDRAM_SIZE, len = SDRAM_SIZE
+}
+
+SECTIONS
+{
+	/* Debugging sections */
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+  .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
+  /* DWARF debug sections.
+     Symbols in the DWARF debugging sections are relative to the beginning
+     of the section so we begin them at 0.  */
+  /* DWARF 1.  */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions.  */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2.  */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2.  */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions.  */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /* DWARF 3.  */
+  .debug_pubtypes 0 : { *(.debug_pubtypes) }
+  .debug_ranges   0 : { *(.debug_ranges) }
+  /* DWARF 5.  */
+  .debug_addr     0 : { *(.debug_addr) }
+  .debug_line_str 0 : { *(.debug_line_str) }
+  .debug_loclists 0 : { *(.debug_loclists) }
+  .debug_macro    0 : { *(.debug_macro) }
+  .debug_names    0 : { *(.debug_names) }
+  .debug_rnglists 0 : { *(.debug_rnglists) }
+  .debug_str_offsets 0 : { *(.debug_str_offsets) }
+  .debug_sup      0 : { *(.debug_sup) }
+  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
+  .riscv.attributes 0 : { KEEP(*(.riscv.attributes)) }
+  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
+
+	/*
+	 * Sections we do not need. This program cannot exit, so
+	 * fini/destructors are never needed. Exception handling
+	 * is not supported.
+	 */
+	 /DISCARD/	: {
+		*(.note.GNU-stack)
+		*(.gnu_debuglink)
+		*(.gnu.lto_*)
+		*(.discard)
+		*(.discard.*)
+		*(.dtors.*)
+		*(.dtors)
+		*(.fini_array)
+		*(.fini_array.*)
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*)
+		*(.eh_frame) *(.eh_frame.*)
+		*(.gcc_except_table .gcc_except_table.*)
+		*(.gnu_extab*)
+		*(.exception_ranges*)
+		*(.text.exit .text.exit.*)
+		*crtbegin.o(*)
+		*crt0.o(*)
+	}
+
+	. = 0;
+	PROVIDE (__executable_start = .);
+
+	/*
+	 * Make sure the output binary starts at address 0
+	 */
+	.null 0 : {
+		PROVIDE(___NULL = .);
+		KEEP (*(SORT_NONE(.null)))
+	}
+
+	.init.reset _PC_RESET : ALIGN(4) {
+		PROVIDE (___reset = .);
+		KEEP (*(SORT_NONE(.init.reset)))
+	}
+
+	.init.irq _PC_IRQ : ALIGN(4) {
+		PROVIDE (___irq = .);
+		KEEP (*(SORT_NONE(.init.irq)))
+	}
+
+	/* .rwtext is in the zero page */
+	.rwtext : ALIGN(4) {
+		PROVIDE (__rwtext_start = .);
+		*(.rwtext*)
+		PROVIDE (__rwtext_end = .);
+	}
+
+	/*
+	 * Put the short data sections in the zero page.
+	 * This means the initialized sections aren't contiguous, but
+	 * all memory is intialized during FPGA load anyway.
+	 */
+	. = ALIGN(4);
+	__SDATA_BEGIN__ = .;
+	.srodata : {
+		*(.srodata*)
+	}
+	.sdata : {
+		*(.sdata .sdata.* .gnu.linkonce.s.*)
+	}
+	.sdata2 : {
+		*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)
+	}
+
+	. = ALIGN(32);
+	__BSS_START__ = .;
+	PROVIDE (__bss_start = .);
+	.sbss (NOLOAD) : ALIGN(4) {
+		*(.dynsbss)
+		*(.sbss .sbss.* .gnu.linkonce.sb.*)
+		*(.scommon)
+	}
+	.sbss2 (NOLOAD) : {
+	       *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
+	}
+
+	HIDDEN($assert_zero_page = ASSERT((. <= 2048), "zero page overflow"));
+
+	.bss (NOLOAD) : {
+		*(.dynbss)
+		*(.bss.*hot* .gnu.linkonce.b.*)
+		*(COMMON)
+	}
+	. = ALIGN(32);
+	__BSS_END__ = .;
+	__BSS_LEN__ = __BSS_END__ - __BSS_START__;
+
+	. = ALIGN(4);
+	__BSS_END__ = .;
+	__BSS_LEN__ = __BSS_END__ - __BSS_START__;
+
+	__global_pointer$ = 0;
+
+	PROVIDE(___text = .);
+
+	.init : ALIGN(4) {
+		KEEP (*(SORT_NONE(.init)))
+	}
+
+	.text : ALIGN(4) {
+		*(.text.startup .text.startup.*)
+		*(.text.hot .text.hot.*)
+		KEEP(sbrk.o(.text))
+		*(.gnu.linkonce.t.*)
+		*(SORT(.text.sorted.*))
+		*(.text .stub .text.*)
+	        *(.text.*unlikely*)
+		*(.dram.text*)
+	}
+	PROVIDE (__etext = .);
+	PROVIDE (_etext = .);
+
+	. = ALIGN(4);
+	.str : ALIGN(4) {
+		*(.rodata*.hot.str*)
+		*(.rodata*.str* .dram.rodata*.str*)
+	}
+	.rodata : {
+		*(.rodata*.hot* .gnu.linkonce.r.*)
+		*(.rodata* .dram.rodata*)
+	}
+	.data : {
+		*(.dram.data* .data*)
+	}
+
+	/* Thread Local Storage sections  */
+	.tdata          : {
+		PROVIDE_HIDDEN (__tdata_start = .);
+		*(.tdata .tdata.* .gnu.linkonce.td.*)
+	}
+	.tbss       : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
+	.preinit_array : ALIGN(4) {
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP (*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+	}
+	.init_array : ALIGN(4) {
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*)
+		SORT_BY_INIT_PRIORITY(.ctors.*)))
+		KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
+		PROVIDE_HIDDEN (__init_array_end = .);
+	} >DRAM
+
+	/* Are these necessary/supportable? */
+	  .jcr          : { KEEP (*(.jcr)) }
+	.data.rel.ro	: {
+			*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)
+	}
+
+.data           : {
+		__DATA_BEGIN__ = .;
+		*(.data .data.* .gnu.linkonce.d.*)
+		SORT(CONSTRUCTORS)
+	}
+	.data1          : { *(.data1) }
+	_edata = .;
+	_end = .;
+
+	/* Patched in during FPGA compile, must immediately follow _end */
+	.datestamp (NOLOAD) : { KEEP(*(.datestamp)) }
+
+	HIDDEN($sram_size_assert = ASSERT(. <= STACK_BOTTOM, "SRAM overflow"));
+
+	. = STACK_BOTTOM;
+	.stack (NOLOAD) : {
+		KEEP (*(.stack))
+	}
+
+	/* Sections in SDRAM */
+	. = SDRAM_ADDR;
+
+	.jtag_flash_buffer (NOLOAD) : {
+		  *(.jtag_flash_buffer)
+	} >DRAM
+
+	__dram_bss_start = .;
+	.dram.bss (NOLOAD) : ALIGN(8) {
+		*(.dram.bss* .bss*)
+	} >DRAM
+	. = ALIGN(8);
+	__dram_bss_end = .;
+	__dram_bss_len = __dram_bss_end - __dram_bss_start;
+
+	/* Like BSS except no need to clear on boot */
+	.dram.noinit (NOLOAD) : ALIGN(8) {
+		*(.dram.noinit*)
+	} >DRAM
+
+	/* No need to zero the heap */
+	.heap (NOLOAD) : ALIGN(16) {
+		*(.heap*)
+	} >DRAM
+
+	__dram_end = .;
+
+	/* Dummy section containing I/O device symbols */
+	. = XDEV_ADDR_BASE;
+	.iodevs (NOLOAD) : {
+		. = .;		/* Force output */
+		KEEP(*(.iodevs))
+	}
+
+	/* Catch missing sections */
+	. = __dram_end;
+	__junk_start = .;
+	.junk : {
+		*(*)
+	}
+	__junk_end = .;
+
+/*	HIDDEN($assert_no_junk = ASSERT(__junk_end == __junk_start, "unknown sections present")); */
+}

+ 0 - 5
rv32/main.c → rv32/max80.c

@@ -4,8 +4,6 @@
 #include "sys.h"
 #include "console.h"
 
-volatile bool dont_gc = false;	/* Keep things from linker gc */
-
 void __hot main(void)
 {
     unsigned int max_abc_latency = 0;
@@ -13,9 +11,6 @@ void __hot main(void)
 
     init();
 
-    if (dont_gc)
-	run_test_image();
-
     while (1) {
 	wait_for_irq();
 

+ 4 - 0
rv32/max80.ld

@@ -182,6 +182,7 @@ SECTIONS
 	.text.hot : ALIGN(4) {
 		*(.text.startup .text.startup.*)
 		*(.text.hot .text.hot.*)
+		KEEP(sbrk.o(.text))
 		*(.gnu.linkonce.t.*)
 	}
 	PROVIDE (__etext = .);
@@ -283,6 +284,8 @@ SECTIONS
 	__dram_init_len = __dram_init_end - __dram_init_start;
 
 	/* Keeps ld from getting confused */
+
+#if 0
 	. = . + SDRAM_SIZE;
 
 	/* Test program image - overlays */
@@ -290,6 +293,7 @@ SECTIONS
 		   AT(SRAM_SIZE + __dram_init_len) ALIGN(4) {
 		   KEEP(*(.dram.test*))
 	} >DRAM2
+#endif
 
 	/* bss can overlay the test program image */
 	. = __dram_init_end;

+ 171 - 4
rv32/romcopy.c

@@ -1,9 +1,7 @@
 #include "fw.h"
 #include "console.h"
 #include "io.h"
-
-extern char __dram_init_start[], __dram_init_end[];
-extern char __dram_bss_start[],  __dram_bss_end[];
+#include "spiflash.h"
 
 enum romcmd {
     ROM_WRITE_ENABLE			= 0x06,
@@ -105,7 +103,7 @@ static __must_inline void rom_read_serial(void)
 static __must_inline void rom_mangle_serial(void)
 {
     volatile uint32_t *udp = &usbdesc_rom[2];
-    
+
     for (int i = 7; i >= 0; i--) {
 	unsigned int v = rom_serial.b[i];
 	unsigned int c;
@@ -177,3 +175,172 @@ IRQHANDLER(romcopy,0)
 	break;
     }
 }
+
+/*
+ * SPI flash parameters and routines (for spiflash.c)
+ */
+static const struct spiflash_ops max80_spiflash_ops;
+static const struct spiflash_param max80_spiflash_param;
+
+/*
+ * SPI flash operations
+ */
+static int max80_spi_write_buffer(const void *buf, unsigned int buflen,
+				  bool more)
+{
+    const uint8_t *p = buf;
+    uint32_t cmd = 0;
+    unsigned int bytecmd = 0;
+
+    while (buflen) {
+	cmd = (*p++ << 24) | (cmd >> 8);
+	buflen--;
+	bytecmd += ROMCOPY_SPI_CMDLEN(1);
+
+	if (!(buflen & 3)) {
+	    if (buflen || more)
+		bytecmd |= ROMCOPY_SPI_MORE;
+	    waitfor(ROMCOPY_IRQ);
+	    ROMCOPY_ROMCMD  = cmd;
+	    ROMCOPY_DATALEN = bytecmd;
+	    bytecmd = cmd = 0;
+	}
+    }
+
+    return 0;
+}
+
+static int max80_spi_read_buffer(void *buf, unsigned int buflen, bool more)
+{
+    uint8_t *p = buf;
+    unsigned int bytecmd;
+    uint32_t v;
+
+    if (!buflen)
+	return 0;
+
+    waitfor(ROMCOPY_IRQ);
+    ROMCOPY_ROMCMD = 0;
+
+    while (buflen > 4) {
+	ROMCOPY_DATALEN = ROMCOPY_SPI_CMDLEN(4) | ROMCOPY_SPI_MORE;
+	waitfor(ROMCOPY_IRQ);
+	v = ROMCOPY_INPUT;
+	p[0] = v >> 24;
+	p[1] = v >> 16;
+	p[2] = v >> 8;
+	p[3] = v;
+	p += 4;
+	buflen -= 4;
+    }
+
+    bytecmd = ROMCOPY_SPI_CMDLEN(buflen);
+    if (more)
+	bytecmd |= ROMCOPY_SPI_MORE;
+
+    ROMCOPY_DATALEN = bytecmd;
+    waitfor(ROMCOPY_IRQ);
+    v = ROMCOPY_INPUT;
+    v <<= ((4-buflen) << 3);
+    while (buflen--) {
+	*p++ = v >> 24;
+	v <<= 8;
+    }
+
+    return 0;
+}
+
+static int max80_spi_write(void *cookie,
+			   const void *cmd, unsigned int cmd_len,
+			   const void *data, unsigned int data_len,
+			   int tshsl)
+{
+    (void)cookie;
+    (void)tshsl;		/* Enforced in hardware */
+
+    if (cmd_len)
+	max80_spi_write_buffer(cmd, cmd_len, !!data_len);
+
+    if (data_len)
+	max80_spi_write_buffer(data, data_len, false);
+
+    return 0;
+}
+
+static int max80_spi_read(void *cookie,
+		    const void *cmd, unsigned int cmd_len,
+		    void *data, unsigned int data_len,
+		    int tshsl)
+{
+    (void)cookie;
+    (void)tshsl;		/* Enforced in hardware */
+
+    if (cmd_len)
+	max80_spi_write_buffer(cmd, cmd_len, !!data_len);
+    if (data_len)
+	max80_spi_read_buffer(data, data_len, false);
+
+    return 0;
+}
+
+static const struct spiflash_ops max80_spiflash_ops = {
+    .read_data  = NULL,		/* From memory buffer */
+    .close_data = NULL,		/* Nothing to do */
+    .spi_write  = max80_spi_write,
+    .spi_read   = max80_spi_read,
+    .yield      = NULL		/* Nothing to yield to... */
+};
+
+/* Winbond W25Q128JV @ 3.3V */
+#define NS(x) (((x)*(unsigned long long)CPU_HZ + 999999999ULL)/1000000000ULL)
+#define US(x) (((x)*(unsigned long long)CPU_HZ + 999999ULL)/1000000ULL)
+#define MS(x) (((x)*(unsigned long long)CPU_HZ + 999ULL)/1000ULL)
+static const struct spiflash_param max80_spiflash_param = {
+    /*
+     * For W25Q128JV _DYNAMIC is equivalent to _24BIT, but specifying
+     * it as dynamic would most of the time support larger parts
+     * transparently.
+     */
+    .addr   = SPIFLASH_ADDR_DYNAMIC,
+
+    .tshsl  = NS(3),
+    .tshsl1 = NS(10),
+    .tshsl2 = NS(50),
+
+    .trst   = NS(30000),
+    .tw     = MS(10),		/* persistent; typ, max = 15 */
+    .tpp    = NS(400),		/* typ, max = 3000 */
+    .tse    = MS(45),		/* typ, max = 400 */
+    .tbe1   = MS(120),		/* typ, max = 1600 */
+    .tbe2   = MS(150),		/* typ, max = 2000 */
+    .tce    = MS(40000),	/* typ, max = 200000 */
+};
+
+static struct spiflash max80_flash = {
+    .ops    = &max80_spiflash_ops,
+    .cookie = NULL,
+    .param  = &max80_spiflash_param
+};
+
+/*
+ * Flash an image into SPI flash, and reload the FPGA if successful,
+ * returns on failure only.
+ */
+void rom_flash_from_memory(void *buf, size_t buflen)
+{
+    const struct spiflash_header *hdr = buf;
+
+    if (hdr->magic != SPIFLASH_MAGIC)
+	return;
+
+    if (hdr->magic != SPIFLASH_MAGIC ||
+	spiflash_flash_files(&max80_flash, buf, buflen)) {
+	con_puts("update: flash update data invalid\n");
+	return;
+    }
+
+    con_puts("update: Flash complete, restarting in 5 s...\n");
+    udelay(5000000);
+
+    reset(SYS_RESET_RECONFIG);
+}

+ 35 - 4
rv32/spiflash.c

@@ -2,6 +2,13 @@
 #include "zlib.h"
 #include "spiflash.h"
 
+#if 1
+# include "console.h"
+# define MSG(...) con_printf(__VA_ARGS__)
+#else
+# define MSG(...) ((void)0)
+#endif
+
 struct spz_stream;
 typedef struct spz_stream spz_stream;
 struct spz_stream {
@@ -142,6 +149,8 @@ static int spiflash_data_init(spz_stream *spz)
     int (*read_data)(void *cookie, void *buf, unsigned int bufsize);
     uint32_t header_crc;
 
+    MSG("update: initializing... ");
+
     spz->vbuf = spz_malloc(spz, SPIFLASH_BLOCK_SIZE);
     if (!spz->vbuf)
 	goto err;
@@ -190,6 +199,10 @@ static int spiflash_data_init(spz_stream *spz)
 	goto err;
     }
 
+    MSG("updating 0x%06x..%06x (%u bytes)... ",
+	spz->header->address, spz->header->address + spz->header->dlen - 1,
+	spz->header->dlen);
+
     if (rlen > (int)spz->header->zlen)
 	rlen = spz->header->zlen;
     spz->zs.avail_in = rlen;
@@ -238,6 +251,7 @@ static int spiflash_data_init(spz_stream *spz)
     }
 
 err:
+    MSG("%s\n", spz->err ? "failed" : "ok");
     return spz->err;
  }
 
@@ -251,7 +265,7 @@ static int spiflash_data_cleanup(spz_stream *spz)
     err = spz->err;
 
     if (spz->flash->ops->close_data) {
-	int rv = spz->flash->ops->close_data(&spz->zs, spz->flash->cookie);
+	int rv = spz->flash->ops->close_data(spz->flash->cookie);
 	if (!err)
 	    err = rv;
     }
@@ -557,7 +571,7 @@ int spiflash_flash_files(const struct spiflash *flash, void *buf, size_t buflen)
 		int rv;
 
 		rv = spz->read_data(spz);
-		if (spz->err || rv < 0)
+		if (spz->err)
 		    goto err;
 		eof = !rv;
 		bytes = spz->zs.next_out - spz->optr;
@@ -578,6 +592,8 @@ int spiflash_flash_files(const struct spiflash *flash, void *buf, size_t buflen)
 		}
 	    }
 
+	    MSG("update: flash block at 0x%06x: ", addr);
+
 	    uint32_t erase_mask;
 	    uint32_t prog_mask[SPIFLASH_BLOCK_SIZE >> (SPIFLASH_PAGE_SHIFT+5)];
 
@@ -586,6 +602,8 @@ int spiflash_flash_files(const struct spiflash *flash, void *buf, size_t buflen)
 		goto err;
 
 	    if (erase_mask) {
+		MSG("erasing... ");
+
 		rv = spiflash_erase(spz->flash, addr, erase_mask);
 		if (rv) {
 		    spz->err = rv;
@@ -596,18 +614,27 @@ int spiflash_flash_files(const struct spiflash *flash, void *buf, size_t buflen)
 		if (spz->err)
 		    goto err;
 		if (erase_mask) {
-		    rv = SPIFLASH_ERR_ERASE_FAILED;
+		    spz->err = SPIFLASH_ERR_ERASE_FAILED;
 		    goto err;
 		}
 	    }
 
 	    unsigned int page;
+	    bool first_prog = true;
 
 	    for (page = 0; page < (SPIFLASH_BLOCK_SIZE >> SPIFLASH_PAGE_SHIFT);
 		 page++) {
 		uint32_t page_offs = page << SPIFLASH_PAGE_SHIFT;
 
 		if (prog_mask[page >> 5] & (UINT32_C(1) << (page & 31))) {
+
+		    if (first_prog) {
+			MSG("programming %06x... ", addr + page_offs);
+		    } else {
+			MSG("\b\b\b\b\b\b\b\b\b\b%06x... ", addr+page_offs);
+		    }
+		    first_prog = false;
+
 		    rv = spiflash_program(spz->flash, addr + page_offs,
 					  spz->optr + page_offs,
 					  SPIFLASH_PAGE_SIZE);
@@ -621,6 +648,7 @@ int spiflash_flash_files(const struct spiflash *flash, void *buf, size_t buflen)
 				       spz->vbuf + page_offs,
 				       SPIFLASH_PAGE_SIZE);
 		    if (rv) {
+			MSG("verify "); /* "verify failed" */
 			spz->err = rv;
 			goto err;
 		    }
@@ -645,7 +673,10 @@ int spiflash_flash_files(const struct spiflash *flash, void *buf, size_t buflen)
 	free(padbuf);
 	padbuf = NULL;
     }
-    return err == Z_STREAM_END ? 0 : err;
+
+    MSG("%s\n", spz->err ? "failed" : "ok");
+
+    return spz->err;
 }
 
 /*

+ 3 - 3
rv32/spiflash.h

@@ -89,7 +89,7 @@ struct spiflash_ops {
      * or an error happened.) May be NULL. A nonzero value will be passed
      * to the top-level routine as an error.
      */
-    int (*close_data)(const z_stream *zs, void *cookie);
+    int (*close_data)(void *cookie);
 
     /*
      * Perform a SPI write operation. The SPI write operation consists of:
@@ -222,8 +222,8 @@ struct spiflash {
  * functions, any of the negative error values defined in zlib.h,
  * or one of the above error codes.
  */
-int spiflash_flash_file(const struct spiflash *flash,
-			void *data, size_t datalen);
+int spiflash_flash_files(const struct spiflash *flash,
+			 void *data, size_t datalen);
 
 /*
  * Read identifying data from SPI flash.

+ 2 - 4
rv32/system.c

@@ -116,8 +116,6 @@ void __hot init(void)
     if ( test_data[0] == TEST_DATA_0 && test_data[1] == TEST_DATA_1 ) {
 	con_puts(hotstr("SDRAM seems ok - skipping test\n"));
     } else {
-	extern uint32_t __dram_init_start[], __dram_init_end[];
-	extern uint32_t __dram_bss_start[], __dram_bss_end[];
 	volatile uint32_t *dp;
 	uint32_t v;
 	uint32_t wrerr;
@@ -143,7 +141,7 @@ void __hot init(void)
 
 	    not_zero |= v1;
 	    all_ones &= v1;
-	    
+
 	    rx *= 0xf4d5725f;
 	}
 
@@ -164,7 +162,7 @@ void __hot init(void)
 	con_putc(' ');
 	con_print_hex(test_data[1]);
 	con_putc('\n');
-	
+
 	if (wrerr)
 	    con_puts(hotstr("SDRAM read/write error\n"));
 

+ 1 - 1
rv32/test/main.c

@@ -227,7 +227,7 @@ void main(void)
 	       time_to_main/(CPU_HZ/1000000));
 
     while (!(irqmask() & (1 << ROMCOPY_IRQ)))
-	pause();
+	relax();
 
     test_download();