From 85f12c75f1aeb7ef6140d028b941d5dde4bed4ba Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Fri, 21 Jul 2023 22:10:39 -0700 Subject: [PATCH 01/12] Start spi controller and tb --- .gitignore | 1 + .vscode/settings.json | 5 -- hw/efinix_fpga/simulation/Makefile | 5 +- .../simulation/spi_controller_tb.sv | 69 +++++++++++++++ hw/efinix_fpga/spi_controller.sv | 84 +++++++++++++++++++ 5 files changed, 158 insertions(+), 6 deletions(-) create mode 100644 .gitignore delete mode 100644 .vscode/settings.json create mode 100644 hw/efinix_fpga/simulation/spi_controller_tb.sv create mode 100644 hw/efinix_fpga/spi_controller.sv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..722d5e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 0cbf8a7..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "conio.h": "c" - } -} \ No newline at end of file diff --git a/hw/efinix_fpga/simulation/Makefile b/hw/efinix_fpga/simulation/Makefile index 2befbaf..ebaffce 100644 --- a/hw/efinix_fpga/simulation/Makefile +++ b/hw/efinix_fpga/simulation/Makefile @@ -1,4 +1,4 @@ -TARGETS= timer interrupt_controller +TARGETS= timer interrupt_controller spi_controller TB=$(patsubst %, %_tb.sv, $(TARGETS)) all: $(TARGETS) @@ -6,6 +6,9 @@ all: $(TARGETS) timer: timer_tb.sv iverilog -g2005-sv -s sim -o $@ $@_tb.sv ../$@.sv +spi_controller: spi_controller_tb.sv + iverilog -g2005-sv -s sim -o $@ $@_tb.sv ../$@.sv + interrupt_controller: interrupt_controller_tb.sv iverilog -g2005-sv -s sim -o $@ $@_tb.sv ../$@.sv diff --git a/hw/efinix_fpga/simulation/spi_controller_tb.sv b/hw/efinix_fpga/simulation/spi_controller_tb.sv new file mode 100644 index 0000000..37c1ae3 --- /dev/null +++ b/hw/efinix_fpga/simulation/spi_controller_tb.sv @@ -0,0 +1,69 @@ +module sim(); + +timeunit 10ns; +timeprecision 1ns; + +logic clk_50; + +logic i_clk; +logic i_rst; + +logic i_cs; +logic i_rwb; +logic [1:0] i_addr; +logic [7:0] i_data; +logic [7:0] o_data; + +logic o_spi_cs; +logic o_spi_clk; +logic o_spi_mosi; +logic i_spi_miso; + +spi_controller dut(.*); + +always #1 clk_50 = clk_50 === 1'b0; +always #100 i_clk = i_clk === 1'b0; + +task write_reg(input logic [2:0] _addr, input logic [7:0] _data); + @(negedge i_clk); + i_cs <= '1; + i_addr <= _addr; + i_rwb <= '0; + i_data <= '1; + @(posedge i_clk); + i_data <= _data; + @(negedge i_clk); + i_cs <= '0; + i_rwb <= '1; +endtask + +task read_reg(input logic [2:0] _addr, output logic [7:0] _data); + @(negedge i_clk); + i_cs <= '1; + i_addr <= _addr; + i_rwb <= '1; + i_data <= '1; + @(posedge i_clk); + _data <= o_data; + @(negedge i_clk); + i_cs <= '0; + i_rwb <= '1; +endtask + +initial +begin + $dumpfile("spi_controller.vcd"); + $dumpvars(0,sim); +end + +initial begin + i_rst <= '1; + repeat(5) @(posedge i_clk); + i_rst <= '0; + + repeat(5) @(posedge i_clk); + + $finish(); +end + +endmodule \ No newline at end of file diff --git a/hw/efinix_fpga/spi_controller.sv b/hw/efinix_fpga/spi_controller.sv new file mode 100644 index 0000000..9b806f7 --- /dev/null +++ b/hw/efinix_fpga/spi_controller.sv @@ -0,0 +1,84 @@ +module spi_controller( + input i_clk, + input i_rst, + + input i_cs, + input i_rwb, + input [1:0] i_addr, + input [7:0] i_data, + output logic [7:0] o_data, + + output o_spi_cs, + output o_spi_clk, + output o_spi_mosi, + input i_spi_miso +); + + +// We need a speed register +// an input data register +// and an output data register +// and then a control register for cs + +logic [7:0] r_baud_rate; +logic [7:0] r_input_data; +logic [7:0] r_output_data; +logic [7:0] r_control; + +logic [8:0] r_clock_counter; + +logic active; +logic spi_clk; + +logic r_spi_mosi; + +always @(posedge i_clk) begin + if (i_rst) begin + r_baud_rate <= 8'h10; + r_input_data <= '0; + r_output_data <= '0; + r_control <= '0; + r_clock_counter <= '0; + spi_clk <= '0; + end else begin + if (~i_rwb & i_cs) begin + unique case (i_addr) + 0: r_baud_rate <= i_data; + 1:; + 2: begin + r_output_data <= i_data; + active <= '1; + end + 3: r_control <= i_data; + endcase + end + + if (active) begin + r_spi_mosi <= r_output_data[0]; + r_clock_counter <= r_clock_counter + 9'b1; + if (r_clock_counter >= r_baud_rate) begin + r_clock_counter <= '0; + spi_clk <= ~spi_clk; + if (spi_clk == '0) begin + r_output_data <= r_output_data >> 1; + end + if (spi_clk == '1) begin + r_input_data <= {r_input_data[7:1], i_spi_miso}; + end + end + + end + end +end + +always_comb begin + unique case (i_addr) + 0: o_data = r_baud_rate; + 1: o_data = r_input_data; + 2:; + 3: o_data = r_control; + endcase +end + + +endmodule \ No newline at end of file From 6a1a76db352d708c71435f293da85f73448b1acd Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Fri, 21 Jul 2023 23:01:37 -0700 Subject: [PATCH 02/12] Implement basic SPI controller --- hw/efinix_fpga/simulation/Makefile | 2 +- hw/efinix_fpga/simulation/spi_controller | 448 ++++++++++++++++++ .../simulation/spi_controller_tb.sv | 33 ++ hw/efinix_fpga/spi_controller.sv | 25 +- 4 files changed, 501 insertions(+), 7 deletions(-) create mode 100755 hw/efinix_fpga/simulation/spi_controller diff --git a/hw/efinix_fpga/simulation/Makefile b/hw/efinix_fpga/simulation/Makefile index ebaffce..c3b0f2e 100644 --- a/hw/efinix_fpga/simulation/Makefile +++ b/hw/efinix_fpga/simulation/Makefile @@ -6,7 +6,7 @@ all: $(TARGETS) timer: timer_tb.sv iverilog -g2005-sv -s sim -o $@ $@_tb.sv ../$@.sv -spi_controller: spi_controller_tb.sv +spi_controller: spi_controller_tb.sv ../spi_controller.sv iverilog -g2005-sv -s sim -o $@ $@_tb.sv ../$@.sv interrupt_controller: interrupt_controller_tb.sv diff --git a/hw/efinix_fpga/simulation/spi_controller b/hw/efinix_fpga/simulation/spi_controller new file mode 100755 index 0000000..c2ed4e5 --- /dev/null +++ b/hw/efinix_fpga/simulation/spi_controller @@ -0,0 +1,448 @@ +#! /usr/bin/vvp +:ivl_version "12.0 (stable)"; +:ivl_delay_selection "TYPICAL"; +:vpi_time_precision - 9; +:vpi_module "/usr/lib64/ivl/system.vpi"; +:vpi_module "/usr/lib64/ivl/vhdl_sys.vpi"; +:vpi_module "/usr/lib64/ivl/vhdl_textio.vpi"; +:vpi_module "/usr/lib64/ivl/v2005_math.vpi"; +:vpi_module "/usr/lib64/ivl/va_math.vpi"; +:vpi_module "/usr/lib64/ivl/v2009.vpi"; +S_0x55defa4f97e0 .scope package, "$unit" "$unit" 2 1; + .timescale 0 0; +S_0x55defa4f9970 .scope module, "sim" "sim" 3 1; + .timescale -8 -9; +v0x55defa5217a0_0 .var "_spi_device_data", 7 0; +v0x55defa5218a0_0 .var "clk_50", 0 0; +v0x55defa521960_0 .var "data", 7 0; +v0x55defa521a20_0 .var "i_addr", 1 0; +v0x55defa521ae0_0 .var "i_clk", 0 0; +v0x55defa521bd0_0 .var "i_cs", 0 0; +v0x55defa521c70_0 .var "i_data", 7 0; +v0x55defa521d10_0 .var "i_rst", 0 0; +v0x55defa521db0_0 .var "i_rwb", 0 0; +v0x55defa521e50_0 .var "i_spi_miso", 0 0; +v0x55defa521f20_0 .net "o_data", 7 0, v0x55defa520590_0; 1 drivers +v0x55defa521ff0_0 .net "o_spi_clk", 0 0, L_0x55defa4e9b80; 1 drivers +v0x55defa5220c0_0 .net "o_spi_cs", 0 0, L_0x55defa4e84f0; 1 drivers +v0x55defa522190_0 .net "o_spi_mosi", 0 0, L_0x55defa4e09c0; 1 drivers +E_0x55defa4f0300 .event edge, v0x55defa520670_0; +S_0x55defa4b6270 .scope module, "dut" "spi_controller" 3 22, 4 1 0, S_0x55defa4f9970; + .timescale 0 0; + .port_info 0 /INPUT 1 "i_clk"; + .port_info 1 /INPUT 1 "i_rst"; + .port_info 2 /INPUT 1 "i_cs"; + .port_info 3 /INPUT 1 "i_rwb"; + .port_info 4 /INPUT 2 "i_addr"; + .port_info 5 /INPUT 8 "i_data"; + .port_info 6 /OUTPUT 8 "o_data"; + .port_info 7 /OUTPUT 1 "o_spi_cs"; + .port_info 8 /OUTPUT 1 "o_spi_clk"; + .port_info 9 /OUTPUT 1 "o_spi_mosi"; + .port_info 10 /INPUT 1 "i_spi_miso"; +L_0x55defa4e84f0 .functor NOT 1, L_0x55defa522260, C4<0>, C4<0>, C4<0>; +L_0x55defa4e9b80 .functor BUFZ 1, v0x55defa520dd0_0, C4<0>, C4<0>, C4<0>; +L_0x55defa4e09c0 .functor BUFZ 1, v0x55defa520d10_0, C4<0>, C4<0>, C4<0>; +v0x55defa4e8690_0 .net *"_ivl_1", 0 0, L_0x55defa522260; 1 drivers +v0x55defa4e9d20_0 .var "active", 0 0; +v0x55defa4e0b20_0 .var "count", 2 0; +v0x55defa4e11c0_0 .net "i_addr", 1 0, v0x55defa521a20_0; 1 drivers +v0x55defa4e14a0_0 .net "i_clk", 0 0, v0x55defa521ae0_0; 1 drivers +v0x55defa4dfca0_0 .net "i_cs", 0 0, v0x55defa521bd0_0; 1 drivers +v0x55defa4e0660_0 .net "i_data", 7 0, v0x55defa521c70_0; 1 drivers +v0x55defa520350_0 .net "i_rst", 0 0, v0x55defa521d10_0; 1 drivers +v0x55defa520410_0 .net "i_rwb", 0 0, v0x55defa521db0_0; 1 drivers +v0x55defa5204d0_0 .net "i_spi_miso", 0 0, v0x55defa521e50_0; 1 drivers +v0x55defa520590_0 .var "o_data", 7 0; +v0x55defa520670_0 .net "o_spi_clk", 0 0, L_0x55defa4e9b80; alias, 1 drivers +v0x55defa520730_0 .net "o_spi_cs", 0 0, L_0x55defa4e84f0; alias, 1 drivers +v0x55defa5207f0_0 .net "o_spi_mosi", 0 0, L_0x55defa4e09c0; alias, 1 drivers +v0x55defa5208b0_0 .var "r_baud_rate", 7 0; +v0x55defa520990_0 .var "r_clock_counter", 8 0; +v0x55defa520a70_0 .var "r_control", 7 0; +v0x55defa520b50_0 .var "r_input_data", 7 0; +v0x55defa520c30_0 .var "r_output_data", 7 0; +v0x55defa520d10_0 .var "r_spi_mosi", 0 0; +v0x55defa520dd0_0 .var "spi_clk", 0 0; +E_0x55defa4f2fe0/0 .event anyedge, v0x55defa4e11c0_0, v0x55defa5208b0_0, v0x55defa520b50_0, v0x55defa4e9d20_0; +E_0x55defa4f2fe0/1 .event anyedge, v0x55defa520a70_0; +E_0x55defa4f2fe0 .event/or E_0x55defa4f2fe0/0, E_0x55defa4f2fe0/1; +E_0x55defa4f1160 .event negedge, v0x55defa4e14a0_0; +L_0x55defa522260 .part v0x55defa520a70_0, 0, 1; +S_0x55defa521050 .scope task, "read_reg" "read_reg" 3 40, 3 40 0, S_0x55defa4f9970; + .timescale -8 -9; +v0x55defa521220_0 .var "_addr", 2 0; +v0x55defa521320_0 .var "_data", 7 0; +E_0x55defa4da3a0 .event posedge, v0x55defa4e14a0_0; +TD_sim.read_reg ; + %wait E_0x55defa4f1160; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521bd0_0, 0; + %load/vec4 v0x55defa521220_0; + %pad/u 2; + %assign/vec4 v0x55defa521a20_0, 0; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521db0_0, 0; + %pushi/vec4 255, 0, 8; + %assign/vec4 v0x55defa521c70_0, 0; + %wait E_0x55defa4da3a0; + %load/vec4 v0x55defa521f20_0; + %assign/vec4 v0x55defa521320_0, 0; + %wait E_0x55defa4f1160; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa521bd0_0, 0; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521db0_0, 0; + %end; +S_0x55defa521400 .scope task, "write_reg" "write_reg" 3 27, 3 27 0, S_0x55defa4f9970; + .timescale -8 -9; +v0x55defa5215e0_0 .var "_addr", 2 0; +v0x55defa5216c0_0 .var "_data", 7 0; +TD_sim.write_reg ; + %wait E_0x55defa4f1160; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521bd0_0, 0; + %load/vec4 v0x55defa5215e0_0; + %pad/u 2; + %assign/vec4 v0x55defa521a20_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa521db0_0, 0; + %pushi/vec4 255, 0, 8; + %assign/vec4 v0x55defa521c70_0, 0; + %wait E_0x55defa4da3a0; + %load/vec4 v0x55defa5216c0_0; + %assign/vec4 v0x55defa521c70_0, 0; + %wait E_0x55defa4f1160; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa521bd0_0, 0; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521db0_0, 0; + %end; + .scope S_0x55defa4b6270; +T_2 ; + %wait E_0x55defa4f1160; + %load/vec4 v0x55defa520350_0; + %flag_set/vec4 8; + %jmp/0xz T_2.0, 8; + %pushi/vec4 1, 0, 8; + %assign/vec4 v0x55defa5208b0_0, 0; + %pushi/vec4 0, 0, 8; + %assign/vec4 v0x55defa520b50_0, 0; + %pushi/vec4 0, 0, 8; + %assign/vec4 v0x55defa520c30_0, 0; + %pushi/vec4 0, 0, 8; + %assign/vec4 v0x55defa520a70_0, 0; + %pushi/vec4 0, 0, 9; + %assign/vec4 v0x55defa520990_0, 0; + %pushi/vec4 0, 0, 3; + %assign/vec4 v0x55defa4e0b20_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa520dd0_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa4e9d20_0, 0; + %jmp T_2.1; +T_2.0 ; + %load/vec4 v0x55defa520410_0; + %inv; + %load/vec4 v0x55defa4dfca0_0; + %and; + %flag_set/vec4 8; + %jmp/0xz T_2.2, 8; + %load/vec4 v0x55defa4e11c0_0; + %dup/vec4; + %pushi/vec4 0, 0, 2; + %cmp/u; + %jmp/1 T_2.4, 6; + %dup/vec4; + %pushi/vec4 1, 0, 2; + %cmp/u; + %jmp/1 T_2.5, 6; + %dup/vec4; + %pushi/vec4 2, 0, 2; + %cmp/u; + %jmp/1 T_2.6, 6; + %dup/vec4; + %pushi/vec4 3, 0, 2; + %cmp/u; + %jmp/1 T_2.7, 6; + %vpi_call/w 4 52 "$warning", "value is unhandled for priority or unique case statement" {0 0 0}; + %jmp T_2.8; +T_2.4 ; + %load/vec4 v0x55defa4e0660_0; + %assign/vec4 v0x55defa5208b0_0, 0; + %jmp T_2.8; +T_2.5 ; + %jmp T_2.8; +T_2.6 ; + %load/vec4 v0x55defa4e0660_0; + %assign/vec4 v0x55defa520c30_0, 0; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa4e9d20_0, 0; + %jmp T_2.8; +T_2.7 ; + %load/vec4 v0x55defa4e0660_0; + %assign/vec4 v0x55defa520a70_0, 0; + %jmp T_2.8; +T_2.8 ; + %pop/vec4 1; +T_2.2 ; + %load/vec4 v0x55defa4e9d20_0; + %flag_set/vec4 8; + %jmp/0xz T_2.9, 8; + %load/vec4 v0x55defa520c30_0; + %parti/s 1, 7, 4; + %assign/vec4 v0x55defa520d10_0, 0; + %load/vec4 v0x55defa520990_0; + %addi 1, 0, 9; + %assign/vec4 v0x55defa520990_0, 0; + %load/vec4 v0x55defa5208b0_0; + %pad/u 9; + %load/vec4 v0x55defa520990_0; + %cmp/u; + %flag_or 5, 4; + %jmp/0xz T_2.11, 5; + %pushi/vec4 0, 0, 9; + %assign/vec4 v0x55defa520990_0, 0; + %load/vec4 v0x55defa520dd0_0; + %inv; + %assign/vec4 v0x55defa520dd0_0, 0; + %load/vec4 v0x55defa520dd0_0; + %cmpi/e 0, 0, 1; + %jmp/0xz T_2.13, 4; + %load/vec4 v0x55defa520c30_0; + %ix/load 4, 1, 0; + %flag_set/imm 4, 0; + %shiftl 4; + %assign/vec4 v0x55defa520c30_0, 0; + %load/vec4 v0x55defa4e0b20_0; + %addi 1, 0, 3; + %assign/vec4 v0x55defa4e0b20_0, 0; +T_2.13 ; + %load/vec4 v0x55defa520dd0_0; + %cmpi/e 1, 0, 1; + %jmp/0xz T_2.15, 4; + %load/vec4 v0x55defa520b50_0; + %parti/s 7, 0, 2; + %load/vec4 v0x55defa5204d0_0; + %concat/vec4; draw_concat_vec4 + %assign/vec4 v0x55defa520b50_0, 0; + %load/vec4 v0x55defa4e0b20_0; + %cmpi/e 0, 0, 3; + %jmp/0xz T_2.17, 4; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa4e9d20_0, 0; +T_2.17 ; +T_2.15 ; +T_2.11 ; +T_2.9 ; +T_2.1 ; + %jmp T_2; + .thread T_2; + .scope S_0x55defa4b6270; +T_3 ; +Ewait_0 .event/or E_0x55defa4f2fe0, E_0x0; + %wait Ewait_0; + %load/vec4 v0x55defa4e11c0_0; + %dup/vec4; + %pushi/vec4 0, 0, 2; + %cmp/u; + %jmp/1 T_3.0, 6; + %dup/vec4; + %pushi/vec4 1, 0, 2; + %cmp/u; + %jmp/1 T_3.1, 6; + %dup/vec4; + %pushi/vec4 2, 0, 2; + %cmp/u; + %jmp/1 T_3.2, 6; + %dup/vec4; + %pushi/vec4 3, 0, 2; + %cmp/u; + %jmp/1 T_3.3, 6; + %vpi_call/w 4 88 "$warning", "value is unhandled for priority or unique case statement" {0 0 0}; + %jmp T_3.4; +T_3.0 ; + %load/vec4 v0x55defa5208b0_0; + %store/vec4 v0x55defa520590_0, 0, 8; + %jmp T_3.4; +T_3.1 ; + %load/vec4 v0x55defa520b50_0; + %store/vec4 v0x55defa520590_0, 0, 8; + %jmp T_3.4; +T_3.2 ; + %jmp T_3.4; +T_3.3 ; + %load/vec4 v0x55defa4e9d20_0; + %load/vec4 v0x55defa520a70_0; + %parti/s 7, 0, 2; + %concat/vec4; draw_concat_vec4 + %store/vec4 v0x55defa520590_0, 0, 8; + %jmp T_3.4; +T_3.4 ; + %pop/vec4 1; + %jmp T_3; + .thread T_3, $push; + .scope S_0x55defa4f9970; +T_4 ; + %delay 10, 0; + %load/vec4 v0x55defa5218a0_0; + %pushi/vec4 0, 0, 1; + %cmp/e; + %flag_get/vec4 6; + %store/vec4 v0x55defa5218a0_0, 0, 1; + %jmp T_4; + .thread T_4; + .scope S_0x55defa4f9970; +T_5 ; + %delay 1000, 0; + %load/vec4 v0x55defa521ae0_0; + %pushi/vec4 0, 0, 1; + %cmp/e; + %flag_get/vec4 6; + %store/vec4 v0x55defa521ae0_0, 0, 1; + %jmp T_5; + .thread T_5; + .scope S_0x55defa4f9970; +T_6 ; + %vpi_call/w 3 55 "$dumpfile", "spi_controller.vcd" {0 0 0}; + %vpi_call/w 3 56 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x55defa4f9970 {0 0 0}; + %end; + .thread T_6; + .scope S_0x55defa4f9970; +T_7 ; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521d10_0, 0; + %pushi/vec4 5, 0, 32; +T_7.0 %dup/vec4; + %pushi/vec4 0, 0, 32; + %cmp/s; + %jmp/1xz T_7.1, 5; + %jmp/1 T_7.1, 4; + %pushi/vec4 1, 0, 32; + %sub; + %wait E_0x55defa4da3a0; + %jmp T_7.0; +T_7.1 ; + %pop/vec4 1; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa521bd0_0, 0; + %pushi/vec4 1, 0, 1; + %assign/vec4 v0x55defa521db0_0, 0; + %pushi/vec4 0, 0, 2; + %assign/vec4 v0x55defa521a20_0, 0; + %pushi/vec4 0, 0, 1; + %assign/vec4 v0x55defa521d10_0, 0; + %pushi/vec4 5, 0, 32; +T_7.2 %dup/vec4; + %pushi/vec4 0, 0, 32; + %cmp/s; + %jmp/1xz T_7.3, 5; + %jmp/1 T_7.3, 4; + %pushi/vec4 1, 0, 32; + %sub; + %wait E_0x55defa4da3a0; + %jmp T_7.2; +T_7.3 ; + %pop/vec4 1; + %pushi/vec4 3, 0, 3; + %store/vec4 v0x55defa5215e0_0, 0, 3; + %pushi/vec4 1, 0, 8; + %store/vec4 v0x55defa5216c0_0, 0, 8; + %fork TD_sim.write_reg, S_0x55defa521400; + %join; + %pushi/vec4 2, 0, 3; + %store/vec4 v0x55defa5215e0_0, 0, 3; + %pushi/vec4 170, 0, 8; + %store/vec4 v0x55defa5216c0_0, 0, 8; + %fork TD_sim.write_reg, S_0x55defa521400; + %join; + %pushi/vec4 128, 0, 8; + %store/vec4 v0x55defa521960_0, 0, 8; +T_7.4 ; + %load/vec4 v0x55defa521960_0; + %pad/u 32; + %pushi/vec4 128, 0, 32; + %and; + %or/r; + %flag_set/vec4 8; + %jmp/0xz T_7.5, 8; + %pushi/vec4 3, 0, 3; + %store/vec4 v0x55defa521220_0, 0, 3; + %fork TD_sim.read_reg, S_0x55defa521050; + %join; + %load/vec4 v0x55defa521320_0; + %store/vec4 v0x55defa521960_0, 0, 8; + %jmp T_7.4; +T_7.5 ; + %pushi/vec4 3, 0, 3; + %store/vec4 v0x55defa5215e0_0, 0, 3; + %pushi/vec4 0, 0, 8; + %store/vec4 v0x55defa5216c0_0, 0, 8; + %fork TD_sim.write_reg, S_0x55defa521400; + %join; + %pushi/vec4 1, 0, 3; + %store/vec4 v0x55defa521220_0, 0, 3; + %fork TD_sim.read_reg, S_0x55defa521050; + %join; + %load/vec4 v0x55defa521320_0; + %store/vec4 v0x55defa521960_0, 0, 8; + %load/vec4 v0x55defa521960_0; + %cmpi/e 85, 0, 8; + %jmp/0xz T_7.6, 4; + %jmp T_7.7; +T_7.6 ; + %vpi_call/w 3 79 "$error" {0 0 0}; +T_7.7 ; + %pushi/vec4 50, 0, 32; +T_7.8 %dup/vec4; + %pushi/vec4 0, 0, 32; + %cmp/s; + %jmp/1xz T_7.9, 5; + %jmp/1 T_7.9, 4; + %pushi/vec4 1, 0, 32; + %sub; + %wait E_0x55defa4da3a0; + %jmp T_7.8; +T_7.9 ; + %pop/vec4 1; + %vpi_call/w 3 83 "$finish" {0 0 0}; + %end; + .thread T_7; + .scope S_0x55defa4f9970; +T_8 ; + %pushi/vec4 85, 0, 8; + %assign/vec4 v0x55defa5217a0_0, 0; + %end; + .thread T_8; + .scope S_0x55defa4f9970; +T_9 ; + %wait E_0x55defa4f0300; + %load/vec4 v0x55defa5220c0_0; + %cmpi/e 0, 0, 1; + %jmp/0xz T_9.0, 4; + %load/vec4 v0x55defa521ff0_0; + %cmpi/e 1, 0, 1; + %jmp/0xz T_9.2, 4; + %load/vec4 v0x55defa5217a0_0; + %parti/s 1, 7, 4; + %assign/vec4 v0x55defa521e50_0, 0; +T_9.2 ; + %load/vec4 v0x55defa521ff0_0; + %cmpi/e 0, 0, 1; + %jmp/0xz T_9.4, 4; + %load/vec4 v0x55defa5217a0_0; + %ix/load 4, 1, 0; + %flag_set/imm 4, 0; + %shiftl 4; + %assign/vec4 v0x55defa5217a0_0, 0; +T_9.4 ; +T_9.0 ; + %jmp T_9; + .thread T_9; +# The file index is used to find the file name in the following table. +:file_names 5; + "N/A"; + ""; + "-"; + "spi_controller_tb.sv"; + "../spi_controller.sv"; diff --git a/hw/efinix_fpga/simulation/spi_controller_tb.sv b/hw/efinix_fpga/simulation/spi_controller_tb.sv index 37c1ae3..daeddd3 100644 --- a/hw/efinix_fpga/simulation/spi_controller_tb.sv +++ b/hw/efinix_fpga/simulation/spi_controller_tb.sv @@ -56,14 +56,47 @@ begin $dumpvars(0,sim); end +logic [7:0] data; + initial begin i_rst <= '1; repeat(5) @(posedge i_clk); + i_cs <= '0; + i_rwb <= '1; + i_addr <= '0; i_rst <= '0; repeat(5) @(posedge i_clk); + write_reg(3, 1); + write_reg(2, 8'hAA); + data = (1 << 7); + while(data & (1 << 7)) begin + read_reg(3, data); + end + write_reg(3, 0); + read_reg(1, data); + assert(data == 8'h55); + + repeat(50) @(posedge i_clk); + $finish(); end + +logic [7:0] _spi_device_data; + +initial begin + _spi_device_data <= 8'h55; +end + +always @(edge o_spi_clk) begin + if (o_spi_cs == '0) begin + if (o_spi_clk == '1) + i_spi_miso <= _spi_device_data[7]; + if (o_spi_clk == '0) + _spi_device_data <= _spi_device_data << 1; + end +end + endmodule \ No newline at end of file diff --git a/hw/efinix_fpga/spi_controller.sv b/hw/efinix_fpga/spi_controller.sv index 9b806f7..2d085e4 100644 --- a/hw/efinix_fpga/spi_controller.sv +++ b/hw/efinix_fpga/spi_controller.sv @@ -28,18 +28,25 @@ logic [7:0] r_control; logic [8:0] r_clock_counter; logic active; +logic [2:0] count; logic spi_clk; logic r_spi_mosi; -always @(posedge i_clk) begin +assign o_spi_cs = ~r_control[0]; +assign o_spi_clk = spi_clk; +assign o_spi_mosi = r_spi_mosi; + +always @(negedge i_clk) begin if (i_rst) begin - r_baud_rate <= 8'h10; + r_baud_rate <= 8'h1; r_input_data <= '0; r_output_data <= '0; r_control <= '0; r_clock_counter <= '0; + count <= '0; spi_clk <= '0; + active <= '0; end else begin if (~i_rwb & i_cs) begin unique case (i_addr) @@ -54,16 +61,22 @@ always @(posedge i_clk) begin end if (active) begin - r_spi_mosi <= r_output_data[0]; + r_spi_mosi <= r_output_data[7]; r_clock_counter <= r_clock_counter + 9'b1; if (r_clock_counter >= r_baud_rate) begin r_clock_counter <= '0; spi_clk <= ~spi_clk; + // rising edge if (spi_clk == '0) begin - r_output_data <= r_output_data >> 1; + r_output_data <= r_output_data << 1; + count <= count + 1; end + // falling edge if (spi_clk == '1) begin - r_input_data <= {r_input_data[7:1], i_spi_miso}; + r_input_data <= {r_input_data[6:0], i_spi_miso}; + if (count == '0) begin + active <= '0; + end end end @@ -76,7 +89,7 @@ always_comb begin 0: o_data = r_baud_rate; 1: o_data = r_input_data; 2:; - 3: o_data = r_control; + 3: o_data = {active, r_control[6:0]}; endcase end From 5ca5fca29b7586afe6fc07c7244c9e52281a928d Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 14:55:14 -0700 Subject: [PATCH 03/12] Get SD card working in SPI --- hw/efinix_fpga/addr_decode.sv | 4 +- hw/efinix_fpga/debug_profile.wizard.json | 1189 +++-------------- hw/efinix_fpga/init_hex.mem | 406 +++--- hw/efinix_fpga/ip/uart/ipm/component.pickle | Bin 14106 -> 14107 bytes hw/efinix_fpga/ip/uart/ipm/graph.pickle | Bin 18761 -> 18768 bytes hw/efinix_fpga/ip/uart/settings.json | 23 +- hw/efinix_fpga/ip/uart/uart.v | 4 +- hw/efinix_fpga/ip/uart/uart_define.vh | 2 +- hw/efinix_fpga/simulation/spi_controller | 448 ------- .../simulation/spi_controller_tb.sv | 4 +- hw/efinix_fpga/super6502.peri.xml | 22 +- hw/efinix_fpga/super6502.sv | 69 +- hw/efinix_fpga/super6502.xml | 7 +- sw/bootloader/Makefile | 2 +- sw/bootloader/devices/io.inc65 | 9 +- sw/bootloader/devices/sd_card.c | 488 ++++++- sw/bootloader/devices/sd_card.h | 80 +- sw/bootloader/devices/sd_card_asm.s | 66 - sw/bootloader/devices/sd_print.c | 176 +++ sw/bootloader/devices/sd_print.h | 61 + sw/bootloader/devices/spi.h | 12 + sw/bootloader/devices/spi.s | 39 + sw/bootloader/main.c | 77 +- 23 files changed, 1257 insertions(+), 1931 deletions(-) delete mode 100755 hw/efinix_fpga/simulation/spi_controller delete mode 100644 sw/bootloader/devices/sd_card_asm.s create mode 100644 sw/bootloader/devices/sd_print.c create mode 100644 sw/bootloader/devices/sd_print.h create mode 100644 sw/bootloader/devices/spi.h create mode 100644 sw/bootloader/devices/spi.s diff --git a/hw/efinix_fpga/addr_decode.sv b/hw/efinix_fpga/addr_decode.sv index 48320cd..bde918f 100644 --- a/hw/efinix_fpga/addr_decode.sv +++ b/hw/efinix_fpga/addr_decode.sv @@ -8,7 +8,7 @@ module addr_decode output o_multiplier_cs, output o_divider_cs, output o_uart_cs, - output o_sdcard_cs, + output o_spi_cs, output o_sdram_cs ); @@ -17,7 +17,7 @@ assign o_timer_cs = i_addr >= 16'heff8 && i_addr <= 16'heffb; assign o_multiplier_cs = i_addr >= 16'heff0 && i_addr <= 16'heff7; assign o_divider_cs = i_addr >= 16'hefe8 && i_addr <= 16'hefef; assign o_uart_cs = i_addr >= 16'hefe6 && i_addr <= 16'hefe7; -assign o_sdcard_cs = i_addr >= 16'hefd8 && i_addr <= 16'hefdf; +assign o_spi_cs = i_addr >= 16'hefd8 && i_addr <= 16'hefdb; assign o_leds_cs = i_addr == 16'hefff; assign o_sdram_cs = i_addr < 16'h8000; diff --git a/hw/efinix_fpga/debug_profile.wizard.json b/hw/efinix_fpga/debug_profile.wizard.json index e3e4271..73565a8 100644 --- a/hw/efinix_fpga/debug_profile.wizard.json +++ b/hw/efinix_fpga/debug_profile.wizard.json @@ -3,12 +3,12 @@ { "name": "la0", "type": "la", - "uuid": "839a8cb8163a4829a5cc15adcbae907b", + "uuid": "68ae6f6753aa4c41b26baf6770f0d8e4", "trigin_en": false, "trigout_en": false, "auto_inserted": true, "capture_control": false, - "data_depth": 4096, + "data_depth": 8192, "input_pipeline": 1, "probes": [ { @@ -56,105 +56,45 @@ "width": 1, "probe_type": 1 }, - { - "name": "u_sdram_adapter/o_dbg_wr_ack", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/next_counter", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/o_data", - "width": 8, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/next_state", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_data_i", - "width": 32, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/i_rwb", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_addr", - "width": 24, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_data_o", - "width": 32, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/i_cs", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/counter", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/state", - "width": 2, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_last", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_data_valid", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_wr_ack", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_read", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_write", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_rd_ack", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/w_rd_valid", - "width": 1, - "probe_type": 1 - }, - { - "name": "u_sdram_adapter/o_dbg_ref_req", - "width": 1, - "probe_type": 1 - }, { "name": "cpu_rdy", "width": 1, "probe_type": 1 + }, + { + "name": "spi_clk", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_mosi", + "width": 1, + "probe_type": 1 + }, + { + "name": "sd_cs", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_miso", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_controller/active", + "width": 1, + "probe_type": 1 + }, + { + "name": "spi_controller/r_clock_counter", + "width": 9, + "probe_type": 1 + }, + { + "name": "spi_controller/r_baud_rate", + "width": 8, + "probe_type": 1 } ] } @@ -282,7 +222,7 @@ }, { "name": "la0_clk", - "net": "i_sysclk", + "net": "clk_50", "path": [] }, { @@ -477,813 +417,154 @@ }, { "name": "la0_probe9", - "net": "o_dbg_wr_ack", - "path": [ - "u_sdram_adapter" - ] + "net": "cpu_rdy", + "path": [] }, { - "name": "la0_probe10[0]", - "net": "next_counter[0]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe10", + "net": "spi_clk", + "path": [] }, { - "name": "la0_probe10[1]", - "net": "next_counter[1]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe11", + "net": "spi_mosi", + "path": [] }, { - "name": "la0_probe11[0]", - "net": "o_data[0]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe12", + "net": "sd_cs", + "path": [] }, { - "name": "la0_probe11[1]", - "net": "o_data[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[2]", - "net": "o_data[2]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[3]", - "net": "o_data[3]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[4]", - "net": "o_data[4]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[5]", - "net": "o_data[5]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[6]", - "net": "o_data[6]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe11[7]", - "net": "o_data[7]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe12[0]", - "net": "next_state[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe12[1]", - "net": "next_state[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[0]", - "net": "w_data_i[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[1]", - "net": "w_data_i[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[2]", - "net": "w_data_i[2]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[3]", - "net": "w_data_i[3]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[4]", - "net": "w_data_i[4]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[5]", - "net": "w_data_i[5]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[6]", - "net": "w_data_i[6]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[7]", - "net": "w_data_i[7]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[8]", - "net": "w_data_i[8]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[9]", - "net": "w_data_i[9]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[10]", - "net": "w_data_i[10]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[11]", - "net": "w_data_i[11]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[12]", - "net": "w_data_i[12]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[13]", - "net": "w_data_i[13]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[14]", - "net": "w_data_i[14]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[15]", - "net": "w_data_i[15]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[16]", - "net": "w_data_i[16]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[17]", - "net": "w_data_i[17]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[18]", - "net": "w_data_i[18]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[19]", - "net": "w_data_i[19]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[20]", - "net": "w_data_i[20]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[21]", - "net": "w_data_i[21]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[22]", - "net": "w_data_i[22]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[23]", - "net": "w_data_i[23]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[24]", - "net": "w_data_i[24]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[25]", - "net": "w_data_i[25]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[26]", - "net": "w_data_i[26]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[27]", - "net": "w_data_i[27]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[28]", - "net": "w_data_i[28]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[29]", - "net": "w_data_i[29]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[30]", - "net": "w_data_i[30]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe13[31]", - "net": "w_data_i[31]", - "path": [ - "u_sdram_adapter" - ] + "name": "la0_probe13", + "net": "spi_miso", + "path": [] }, { "name": "la0_probe14", - "net": "i_rwb", + "net": "active", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[0]", - "net": "w_addr[0]", + "net": "r_clock_counter[0]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[1]", - "net": "w_addr[1]", + "net": "r_clock_counter[1]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[2]", - "net": "w_addr[2]", + "net": "r_clock_counter[2]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[3]", - "net": "w_addr[3]", + "net": "r_clock_counter[3]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[4]", - "net": "w_addr[4]", + "net": "r_clock_counter[4]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[5]", - "net": "w_addr[5]", + "net": "r_clock_counter[5]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[6]", - "net": "w_addr[6]", + "net": "r_clock_counter[6]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[7]", - "net": "w_addr[7]", + "net": "r_clock_counter[7]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe15[8]", - "net": "w_addr[8]", + "net": "r_clock_counter[8]", "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[9]", - "net": "w_addr[9]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[10]", - "net": "w_addr[10]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[11]", - "net": "w_addr[11]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[12]", - "net": "w_addr[12]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[13]", - "net": "w_addr[13]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[14]", - "net": "w_addr[14]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[15]", - "net": "w_addr[15]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[16]", - "net": "w_addr[16]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[17]", - "net": "w_addr[17]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[18]", - "net": "w_addr[18]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[19]", - "net": "w_addr[19]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[20]", - "net": "w_addr[20]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[21]", - "net": "w_addr[21]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[22]", - "net": "w_addr[22]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe15[23]", - "net": "w_addr[23]", - "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[0]", - "net": "w_data_o[0]", + "net": "r_baud_rate[0]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[1]", - "net": "w_data_o[1]", + "net": "r_baud_rate[1]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[2]", - "net": "w_data_o[2]", + "net": "r_baud_rate[2]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[3]", - "net": "w_data_o[3]", + "net": "r_baud_rate[3]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[4]", - "net": "w_data_o[4]", + "net": "r_baud_rate[4]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[5]", - "net": "w_data_o[5]", + "net": "r_baud_rate[5]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[6]", - "net": "w_data_o[6]", + "net": "r_baud_rate[6]", "path": [ - "u_sdram_adapter" + "spi_controller" ] }, { "name": "la0_probe16[7]", - "net": "w_data_o[7]", + "net": "r_baud_rate[7]", "path": [ - "u_sdram_adapter" + "spi_controller" ] - }, - { - "name": "la0_probe16[8]", - "net": "w_data_o[8]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[9]", - "net": "w_data_o[9]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[10]", - "net": "w_data_o[10]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[11]", - "net": "w_data_o[11]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[12]", - "net": "w_data_o[12]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[13]", - "net": "w_data_o[13]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[14]", - "net": "w_data_o[14]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[15]", - "net": "w_data_o[15]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[16]", - "net": "w_data_o[16]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[17]", - "net": "w_data_o[17]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[18]", - "net": "w_data_o[18]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[19]", - "net": "w_data_o[19]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[20]", - "net": "w_data_o[20]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[21]", - "net": "w_data_o[21]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[22]", - "net": "w_data_o[22]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[23]", - "net": "w_data_o[23]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[24]", - "net": "w_data_o[24]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[25]", - "net": "w_data_o[25]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[26]", - "net": "w_data_o[26]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[27]", - "net": "w_data_o[27]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[28]", - "net": "w_data_o[28]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[29]", - "net": "w_data_o[29]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[30]", - "net": "w_data_o[30]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe16[31]", - "net": "w_data_o[31]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe17", - "net": "i_cs", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe18[0]", - "net": "counter[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe18[1]", - "net": "counter[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe19[0]", - "net": "state[0]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe19[1]", - "net": "state[1]", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe20", - "net": "w_last", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe21", - "net": "w_data_valid", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe22", - "net": "w_wr_ack", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe23", - "net": "w_read", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe24", - "net": "w_write", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe25", - "net": "w_rd_ack", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe26", - "net": "w_rd_valid", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe27", - "net": "o_dbg_ref_req", - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "la0_probe28", - "net": "cpu_rdy", - "path": [] } ] } @@ -1297,13 +578,13 @@ ], "session": { "wizard": { - "data_depth": 4096, + "data_depth": 8192, "capture_control": false, "selected_nets": [ { "name": "cpu_data_in", "width": 8, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [], @@ -1313,7 +594,7 @@ { "name": "cpu_rwb", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1321,7 +602,7 @@ { "name": "cpu_sync", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1329,7 +610,7 @@ { "name": "cpu_resb", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1337,7 +618,7 @@ { "name": "cpu_addr", "width": 16, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [], @@ -1347,7 +628,7 @@ { "name": "cpu_nmib", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1355,7 +636,7 @@ { "name": "cpu_irqb", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] @@ -1363,7 +644,7 @@ { "name": "cpu_data_out", "width": 8, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [], @@ -1373,224 +654,84 @@ { "name": "cpu_phi2", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] }, - { - "name": "o_dbg_wr_ack", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "next_counter", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "o_data", - "width": 8, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 7, - "net_idx_right": 0 - }, - { - "name": "next_state", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "w_data_i", - "width": 32, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 31, - "net_idx_right": 0 - }, - { - "name": "i_rwb", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_addr", - "width": 24, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 23, - "net_idx_right": 0 - }, - { - "name": "w_data_o", - "width": 32, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 31, - "net_idx_right": 0 - }, - { - "name": "i_cs", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "counter", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "state", - "width": 2, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ], - "net_idx_left": 1, - "net_idx_right": 0 - }, - { - "name": "w_last", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_data_valid", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_wr_ack", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_read", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_write", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_rd_ack", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "w_rd_valid", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, - { - "name": "o_dbg_ref_req", - "width": 1, - "clk_domain": "i_sysclk", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "u_sdram_adapter" - ] - }, { "name": "cpu_rdy", "width": 1, - "clk_domain": "i_sysclk", + "clk_domain": "clk_50", "selected_probe_type": "DATA AND TRIGGER", "child": [], "path": [] + }, + { + "name": "spi_clk", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "spi_mosi", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "sd_cs", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "spi_miso", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [] + }, + { + "name": "active", + "width": 1, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [ + "spi_controller" + ] + }, + { + "name": "r_clock_counter", + "width": 9, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [ + "spi_controller" + ], + "net_idx_left": 8, + "net_idx_right": 0 + }, + { + "name": "r_baud_rate", + "width": 8, + "clk_domain": "clk_50", + "selected_probe_type": "DATA AND TRIGGER", + "child": [], + "path": [ + "spi_controller" + ], + "net_idx_left": 7, + "net_idx_right": 0 } ], "top_module": "super6502", diff --git a/hw/efinix_fpga/init_hex.mem b/hw/efinix_fpga/init_hex.mem index 15cd4f0..b095bf6 100644 --- a/hw/efinix_fpga/init_hex.mem +++ b/hw/efinix_fpga/init_hex.mem @@ -1,207 +1,152 @@ @00000000 -4C 00 00 8D 11 02 8E 12 02 8D 18 02 8E 19 02 88 -B9 FF FF 8D 22 02 88 B9 FF FF 8D 21 02 8C 24 02 -20 FF FF A0 FF D0 E8 60 00 00 02 FB 00 00 00 00 -A2 FF 9A D8 A9 F0 85 00 A9 7E 85 01 20 7A FB 20 -05 F8 20 50 F0 58 20 29 F1 6C FC FF 20 F9 F7 00 -A0 00 F0 07 A9 50 A2 F0 4C 03 02 60 AD FF EF A2 -00 60 8D FF EF 60 20 0F F1 C9 0A D0 05 A9 0D 20 -0F F1 60 DA 5A A8 B2 00 AA A9 1B 20 0F F1 A9 5B -20 0F F1 98 20 0F F1 A9 3B 20 0F F1 8A 20 0F F1 -A9 48 20 0F F1 7A FA 60 DA A9 1B 20 0F F1 A9 63 -20 0F F1 68 60 40 DA BA 48 E8 E8 BD 00 01 29 10 -D0 06 68 FA 20 28 F1 40 4C B8 F0 48 20 6B F9 8D -D8 EF 8E D9 EF A5 02 8D DA EF A5 03 8D DB EF 68 -8D DC EF 60 5A 85 08 86 09 AD DC EF 29 01 F0 F9 -AD D8 EF A0 00 91 08 AD D9 EF C8 91 08 AD DA EF -C8 91 08 AD DB EF C8 91 08 7A 60 AD DD EF A2 00 -60 48 AD DC EF 29 02 F0 F9 68 60 8D E6 EF 60 48 -8D E6 EF AD E7 EF 89 02 D0 F9 68 60 AD E6 EF A2 -00 60 AD E7 EF A2 00 60 60 20 9D F8 20 98 F0 A9 -C4 A2 FB 20 66 F8 A9 9D A2 FB 20 79 FA A0 02 20 -32 F8 20 AA F1 A9 D6 A2 FB 20 79 FA A0 02 20 32 -F8 20 F7 F2 A0 00 20 A7 FA A9 E6 A2 FB 20 79 FA -A0 03 20 21 F9 20 79 FA A0 04 20 32 F8 A0 01 20 -21 F9 20 36 F3 A9 EF A2 FB 20 79 FA A0 02 20 32 -F8 4C 87 F1 4C 81 F1 4C 84 F1 A9 B2 A2 FB 20 79 -FA AD FC FF AE FD FF 20 79 FA A0 04 20 32 F8 A2 -00 A9 00 4C A6 F1 20 CC F8 60 20 B7 F8 A9 1B A2 -FC 20 66 F8 A2 00 86 02 86 03 A9 00 20 89 F9 A2 -00 A9 00 20 BB F0 A9 0F A2 FC 20 79 FA A0 02 20 -32 F8 A2 01 A9 00 85 02 A9 00 85 03 A9 AA 20 89 -F9 A2 00 A9 08 20 BB F0 A9 02 20 3B F9 20 D4 F0 -A9 32 A2 FC 20 79 FA A0 07 20 2A F9 20 89 F9 A0 -06 20 32 F8 A2 00 A9 00 A0 01 91 00 A0 01 A2 00 -B1 00 C9 65 A9 00 A2 00 2A D0 03 4C 2D F2 A9 F6 -A2 FB 20 79 FA A0 02 20 32 F8 4C F3 F2 A2 00 86 -02 86 03 A9 00 20 89 F9 A2 00 A9 37 20 BB F0 A9 -02 20 3B F9 20 D4 F0 A2 00 A9 18 85 02 A9 40 85 -03 A9 00 20 89 F9 A2 00 A9 29 20 BB F0 A9 02 20 -3B F9 20 D4 F0 A9 03 A2 FC 20 79 FA A0 07 20 2A -F9 20 89 F9 A0 06 20 32 F8 A2 00 A9 00 A0 00 91 -00 A0 00 A2 00 B1 00 C9 FF 20 55 FA F0 03 4C 94 -F2 4C A2 F2 A0 00 A2 00 18 A9 01 71 00 91 00 4C -81 F2 A0 01 A2 00 18 A9 01 71 00 91 00 A0 05 20 -2A F9 20 89 F9 A2 00 86 02 86 03 A9 00 20 47 F9 -F0 03 4C 0C F2 A2 00 86 02 86 03 A9 00 20 89 F9 -A2 00 A9 02 20 BB F0 A9 02 20 3B F9 20 D4 F0 A9 -27 A2 FC 20 79 FA A0 07 20 2A F9 20 89 F9 A0 06 -20 32 F8 20 DF F8 60 20 AA F8 A2 00 86 02 86 03 -A9 00 20 89 F9 A2 00 A9 03 20 BB F0 A2 00 86 02 -86 03 A9 00 A0 00 20 B2 FA A5 00 A6 01 20 D4 F0 -A0 03 20 2A F9 A0 00 A6 03 A5 02 84 03 84 02 4C -32 F3 20 DA F8 60 20 79 FA 20 AA F8 A0 05 20 21 -F9 20 F2 F7 86 03 85 02 A9 00 AA 20 89 F9 A2 00 -A9 07 20 BB F0 A5 00 A6 01 20 D4 F0 A0 01 20 21 -F9 4C 64 F3 20 DF F8 60 20 79 FA 20 AA F8 A0 05 -20 21 F9 20 F2 F7 86 03 85 02 A9 00 AA 20 89 F9 -A2 00 A9 0D 20 BB F0 A5 00 A6 01 20 D4 F0 A0 01 -20 21 F9 4C 96 F3 20 DF F8 60 20 79 FA 20 B7 F8 -A0 0B 20 2A F9 20 89 F9 A2 00 A9 11 20 BB F0 A9 -02 20 3B F9 20 D4 F0 20 01 F1 A2 00 A9 00 A0 00 -20 A7 FA A0 01 20 21 F9 C9 00 8A E9 02 50 02 49 -80 0A A9 00 A2 00 2A F0 03 4C DF F3 4C 06 F4 A0 -07 20 21 F9 20 79 FA A0 03 20 21 F9 20 B3 F7 20 -79 FA 20 FB F0 A0 00 20 8F FA A0 00 A2 00 A9 01 -20 CF F7 4C C3 F3 A0 0C 20 DF F7 60 A0 00 B1 16 -E6 16 D0 02 E6 17 60 AD 3B 04 8D 36 04 20 B8 F4 -A9 36 A2 04 20 79 FA 20 70 FA 4C 00 02 A5 14 38 -E9 02 85 14 B0 02 C6 15 60 AD 40 04 D0 11 20 56 -F4 4C F2 F7 AD 40 04 D0 06 20 56 F4 4C EC F7 20 -56 F4 85 02 86 03 20 2D F4 A0 01 B1 14 AA 88 B1 -14 60 A0 00 84 08 84 09 B1 16 38 E9 30 90 2C C9 -0A B0 28 20 10 F4 48 A5 08 A6 09 06 08 26 09 06 -08 26 09 65 08 85 08 8A 65 09 85 09 06 08 26 09 -68 65 08 85 08 90 D1 E6 09 B0 CD A5 08 A6 09 60 -AC 42 04 EE 42 04 99 43 04 60 A9 43 A2 04 18 6D -42 04 90 01 E8 4C 79 FA A5 18 A6 19 4C 79 FA 20 -17 F4 EE 3C 04 D0 F8 EE 3D 04 D0 F3 60 20 B8 F4 -AD 57 04 AE 58 04 20 79 FA AD 59 04 AE 5A 04 20 -79 FA 4C 00 02 84 08 20 89 F9 20 AA F4 A5 08 4C -B9 F9 84 08 20 89 F9 20 AA F4 A5 08 4C FA F9 48 -A0 05 B9 14 00 99 30 04 88 10 F7 68 85 14 86 15 -20 C4 F8 85 16 86 17 20 C4 F8 85 18 86 19 A9 00 -A8 91 18 C8 91 18 C8 B1 18 8D 01 02 C8 B1 18 8D -02 02 A5 16 85 08 A5 17 85 09 A0 00 B1 16 F0 0B -C9 25 F0 07 C8 D0 F5 E6 17 D0 F1 98 18 65 16 85 -16 90 02 E6 17 38 E5 08 85 0A A5 17 E5 09 85 0B -05 0A F0 25 20 B7 F8 A0 05 A5 19 91 00 88 A5 18 -91 00 88 A5 09 91 00 88 A5 08 91 00 88 A5 0B 91 -00 88 A5 0A 91 00 20 00 02 20 0C F4 AA D0 0B A2 -05 BD 30 04 95 14 CA 10 F8 60 C9 25 D0 09 B1 16 -C9 25 D0 09 20 10 F4 20 1A F4 4C 32 F5 A9 00 A2 -0B 9D 37 04 CA 10 FA B1 16 C9 2D D0 05 8E 37 04 -F0 19 C9 2B D0 05 8E 38 04 F0 10 C9 20 D0 05 8E -39 04 F0 07 C9 23 D0 09 8E 3A 04 20 10 F4 4C B7 -F5 A2 20 C9 30 D0 06 AA 20 10 F4 B1 16 8E 3B 04 -C9 2A D0 09 20 10 F4 20 56 F4 4C 00 F6 20 62 F4 -8D 3C 04 8E 3D 04 8C 3E 04 8C 3F 04 B1 16 C9 2E -D0 1B 20 10 F4 B1 16 C9 2A D0 09 20 10 F4 20 56 -F4 4C 27 F6 20 62 F4 8D 3E 04 8E 3F 04 B1 16 C9 -7A F0 19 C9 68 F0 15 C9 74 F0 11 C9 6A F0 08 C9 -4C F0 04 C9 6C D0 0B A9 FF 8D 40 04 20 10 F4 4C -2D F6 8C 42 04 A2 43 8E 57 04 A2 04 8E 58 04 20 -10 F4 C9 63 D0 0E 20 56 F4 8D 43 04 A9 00 8D 44 -04 4C 51 F7 C9 64 F0 04 C9 69 D0 2D A2 00 AD 39 -04 F0 02 A2 20 AD 38 04 F0 02 A2 2B 8E 41 04 20 -44 F4 A4 03 30 0B AC 41 04 F0 06 8C 43 04 EE 42 -04 A0 0A 20 E5 F4 4C 51 F7 C9 6E D0 15 20 56 F4 -85 08 86 09 A0 00 B1 18 91 08 C8 B1 18 91 08 4C -32 F5 C9 6F D0 27 20 44 F4 AC 3A 04 F0 17 48 86 -10 05 10 05 02 05 03 0D 3E 04 0D 3F 04 F0 06 A9 -30 20 A0 F4 68 A0 08 20 E5 F4 4C 51 F7 C9 70 D0 -0D A2 00 8E 40 04 E8 8E 3A 04 A9 78 D0 27 C9 73 -D0 0C 20 56 F4 8D 57 04 8E 58 04 4C 51 F7 C9 75 -D0 0B 20 39 F4 A0 0A 20 F2 F4 4C 51 F7 C9 78 F0 -04 C9 58 D0 29 48 AD 3A 04 F0 0A A9 30 20 A0 F4 -A9 58 20 A0 F4 20 39 F4 A0 10 20 F2 F4 68 C9 78 -D0 09 AD 57 04 AE 58 04 20 DB FA 4C 51 F7 4C 32 -F5 AD 57 04 AE 58 04 20 C5 FA 8D 59 04 8E 5A 04 -AD 3E 04 0D 3F 04 F0 15 AE 3E 04 EC 59 04 AD 3F -04 A8 ED 5A 04 B0 06 8E 59 04 8C 5A 04 38 AD 3C -04 ED 59 04 AA AD 3D 04 ED 5A 04 B0 03 A9 00 AA -49 FF 8D 3D 04 8A 49 FF 8D 3C 04 AD 37 04 D0 03 -20 C2 F4 20 CD F4 AD 37 04 F0 03 20 C2 F4 4C 32 -F5 A2 00 18 A0 00 71 00 C8 85 10 8A 71 00 AA 18 -A5 00 69 02 85 00 90 02 E6 01 A5 10 60 A0 00 18 +8D 0E 02 8E 0F 02 8D 15 02 8E 16 02 88 B9 FF FF +8D 1F 02 88 B9 FF FF 8D 1E 02 8C 21 02 20 FF FF +A0 FF D0 E8 60 A2 FF 9A D8 A9 F0 85 00 A9 7E 85 +01 20 CD F8 20 38 F7 20 45 F0 58 20 E6 F0 6C FC +FF 20 2C F7 00 A0 00 F0 07 A9 45 A2 F0 4C 00 02 +60 AD FF EF A2 00 60 8D FF EF 60 20 CC F0 C9 0A +D0 05 A9 0D 20 CC F0 60 DA 5A A8 B2 00 AA A9 1B +20 CC F0 A9 5B 20 CC F0 98 20 CC F0 A9 3B 20 CC +F0 8A 20 CC F0 A9 48 20 CC F0 7A FA 60 DA A9 1B +20 CC F0 A9 63 20 CC F0 68 60 40 DA BA 48 E8 E8 +BD 00 01 29 10 D0 06 68 FA 20 E5 F0 40 4C AD F0 +A9 01 8D DB EF 60 9C DB EF 60 A9 00 8D DA EF AD +DB EF 30 FB AD D9 EF 60 8D E6 EF 60 48 8D E6 EF +AD E7 EF 89 02 D0 F9 68 60 AD E6 EF A2 00 60 AD +E7 EF A2 00 60 60 20 B8 F7 A2 00 86 02 86 03 A9 +00 20 38 F8 20 91 F7 A9 14 A2 F9 20 6F F7 20 28 +F1 C9 00 20 50 F8 D0 03 4C 15 F1 A9 F0 A2 F8 20 +6F F7 4C 1C F1 A9 05 A2 F9 20 6F F7 4C 1F F1 4C +1F F1 A0 0C 20 1F F7 60 20 C5 F7 A9 00 20 80 F8 +20 9A F2 4C 5F F1 A0 00 A2 00 18 A9 01 71 00 91 +00 A0 00 A2 00 B1 00 C9 FF 20 56 F8 D0 03 4C 5F +F1 A9 36 A2 F9 20 6F F7 A2 00 A9 01 4C 96 F2 20 +B1 F4 A0 01 91 00 C9 01 20 50 F8 D0 C9 A2 00 A9 +00 A0 06 20 C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 +E8 20 6F F8 F0 03 4C 8C F1 4C 98 F1 A0 06 A2 00 +A9 01 20 0F F7 4C 76 F1 A9 01 20 23 F8 20 0B F5 +A0 01 A2 00 B1 00 C9 01 20 50 F8 D0 03 4C BE F1 +A9 2C A2 F9 20 6F F7 A2 00 A9 01 4C 96 F2 A0 05 +A2 00 B1 00 C9 AA 20 50 F8 D0 03 4C D5 F1 A2 00 +A9 01 4C 96 F2 A2 00 A9 00 A0 00 91 00 A0 00 A2 +00 B1 00 C9 FF 20 56 F8 D0 03 4C FB F1 A9 1C A2 +F9 20 6F F7 A2 00 A9 01 4C 96 F2 20 2D F6 A0 01 +91 00 A0 01 A2 00 B1 00 C9 02 20 6F F8 D0 03 4C +19 F2 20 87 F6 A0 01 91 00 A2 00 A9 00 A0 06 20 +C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 E8 20 6F F8 +F0 03 4C 38 F2 4C 44 F2 A0 06 A2 00 A9 01 20 0F +F7 4C 22 F2 A0 00 A2 00 18 A9 01 71 00 91 00 A0 +01 A2 00 B1 00 C9 00 20 50 F8 D0 81 A2 00 A9 00 +A0 06 20 C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 E8 +20 6F F8 F0 03 4C 7B F2 4C 87 F2 A0 06 A2 00 A9 +01 20 0F F7 4C 65 F2 A9 01 20 23 F8 20 B3 F5 A2 +00 A9 00 4C 96 F2 20 F9 F7 60 20 9E F7 A2 00 A9 +00 20 B6 F0 A2 00 A9 00 A0 01 20 C4 F8 A0 02 20 +09 F8 E0 03 D0 02 C9 E8 20 6F F8 F0 03 4C C3 F2 +4C CF F2 A0 01 A2 00 A9 01 20 0F F7 4C AD F2 A2 +00 A9 FF 20 BC F0 A2 00 A9 00 20 B6 F0 A2 00 A9 +00 A0 00 91 00 A0 00 A2 00 B1 00 C9 50 20 6F F8 +F0 03 4C F8 F2 4C 0D F3 A2 00 A9 FF 20 BC F0 A0 +00 A2 00 18 A9 01 71 00 91 00 4C E5 F2 20 EF F7 +60 20 80 F8 A0 05 A2 00 B1 00 09 40 A2 00 20 BC +F0 A0 04 20 12 F8 A2 00 A5 03 86 02 86 03 A2 00 +20 BC F0 A0 04 20 12 F8 A0 00 A6 03 A5 02 84 03 +84 02 A2 00 20 BC F0 A0 04 20 12 F8 8A A6 02 A4 +03 84 02 A0 00 84 03 A2 00 20 BC F0 A0 01 A2 00 +B1 00 20 BC F0 A0 00 A2 00 B1 00 09 01 A2 00 20 +BC F0 20 F4 F7 60 A9 00 20 80 F8 20 88 F7 4C A1 +F3 A0 01 A2 00 18 A9 01 71 00 91 00 A0 01 A2 00 +B1 00 C9 09 A9 00 A2 00 2A D0 03 4C A1 F3 4C B3 +F3 A2 00 A9 FF 20 BC F0 A0 00 91 00 C9 FF 20 56 +F8 D0 CE A0 00 A2 00 B1 00 4C BC F3 20 E1 F7 60 +20 96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 A0 00 +20 AC F8 A0 01 20 09 F8 1A D0 01 E8 20 96 F8 A2 +00 A9 FF 20 BC F0 A0 00 20 AC F8 20 E1 F7 60 20 +96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 A0 00 20 +AC F8 A0 01 20 09 F8 A0 00 20 FE F7 C9 02 A9 00 +A2 00 2A D0 03 4C 1B F4 4C 2E F4 A0 01 20 09 F8 +1A D0 01 E8 20 96 F8 A2 00 A9 04 20 75 F4 20 E1 +F7 60 20 96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 +A0 00 20 AC F8 A0 01 20 09 F8 A0 00 20 FE F7 C9 +02 A9 00 A2 00 2A D0 03 4C 5E F4 4C 71 F4 A0 01 +20 09 F8 1A D0 01 E8 20 96 F8 A2 00 A9 04 20 75 +F4 20 E1 F7 60 20 80 F8 4C 9A F4 A0 02 20 09 F8 +20 96 F8 A2 00 A9 FF 48 A0 03 A2 00 A9 01 20 0F +F7 68 20 BC F0 A0 00 20 AC F8 A0 00 B1 00 08 A0 +00 A2 00 B1 00 38 E9 01 91 00 28 D0 CE 20 EF F7 +60 20 88 F7 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 +B0 F0 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 80 F8 +A2 00 86 02 86 03 A9 00 20 38 F8 A2 00 A9 94 20 +11 F3 20 76 F3 A0 00 91 00 A2 00 A9 FF 20 BC F0 +A2 00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 A0 00 +A2 00 B1 00 4C 07 F5 20 D2 F7 60 20 96 F8 A2 00 +A9 FF 20 BC F0 A2 00 A9 00 20 B0 F0 A2 00 A9 FF +20 BC F0 A2 00 A9 08 20 80 F8 A2 01 A9 00 85 02 +A9 00 85 03 A9 AA 20 38 F8 A2 00 A9 86 20 11 F3 +A0 01 20 09 F8 20 32 F4 A2 00 A9 FF 20 BC F0 A2 +00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 20 E1 F7 +60 20 96 F8 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 +B0 F0 A2 00 A9 FF 20 BC F0 A2 00 A9 0D 20 80 F8 +A2 00 86 02 86 03 A9 00 20 38 F8 A2 00 A9 00 20 +11 F3 A0 01 20 09 F8 20 C0 F3 A2 00 A9 FF 20 BC +F0 A2 00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 20 +E1 F7 60 20 96 F8 20 88 F7 A2 00 A9 FF 20 BC F0 +A2 00 A9 00 20 B0 F0 A2 00 A9 FF 20 BC F0 A0 00 +91 00 A0 00 A2 00 B1 00 C9 FF 20 50 F8 D0 03 4C +F3 F5 4C E5 F5 A2 00 A9 FF 20 BC F0 C9 FF 20 50 +F8 D0 F2 A2 00 A9 3A 20 80 F8 A2 00 86 02 86 03 +A9 00 20 38 F8 A2 00 A9 00 20 11 F3 A0 02 20 09 +F8 20 EF F3 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 +B6 F0 A2 00 A9 FF 20 BC F0 20 EF F7 60 20 88 F7 +A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 B0 F0 A2 00 +A9 FF 20 BC F0 A2 00 A9 37 20 80 F8 A2 00 86 02 +86 03 A9 00 20 38 F8 A2 00 A9 00 20 11 F3 20 76 +F3 A0 00 91 00 A2 00 A9 FF 20 BC F0 A2 00 A9 00 +20 B6 F0 A2 00 A9 FF 20 BC F0 A0 00 A2 00 B1 00 +4C 83 F6 20 D2 F7 60 20 88 F7 A2 00 A9 FF 20 BC +F0 A2 00 A9 00 20 B0 F0 A2 00 A9 FF 20 BC F0 A2 +00 A9 29 20 80 F8 A2 00 86 02 A9 40 85 03 A9 00 +20 38 F8 A2 00 A9 00 20 11 F3 20 76 F3 A0 00 91 +00 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 B6 F0 A2 +00 A9 FF 20 BC F0 A0 00 A2 00 B1 00 4C DF F6 20 +D2 F7 60 20 96 F8 20 B8 F7 A0 05 A2 00 B1 00 4C +F2 F6 A0 0E 20 1F F7 60 20 96 F8 20 B8 F7 A0 03 +A2 00 B1 00 4C 07 F7 A0 0E 20 1F F7 60 A0 00 18 71 00 91 00 48 C8 8A 71 00 91 00 AA 68 60 C8 48 -18 98 65 00 85 00 90 02 E6 01 68 60 A0 FF E0 80 -B0 02 A0 00 84 02 84 03 60 A0 00 F0 07 A9 50 A2 -F0 4C 03 02 60 A9 00 85 08 A9 F0 85 09 A9 00 85 -0A A9 02 85 0B A2 CF A9 FF 85 10 A0 00 E8 F0 0D -B1 08 91 0A C8 D0 F6 E6 09 E6 0B D0 F0 E6 10 D0 -EF 60 8C 5B 04 88 88 98 18 65 00 85 08 A6 01 90 -01 E8 86 09 A0 01 B1 08 AA 88 B1 08 20 79 FA A5 -08 A6 09 20 4A FB AC 5B 04 4C DF F7 85 08 86 09 -20 73 F0 4C 6A F8 85 08 86 09 A0 00 B1 08 F0 0E -C8 84 10 20 66 F0 A4 10 D0 F2 E6 09 D0 EE 60 E0 -00 D0 15 4A AA BD 64 FC 90 05 4A 4A 4A 4A 18 29 -0F AA BD 59 FC A2 00 60 38 A9 00 AA 60 A5 00 38 -E9 02 85 00 90 01 60 C6 01 60 A5 00 38 E9 04 85 -00 90 01 60 C6 01 60 A5 00 38 E9 06 85 00 90 01 -60 C6 01 60 A0 01 B1 00 AA 88 B1 00 E6 00 F0 05 -E6 00 F0 03 60 E6 00 E6 01 60 A0 04 4C DF F7 A0 -06 4C DF F7 85 08 86 09 A0 03 B1 00 38 E5 03 D0 -22 88 B1 00 C5 02 D0 0C 88 B1 00 C5 09 D0 05 88 -B1 00 C5 08 08 20 DA F8 28 F0 04 B0 03 A9 FF 60 -A9 01 60 50 04 49 FF 09 01 08 20 DA F8 28 60 A0 -01 B1 00 AA 88 B1 00 60 A0 03 B1 00 85 03 88 B1 -00 85 02 88 B1 00 AA 88 B1 00 60 A2 00 18 65 00 -48 8A 65 01 AA 68 60 20 E4 F8 4C 36 FA 18 49 FF -69 01 48 8A 49 FF 69 00 AA A5 02 49 FF 69 00 85 -02 A5 03 49 FF 69 00 85 03 68 60 A0 03 B1 00 85 -03 88 B1 00 85 02 88 B1 00 AA 88 B1 00 4C DA F8 -A9 00 AA A0 00 84 02 84 03 48 20 AA F8 A0 03 A5 -03 91 00 88 A5 02 91 00 88 8A 91 00 68 88 91 00 -60 85 10 20 C4 F8 85 0A 86 0B 85 0C 86 0D 20 62 -FA 20 C4 F8 85 02 86 03 60 20 A1 F9 A6 03 A4 10 -C0 0A D0 39 A5 02 05 09 05 08 D0 11 E0 80 D0 0D -A0 0B B9 4D FC 91 0A 88 10 F8 4C 31 FA 8A 10 1D -A9 2D A0 00 91 0A E6 0A D0 02 E6 0B A5 08 A6 09 -20 4D F9 85 08 86 09 4C FD F9 20 A1 F9 A9 00 48 -A0 20 A9 00 06 08 26 09 26 02 26 03 2A C5 10 90 -04 E5 10 E6 08 88 D0 EC A8 B9 3D FC 48 A5 08 05 -09 05 02 05 03 D0 D9 A0 00 68 91 0A F0 03 C8 D0 -F8 A5 0C A6 0D 60 D0 06 A2 00 8A 60 D0 FA A2 00 -A9 01 60 F0 F9 30 F7 A2 00 8A 60 F0 02 10 EF A2 -00 8A 60 F0 E9 90 E7 A2 00 8A 60 F0 DB A2 00 8A -2A 60 A0 01 B1 00 85 09 88 B1 00 85 08 4C CC F8 -A9 01 4C 77 FA A9 00 A2 00 48 A5 00 38 E9 02 85 -00 B0 02 C6 01 A0 01 8A 91 00 68 88 91 00 60 48 -84 10 A0 01 B1 00 85 09 88 B1 00 85 08 A4 10 68 -91 08 4C CC F8 A0 00 91 00 C8 48 8A 91 00 68 60 -A0 00 91 00 C8 48 8A 91 00 C8 A5 02 91 00 C8 A5 -03 91 00 68 60 85 0A 86 0B A2 00 A0 00 B1 0A F0 -08 C8 D0 F9 E6 0B E8 D0 F4 98 60 85 08 86 09 85 -0A 86 0B A0 00 B1 08 F0 14 20 83 F8 29 02 F0 06 -B1 08 69 20 91 08 C8 D0 EC E6 09 D0 E8 A5 0A A6 -0B 60 20 C4 F8 85 0A 86 0B E8 8E 2F 02 AA E8 8E -2E 02 20 62 FA 20 C4 F8 85 0C 86 0D A0 00 84 10 -B1 0C 18 65 0A 91 0C C8 B1 0C 65 0B 91 0C CE 2E -02 F0 11 A4 10 B1 08 C8 D0 02 E6 09 84 10 20 66 -F0 4C 2E FB CE 2F 02 D0 EA 60 85 08 86 09 A9 00 -8D 28 02 8D 29 02 A0 01 B1 00 AA 88 B1 00 20 79 -FA A0 02 A9 28 91 00 C8 A9 02 91 00 A5 08 A6 09 -20 FF F4 AD 28 02 AE 29 02 60 A9 30 85 08 A9 02 -85 09 A9 00 A8 A2 02 F0 0A 91 08 C8 D0 FB E6 09 -CA D0 F6 C0 2C F0 05 91 08 C8 D0 F7 60 41 6E 64 -20 74 65 73 74 69 6E 67 20 63 70 72 69 6E 74 66 -0A 00 52 65 73 65 74 20 76 65 63 74 6F 72 3A 20 -25 78 0A 00 53 74 61 72 74 69 6E 67 20 73 64 5F -69 6E 69 74 0A 00 66 69 6E 69 73 68 20 73 64 5F -69 6E 69 74 0A 00 72 63 61 3A 20 25 78 0A 00 44 -6F 6E 65 21 0A 00 53 44 20 54 69 6D 65 64 20 6F -75 74 00 43 4D 44 34 31 3A 20 25 6C 78 0A 00 53 -65 6E 74 20 52 65 73 65 74 0A 00 49 6E 20 73 64 -5F 69 6E 69 74 0A 00 43 4D 44 32 3A 20 25 6C 78 -0A 00 43 4D 44 38 3A 20 25 6C 78 0A 00 30 31 32 -33 34 35 36 37 38 39 41 42 43 44 45 46 2D 32 31 -34 37 34 38 33 36 34 38 00 00 01 02 0C 09 0A 10 -40 50 A0 D0 66 66 66 66 A6 88 88 66 66 66 66 66 -66 66 66 66 09 00 00 00 00 00 00 00 33 33 33 33 -33 00 00 00 50 55 55 25 22 22 22 22 22 22 22 22 -22 02 00 00 40 44 44 14 11 11 11 11 11 11 11 11 -11 01 00 70 00 00 00 00 00 00 00 00 00 00 00 00 +18 98 65 00 85 00 90 02 E6 01 68 60 A0 00 F0 07 +A9 45 A2 F0 4C 00 02 60 A9 00 85 08 A9 F0 85 09 +A9 00 85 0A A9 02 85 0B A2 DA A9 FF 85 10 A0 00 +E8 F0 0D B1 08 91 0A C8 D0 F6 E6 09 E6 0B D0 F0 +E6 10 D0 EF 60 85 08 86 09 20 68 F0 4C 73 F7 85 +08 86 09 A0 00 B1 08 F0 0E C8 84 10 20 5B F0 A4 +10 D0 F2 E6 09 D0 EE 60 A4 00 D0 02 C6 01 C6 00 +60 A5 00 38 E9 02 85 00 90 01 60 C6 01 60 A5 00 +38 E9 03 85 00 90 01 60 C6 01 60 A5 00 38 E9 04 +85 00 90 01 60 C6 01 60 A5 00 38 E9 06 85 00 90 +01 60 C6 01 60 A5 00 38 E9 07 85 00 90 01 60 C6 +01 60 E6 00 D0 02 E6 01 60 A0 01 B1 00 AA 88 B1 +00 E6 00 F0 05 E6 00 F0 03 60 E6 00 E6 01 60 A0 +03 4C 1F F7 A0 06 4C 1F F7 A0 08 4C 1F F7 85 08 +86 09 A2 00 B1 08 60 A0 01 B1 00 AA 88 B1 00 60 +A0 03 B1 00 85 03 88 B1 00 85 02 88 B1 00 AA 88 +B1 00 60 A2 00 18 65 00 48 8A 65 01 AA 68 60 A9 +00 AA A0 00 84 02 84 03 48 20 AB F7 A0 03 A5 03 +91 00 88 A5 02 91 00 88 8A 91 00 68 88 91 00 60 +D0 06 A2 00 8A 60 D0 FA A2 00 A9 01 60 F0 F9 30 +F7 A2 00 8A 60 F0 02 10 EF A2 00 8A 60 F0 E9 90 +E7 A2 00 8A 60 F0 DB A2 00 8A 2A 60 A0 00 B1 00 +A4 00 F0 07 C6 00 A0 00 91 00 60 C6 01 C6 00 91 +00 60 A9 00 A2 00 48 A5 00 38 E9 02 85 00 B0 02 +C6 01 A0 01 8A 91 00 68 88 91 00 60 48 84 10 A0 +01 B1 00 85 09 88 B1 00 85 08 A4 10 68 91 08 4C +E1 F7 A0 00 91 00 C8 48 8A 91 00 68 60 A9 25 85 +08 A9 02 85 09 A9 00 A8 A2 02 F0 0A 91 08 C8 D0 +FB E6 09 CA D0 F6 C0 00 F0 05 91 08 C8 D0 F7 60 +45 72 72 6F 72 20 69 6E 69 74 20 53 44 20 43 41 +52 44 0D 0A 00 53 44 20 43 61 72 64 20 69 6E 69 +74 0D 0A 00 53 74 61 72 74 0D 0A 00 6F 70 5F 63 +6F 6E 64 20 65 72 72 6F 72 0D 0A 00 49 46 20 43 +6F 6E 64 0D 0A 00 47 6F 20 49 44 4C 45 0D 0A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -254,4 +199,59 @@ CA D0 F6 C0 2C F0 05 91 08 C8 D0 F7 60 41 6E 64 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -00 00 00 00 00 00 00 00 00 00 A5 F0 30 F0 A6 F0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 9A F0 25 F0 9B F0 diff --git a/hw/efinix_fpga/ip/uart/ipm/component.pickle b/hw/efinix_fpga/ip/uart/ipm/component.pickle index 812cad03c96171fdd1087cb031c06e11266f3898..2a652e30158ff6b700bfd2559609586bc921ff08 100644 GIT binary patch delta 2693 zcmbW3O=uHA6vsPtQ>)T8Ax&%=lP1`Fn>9_fY86eiwY1cxhWLr7iB^`u)@WP5+Dcml zE5<{8tDr?iJ%}HNN-iQOih59rcu`Rh1X1wdM-E~SD$YhDBs04~FOS)o_j~i+?tkCR znXa)eZjd{vzQMgJRpB92Pyngga%d|lhM%Ro(Su~Xti4cuhs@)<#JGmU0TJJary3I~ zNq*9-M3o;i(@sH^n6^B)reRAs7-q(X%+N~7p}1Dw~-pksfi zs7CLTrG_PFW>#KB?ZI$!WP_Ahw9-a0J5srprazJ;8)%I?!KZsCU)X;pcfzy`ZHItq zD~iJfQv&q^Z}y;J*l6x_ADZ&#>p1Zc8RAjN3`^#4X65(e2&BxbDfe^o?xTDIj8~~C zV$(=2%qj?a9uujP%a>BZ#jIe|? zu8f2j!n&OgVGHZAGPcg+rR4HL4q?dUo5xA<@Be{6F~{x6mFrhIemw`8*$bh{t1ioG zZG|cbnraxmZP2?ooat>uSma1b=y`r_Pe*r8tfOn2Ft;bRr8l~#hugv6Z~Y*9mAQ}>HARJ$aCrIkX7e}zWF8D5k4zNFc2AoRmXE? oX%IJh4bqX%tqeD=7I9W89Qf)Cf2;Zq;ktzg!7*Zs;6dHmU*=l|+yDRo delta 2730 zcmbW3OH30%7{?jdia?-kc(&zHftErkg@slGf|LMiAX0e+)C3_kEDJ>ng`h$di3ym- zgWnnxG?=Id+s2q$Oe9RWBX=l3|y?mM3ncsiD+5OMA zb7gRDkUB$Mk}puJabS(r!p}GtTK2l+_He}`6c)xV;*dMVO>*oKyilg0IPWKA9a3-j z9~&5%C#u@kTGQENYpLbfO=yfape^rsycUrPw-WTI-}^jaA4&{RpsE`i8+h25l!dmS zG3hADK1kA`+urv{P7yYK%byq1Fv%I%`S7qXSd2}Pu{X9`@$fEHNos#g$wup5xvBys z2jsQGZfiQw(!poet=8epX4GvYy@7}Hkf0fWd`kw*B(H?t-2Wzs()J<;*wT(67hF&C zph+;N8__fzNq6R*j`;nF4D4ClWH0hznh)pvBir3sP-c}uenv8ZToXs^nbBot_i)$X zh_lb_b_^GcacuCacf}<3fYwB%L^{U1oI?W+j_vg)hV8@N$NQp{tcw>I@ei;rnATSA zJc;{EDtij*b8?8RpYTNJjoLHiuvQR5V6UXH4l{{;kiyi&N?#<9Tor-*5JNhM=`ob} zE6CFlNQxAqfYl-ef$7Atm)ZHcU`x>DucbnORwO7rANA%bdS8H&stbV)0WO2$5?-#n`0ue>qN~rB(x;2 zyM4++nQu}W6Efd>p%4K} zeKQ&ee*GVK$j>tdTl#A#zJmg#xfB;fg*>1PM##XXr4_+eg(*|{-!iylA`f(eOri$J z;jLCl9OzvVScvLbAdLwbxLgV&4ZL3h5ioG87(yDjTWq?pfsace!UmoY#}3jOqNdFX zA#j1_s5v|WkL8Kc>?XeM@b?@W)E3jI4#sh;hdVgh;SG+hpe!jyhoKh7PB?*M58NxM zGF`{G(;X#peJ_wa zMXsU3L4TGAP?RlDqdK{H+NDYWnWvVBD7%%1P@l>^ zDw9$%`3x;-Aw0)gV1T} zh7tzvkPB}$bN)gAK4qB-0DH8L`*2-h#%N;z&=^cTzVQ&O9cFhf0$tME`$m%=@pe-J zPgV;;hJVljh)tQ&<4ES_mo=@T2?^~1p>`_~d5^Q6R&$za+(HIIV)uYpZ(|YZ+?wJ; z3#5t;tw-&?uH|Y4X=`Fy%F9Ci-0f*7(#MBwsrlkfA!!}ZKt#$TXh+BmhLD_2nobN6 zNdvAHHOM5fLewG)zP+{*X*(veeKL5&?_wj~V>Pe5@SyVrN1$>a1B>#KcfdD>6^v^f zoQMjUh*-G<%>-#dE{n)8JMAV+XYm6GG>e@_xRGeuqOF*?y=vJQIevTgMmD|u)Y)ey zP6k_yCyBif4sxX-di@ZVD9uyX!aXpW`_S z+1K7?CmCfh%2#+jU~5(&1$kt|a+V``rK0BLRe61AcIN85v^oO{tyF0_rw@&X)B^|R zF05qc(yQqOP;9+cN1#sY<@_wOCu6}lEefM^;#uk+XqA+M!#NlTq-`-4kSSpx zr_Q?W(aC_|!C)ZYj0I#`7|7Ha*D_rU2p$Xu@_sBJXGDQ?O-xL=w&`||u%kgxUTAx( zofp*oo*=WbvLqN^W;22DB{d7IEF8~W>2hwZC_BF62A1J9e>iWf!ka;B9#Ved4Jkk4 zAq8%3lEa9pjQd;} z9V>-GeRu^$2pD5wHGMgT8ocq{OwmS;5_%@5#_hj4MYzWUz4rO7ZJy~puHi$|TpM0A z778e@IcG*j^{)mnzr}<*~x;-;dQlW z-v#KEnilUCr_bzP$SlE}PUzeY%;8XmtQd<^gFah_h3*cGj*cOxF}vK}kjpaE^%ZS& zGfqVelTZ|E(@CfibGIXOna*pO1I@)*P@J&iMKK#nonLb2WLv=bRQ&(+JM`|i+@F^qFj*jMlqQu)ajM;N`RFQ zZ8ly4eAk|J(vv|w=yzJiDgn|@$M9AfDy4$Fu9o4^O`H_f5Hbh-c>N3$ppFw893iEO z1W`H}?7G-c$8o1{!$T`clQ&d7apbSZ?dO;Pccz(_tXDU3W7)~^g~_RDaFNZMsxijZ zG+KqnZ=+kKVvMS$!DUW@%f#cJpg;4;`jfCL$0NG}j1%-?A+#5Hm?DF`4-=PY5koDh z@6w__=2J|bnJ0&+yicH(P~LUsCgR*W zOt?x3fXmZ<9F5i2*>$Oo^8(Yg5F*d^Er7^*wH6{z@-2YKd5JdGP?nw|fuM>pK z%*&a;f#c8SNnl2m2SQ-OM>$VUJ6IL860SdWCsA%>F(3q&XHM4@FiWe`Py|d)wYCU& zie;Q^Bzw_8cdl{JMRX)#_J1@d>=ezVjJ`b(PjhgkK(R2io z0S8HXK9il9T}tl+6i{#tfY|s#l)|7~T$#VRl(unwbgk_7Xr+|fQcJZ`2!y@1)QdCM z!v(jW4qh+D7cTjvs^xf6VM$fpB6^<_kfY!a-lvFsu_1qocn~`~x3n_1DA|v%Ls!X> z$ABYSK>2{%ij{o=kE$PUkQ{F;kQY-N0{Jfd7I65XAenL8o~*Z6XdDM8wLqa{3l4j& z+W2hP8Q89UhWOHv5LZ5EyE0#|7vNeRb$1`TP2B}nQ+i%lfG6Vc*2EP7c|*cD^;9lOm}e)_zK+~*C3y{ki+&p38WFVo~BfzQ&FP@z!^(kHI% zg(YIaYkME`abvEPim@o`DC)x3K8brh-6<5wjx`Z0>}M^KE9`Kt+!zjbB&fGyp6ALl zA#~9-fz6!`mkct0>qp@Wnd=gDSbODjsJoGqU`v)H`@HSEjuo}Y?TG-f3Bp!c%G z_JXF~EbLaT5i9IfuGkn}H5i~_F{g6Hi8|FGl#S6#g8DV$^#q?!?e;YDx>VH4O{e_v zv`!MKUK8^u$B*lT3OiIwqze0!D>a5cJ=$nfF?VvMnZ3tuqsE#?DYlxoE>1yc%U-=C z&0R>(ErzE>pHKC9+le@pV_$FcBwqD*F|TssRJ~MTw`z@8VZU<4#_%gAPWk#O=2)&c z!8lbjQ&O%#;HF_j=>=CDfo&SLdDyPOCc~z|b_cdsVf!|0--qo@*xrWi9oYT=+Xt|H zxNVVMxP1h2$R;MfU|RQ%l=FVEPKNQ?Q%Ii2Ce2Duom|1|7P_beo#gzx760zGfA_2Y z-EaAKzvth5-QFEBBa0Fu-$C*NBtJ&-D1 z@+Tz!K++BmYyiz3B!ftvLUI<#0+K9}H6&FeUq)ggxr^i;k~fh263K6oyocliB>zS7 z0Nk1Yh<+p|keo&`i{ug#2}v2rHWCxbT_pFAypH58B)>-T9+D4`e2An6VkAgEfaEBW zNhIfxEFrm$WF3itAJXm>_Aj&5h%IRlK1 z9~?JqTsY(5|Kot{+&CC9o4wHjFUcs>*P5N5um}k|KWUL7oUf7Skp`ijr`y1{U&(nY zDfA+MlZm_tFfB%2bPC>7ioEEwMOGp&nzG2{$cv^eawYPjGZwiD7u85~O!8S25})@i zKXRQ)@>tY&9#r^6TS#1YHTcaw%42rfAOF!Ur3XHwld^-nIncl) zU(sZT#e*{ilFP$W^;>m(at3^K2r~q*>XZu`0EnFH1~u(osTpb5_qG@T(fA1>rNiu@ zRcJxY8`!=E-}IqnDY*cx?U@#`2*2#?1H60HGAw`E&}4Yi)8^loDbL&cJ^|!1v{5?9 ho1h}QDfuD&^&|Rkp0P8#rI%&8VQPcKuASZC8Vl-fOF@}y)&~r zJ2Q8>ZeOr8K0816obR4+)2?le7s~}*m-X?Ix}g>7 zie>gMsAue7-?EN9XWg>K%w9Zm%QAbVYON&O2Y1(NnvpiPq*_|lrMf2Ta@Bw{X76U9 z+>kBva9yjF8bw2`Ri#2*9j~j!Yh`&{mo>FeR=-@JCoFUL0x-9z8vT%tVgI=ir(50Iklfs?!7eFx``Umwj|ZB5oJiZ6E&&at=wb( z0=6Ug1JKbHHag{igG{+kNwe!7z#kqtdzt3f8u|?(QT?C@+DJs&h%F5;mI_88y(t%s znkJRyb!zM2o(-FOs70=1=kqJ8%h|;slk__b8ItakmbcTW^IWx^&ik3p_XVNT)D0yJ z-d-2pYVOS00DQ`MDgf-!J?X=>%8b#)0H86LdVC`xSUb$_Tm(9!xA(0kKj`hI1U{^m zgbcsK0fle{T%W%6zStVw$x(znvk>}XdoixUbG`*1w%+qFHIzdh@??h ziyGvRSRv{h3%-N45@|aovO5zz;_qN1-eWbdyzrp&q$5yy69bDPc?W!JSi!i)!HKAl ziHMa;&`gjPJ(17edg#={Q^$fW z#*@TO2nU5qnqHsA;-r1*y658T>g@U4h5VJ-<)Bi6GGREnr-B9ZiU6(H)aQ7PLUwj{ z*-1t@5albp9KIgLgPfmb_FR*1K#4Y$nVf`TQmvNcEo-R@3M`tB@o>=CIsa0MjnGh> zQ|)k)MbNlCOaT$e!45eG|IAe81Rx>H@O!D7!LW}7!gzWx7L1HAj1#9gj5`<%`&b~1 z-|dP8lcGTSrlzJ{+w?m~*wG*;=el0)<^}bL zC&;XB!>}G8E~RO1!_AiF;k9ucKhW}J!` zrk^O*w$o2z=8z-w0-ez^N85|DpzJtuM;DJs_9T^8zdRanw>uu*Ax$pI>ZTm8D&_uZi*$y@b_Vy#jsR7;X>!0mK0YaZlU3gSq0 zRTUc`Cu86)$wiohPB=(hyV{63uWiCAS38H5^V%k?Ww|63jdC(iXwoa^l>jRr+HAZ8 z_^v(cq$h*A$M3X^RRW}s#_(1eDy5RVu2$ipO`H_f5;70?@%kAiKpiJGI6^8l38Hi| z*iEsaiQ{(RhR0QsCU2;E;>h2O+s`op?p!-BS+8#tCi0od#mw{!xX9);)tKOF8n45H zxACn?IYw2};xfm;W#Vy9(4U25{YluB2O_%yj1%-?F|-#&m?DF`4-=PY5ksx0)eQ-Z zHLjP6Nlfw}>qj{21U=c!dXkBQ%Trk>w`tKI^C>3J%$YQm_c7EG%57(EBF?SDl&h2g zxIFF0(O7ex-IVG$FECvPA@XeB0f?MeXCd+=-vNl6mng)^P(!oio&;h0Izh;rdf|66Hn~143|l=5$>Fv$Q$`ML=e{vqiu|EaT)O z*^3Uk)2)Lpq9X~j|B>iEVEPxb!)zP)?NT%7FKOC8$~q9iThsyvSQiXgH`XA)D{@;Z&704?X0z$@bEme(U4K+Ab0KpQgNa2DL2#@e1TN7N4xrA ztVwd0>_{68wcYb}Sctq27bmf$&Sx&?nitbRQcJ_LM1lM8Q9ls5q#E?mbOe%72T67z zm!F+m&Ta=3P;di)*!V(}!l0aAS-8BMwQ+rTt?cq>rBc{ZD~(DBgq^n3^RrjO1$Una zUN6QMF8QRY)p$~2NmbMGdA}1xu2S2BeVt!knO~CZr`Ms2MpRD((}FoJP?Q1B`z5n%x?z2G2yJeU<(A;>P%Qs7`{5w=Xfc) zVvxC9?8QYa>QY$=TaIf7?fTVqkbS&~`j~BaQ%;Cc~ z`NB`17m?e%!H{=xDDxS|j@b(|_ekKgbRkq|)Pn4ZOM793Sn$%`9X@W%wNf$GWF10X z_}V9NuTS?1MY6+f#0vXahvW)7oGUkm!yOFjt(fPz@=OR_bV*=)r^6M4%-=>(_+sv= zL><;%_#EnPa={)n1g1(My8zHRA0ApHB^Wnt5F+YT>3+{&-p^iBvC%d6eVFO+tkosv}Z` z{mGRY!=LuI+EmP)TxsUu;hU(j_ECy0=52~o5ZdyWFG}-gv-3;gY0>9X!`^mYr-~V; zyv>t%)w^O|<;1CGslsm68L`5C<%*5rS5BPr^;OKVTycVNs$r(2LW#gl!fe3Fzxy@+?sxsWKl1PX%-$U{Ba0F< zD#5S|+FG_jUPoc%^LDq$6G*;jlLmRiK5Iq<9-aIhd$8u{<{fMnewV0||6;2Rr_~Nv zeF?T>yZdqXQ%D{~at_H=B3+QAo)F#zaaSsl6R4G!SfmreN*xXw zCYvj8-{d57AWe6oNnpHSQNf7@P84uPzccEc(e8|L9No^ia|Re2KR9mKxNye9|HlE@ zzHu;SwtJxk-jPwLueCcrWf2l~K4XzGoNtimkp`ijr`y1nU&$FNDfA+MlZ(6vFfB!1 zblf86BQH8(k(J1crY-V#6zAGt~;c`WKX4=Q}h z77`uRLWO)GLWpDwiH?h7X4w09q)5fIzXEzA+k&E_YiMttjOfkNR0zap`t2UwG7q$T z`$v=MHxxEi`8u2)pkLg%0>9bUc+5Wgt3SG>48Rw3Qg)CxM_ZT_Yntq^*fCoog(5su zztO~}V8GXgFhc;VUb(aZfXL~7P}9&#!^pzEx5XHU#%~WPJ>~$dLQ87V!1fLJm=7&W z$ysP^&$N&w_+@7w;612TVfE97Cc}%KHvi#Vb-~{E2_TO{8>NT*5>#Y2CBLG-UZMXM U7(26Hx-Q$_l)2D=Fa3=F4{Vlc{r~^~ diff --git a/hw/efinix_fpga/ip/uart/settings.json b/hw/efinix_fpga/ip/uart/settings.json index 182d6fc..cee281a 100644 --- a/hw/efinix_fpga/ip/uart/settings.json +++ b/hw/efinix_fpga/ip/uart/settings.json @@ -19,31 +19,16 @@ "ENABLE_PARITY": "1'b0", "FIX_BAUDRATE": "1'b1", "PARITY_MODE": "1'b0", - "BOOTUP_CHECK": "1'b1" + "BOOTUP_CHECK": "1'b0" }, "output": { "external_source_source": [ - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_define.vh", "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_tmpl.v", "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_tmpl.vhd" - ], - "external_example_example": [ - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/command_state.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/decoder.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/encoder.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/led_ctl.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/resets.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_defines.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_demo_top.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/user_register.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_demo.peri.xml", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_demo.xml", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_timing_T20.sdc", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart.v", - "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/T20F256_devkit/uart_define.vh" + "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_tmpl.vhd", + "/home/byron/Projects/super6502/hw/efinix_fpga/ip/uart/uart_define.vh" ] }, "sw_version": "2023.1.150", - "generated_date": "2023-07-16T20:20:12.259229" + "generated_date": "2023-07-23T03:23:04.338270" } \ No newline at end of file diff --git a/hw/efinix_fpga/ip/uart/uart.v b/hw/efinix_fpga/ip/uart/uart.v index f80fc6d..3814be2 100644 --- a/hw/efinix_fpga/ip/uart/uart.v +++ b/hw/efinix_fpga/ip/uart/uart.v @@ -43,7 +43,7 @@ // //////////////////////////////////////////////////////////////////////////////// -`define IP_UUID _d1961caf8b8d4ca092806671a99095c2 +`define IP_UUID _8d7ceb45e0e64e208e634a02f6a59365 `define IP_NAME_CONCAT(a,b) a``b `define IP_MODULE_NAME(name) `IP_NAME_CONCAT(name,`IP_UUID) module uart ( @@ -69,7 +69,7 @@ input [7:0] tx_data .ENABLE_PARITY (1'b0), .FIX_BAUDRATE (1'b1), .PARITY_MODE (1'b0), -.BOOTUP_CHECK (1'b1) +.BOOTUP_CHECK (1'b0) ) u_top_uart( .tx_o ( tx_o ), .rx_i ( rx_i ), diff --git a/hw/efinix_fpga/ip/uart/uart_define.vh b/hw/efinix_fpga/ip/uart/uart_define.vh index 40752e0..a1de19d 100644 --- a/hw/efinix_fpga/ip/uart/uart_define.vh +++ b/hw/efinix_fpga/ip/uart/uart_define.vh @@ -49,4 +49,4 @@ localparam BAUD = 115200; localparam ENABLE_PARITY = 1'b0; localparam FIX_BAUDRATE = 1'b1; localparam PARITY_MODE = 1'b0; -localparam BOOTUP_CHECK = 1'b1; +localparam BOOTUP_CHECK = 1'b0; diff --git a/hw/efinix_fpga/simulation/spi_controller b/hw/efinix_fpga/simulation/spi_controller deleted file mode 100755 index c2ed4e5..0000000 --- a/hw/efinix_fpga/simulation/spi_controller +++ /dev/null @@ -1,448 +0,0 @@ -#! /usr/bin/vvp -:ivl_version "12.0 (stable)"; -:ivl_delay_selection "TYPICAL"; -:vpi_time_precision - 9; -:vpi_module "/usr/lib64/ivl/system.vpi"; -:vpi_module "/usr/lib64/ivl/vhdl_sys.vpi"; -:vpi_module "/usr/lib64/ivl/vhdl_textio.vpi"; -:vpi_module "/usr/lib64/ivl/v2005_math.vpi"; -:vpi_module "/usr/lib64/ivl/va_math.vpi"; -:vpi_module "/usr/lib64/ivl/v2009.vpi"; -S_0x55defa4f97e0 .scope package, "$unit" "$unit" 2 1; - .timescale 0 0; -S_0x55defa4f9970 .scope module, "sim" "sim" 3 1; - .timescale -8 -9; -v0x55defa5217a0_0 .var "_spi_device_data", 7 0; -v0x55defa5218a0_0 .var "clk_50", 0 0; -v0x55defa521960_0 .var "data", 7 0; -v0x55defa521a20_0 .var "i_addr", 1 0; -v0x55defa521ae0_0 .var "i_clk", 0 0; -v0x55defa521bd0_0 .var "i_cs", 0 0; -v0x55defa521c70_0 .var "i_data", 7 0; -v0x55defa521d10_0 .var "i_rst", 0 0; -v0x55defa521db0_0 .var "i_rwb", 0 0; -v0x55defa521e50_0 .var "i_spi_miso", 0 0; -v0x55defa521f20_0 .net "o_data", 7 0, v0x55defa520590_0; 1 drivers -v0x55defa521ff0_0 .net "o_spi_clk", 0 0, L_0x55defa4e9b80; 1 drivers -v0x55defa5220c0_0 .net "o_spi_cs", 0 0, L_0x55defa4e84f0; 1 drivers -v0x55defa522190_0 .net "o_spi_mosi", 0 0, L_0x55defa4e09c0; 1 drivers -E_0x55defa4f0300 .event edge, v0x55defa520670_0; -S_0x55defa4b6270 .scope module, "dut" "spi_controller" 3 22, 4 1 0, S_0x55defa4f9970; - .timescale 0 0; - .port_info 0 /INPUT 1 "i_clk"; - .port_info 1 /INPUT 1 "i_rst"; - .port_info 2 /INPUT 1 "i_cs"; - .port_info 3 /INPUT 1 "i_rwb"; - .port_info 4 /INPUT 2 "i_addr"; - .port_info 5 /INPUT 8 "i_data"; - .port_info 6 /OUTPUT 8 "o_data"; - .port_info 7 /OUTPUT 1 "o_spi_cs"; - .port_info 8 /OUTPUT 1 "o_spi_clk"; - .port_info 9 /OUTPUT 1 "o_spi_mosi"; - .port_info 10 /INPUT 1 "i_spi_miso"; -L_0x55defa4e84f0 .functor NOT 1, L_0x55defa522260, C4<0>, C4<0>, C4<0>; -L_0x55defa4e9b80 .functor BUFZ 1, v0x55defa520dd0_0, C4<0>, C4<0>, C4<0>; -L_0x55defa4e09c0 .functor BUFZ 1, v0x55defa520d10_0, C4<0>, C4<0>, C4<0>; -v0x55defa4e8690_0 .net *"_ivl_1", 0 0, L_0x55defa522260; 1 drivers -v0x55defa4e9d20_0 .var "active", 0 0; -v0x55defa4e0b20_0 .var "count", 2 0; -v0x55defa4e11c0_0 .net "i_addr", 1 0, v0x55defa521a20_0; 1 drivers -v0x55defa4e14a0_0 .net "i_clk", 0 0, v0x55defa521ae0_0; 1 drivers -v0x55defa4dfca0_0 .net "i_cs", 0 0, v0x55defa521bd0_0; 1 drivers -v0x55defa4e0660_0 .net "i_data", 7 0, v0x55defa521c70_0; 1 drivers -v0x55defa520350_0 .net "i_rst", 0 0, v0x55defa521d10_0; 1 drivers -v0x55defa520410_0 .net "i_rwb", 0 0, v0x55defa521db0_0; 1 drivers -v0x55defa5204d0_0 .net "i_spi_miso", 0 0, v0x55defa521e50_0; 1 drivers -v0x55defa520590_0 .var "o_data", 7 0; -v0x55defa520670_0 .net "o_spi_clk", 0 0, L_0x55defa4e9b80; alias, 1 drivers -v0x55defa520730_0 .net "o_spi_cs", 0 0, L_0x55defa4e84f0; alias, 1 drivers -v0x55defa5207f0_0 .net "o_spi_mosi", 0 0, L_0x55defa4e09c0; alias, 1 drivers -v0x55defa5208b0_0 .var "r_baud_rate", 7 0; -v0x55defa520990_0 .var "r_clock_counter", 8 0; -v0x55defa520a70_0 .var "r_control", 7 0; -v0x55defa520b50_0 .var "r_input_data", 7 0; -v0x55defa520c30_0 .var "r_output_data", 7 0; -v0x55defa520d10_0 .var "r_spi_mosi", 0 0; -v0x55defa520dd0_0 .var "spi_clk", 0 0; -E_0x55defa4f2fe0/0 .event anyedge, v0x55defa4e11c0_0, v0x55defa5208b0_0, v0x55defa520b50_0, v0x55defa4e9d20_0; -E_0x55defa4f2fe0/1 .event anyedge, v0x55defa520a70_0; -E_0x55defa4f2fe0 .event/or E_0x55defa4f2fe0/0, E_0x55defa4f2fe0/1; -E_0x55defa4f1160 .event negedge, v0x55defa4e14a0_0; -L_0x55defa522260 .part v0x55defa520a70_0, 0, 1; -S_0x55defa521050 .scope task, "read_reg" "read_reg" 3 40, 3 40 0, S_0x55defa4f9970; - .timescale -8 -9; -v0x55defa521220_0 .var "_addr", 2 0; -v0x55defa521320_0 .var "_data", 7 0; -E_0x55defa4da3a0 .event posedge, v0x55defa4e14a0_0; -TD_sim.read_reg ; - %wait E_0x55defa4f1160; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %load/vec4 v0x55defa521220_0; - %pad/u 2; - %assign/vec4 v0x55defa521a20_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %pushi/vec4 255, 0, 8; - %assign/vec4 v0x55defa521c70_0, 0; - %wait E_0x55defa4da3a0; - %load/vec4 v0x55defa521f20_0; - %assign/vec4 v0x55defa521320_0, 0; - %wait E_0x55defa4f1160; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %end; -S_0x55defa521400 .scope task, "write_reg" "write_reg" 3 27, 3 27 0, S_0x55defa4f9970; - .timescale -8 -9; -v0x55defa5215e0_0 .var "_addr", 2 0; -v0x55defa5216c0_0 .var "_data", 7 0; -TD_sim.write_reg ; - %wait E_0x55defa4f1160; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %load/vec4 v0x55defa5215e0_0; - %pad/u 2; - %assign/vec4 v0x55defa521a20_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %pushi/vec4 255, 0, 8; - %assign/vec4 v0x55defa521c70_0, 0; - %wait E_0x55defa4da3a0; - %load/vec4 v0x55defa5216c0_0; - %assign/vec4 v0x55defa521c70_0, 0; - %wait E_0x55defa4f1160; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %end; - .scope S_0x55defa4b6270; -T_2 ; - %wait E_0x55defa4f1160; - %load/vec4 v0x55defa520350_0; - %flag_set/vec4 8; - %jmp/0xz T_2.0, 8; - %pushi/vec4 1, 0, 8; - %assign/vec4 v0x55defa5208b0_0, 0; - %pushi/vec4 0, 0, 8; - %assign/vec4 v0x55defa520b50_0, 0; - %pushi/vec4 0, 0, 8; - %assign/vec4 v0x55defa520c30_0, 0; - %pushi/vec4 0, 0, 8; - %assign/vec4 v0x55defa520a70_0, 0; - %pushi/vec4 0, 0, 9; - %assign/vec4 v0x55defa520990_0, 0; - %pushi/vec4 0, 0, 3; - %assign/vec4 v0x55defa4e0b20_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa520dd0_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa4e9d20_0, 0; - %jmp T_2.1; -T_2.0 ; - %load/vec4 v0x55defa520410_0; - %inv; - %load/vec4 v0x55defa4dfca0_0; - %and; - %flag_set/vec4 8; - %jmp/0xz T_2.2, 8; - %load/vec4 v0x55defa4e11c0_0; - %dup/vec4; - %pushi/vec4 0, 0, 2; - %cmp/u; - %jmp/1 T_2.4, 6; - %dup/vec4; - %pushi/vec4 1, 0, 2; - %cmp/u; - %jmp/1 T_2.5, 6; - %dup/vec4; - %pushi/vec4 2, 0, 2; - %cmp/u; - %jmp/1 T_2.6, 6; - %dup/vec4; - %pushi/vec4 3, 0, 2; - %cmp/u; - %jmp/1 T_2.7, 6; - %vpi_call/w 4 52 "$warning", "value is unhandled for priority or unique case statement" {0 0 0}; - %jmp T_2.8; -T_2.4 ; - %load/vec4 v0x55defa4e0660_0; - %assign/vec4 v0x55defa5208b0_0, 0; - %jmp T_2.8; -T_2.5 ; - %jmp T_2.8; -T_2.6 ; - %load/vec4 v0x55defa4e0660_0; - %assign/vec4 v0x55defa520c30_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa4e9d20_0, 0; - %jmp T_2.8; -T_2.7 ; - %load/vec4 v0x55defa4e0660_0; - %assign/vec4 v0x55defa520a70_0, 0; - %jmp T_2.8; -T_2.8 ; - %pop/vec4 1; -T_2.2 ; - %load/vec4 v0x55defa4e9d20_0; - %flag_set/vec4 8; - %jmp/0xz T_2.9, 8; - %load/vec4 v0x55defa520c30_0; - %parti/s 1, 7, 4; - %assign/vec4 v0x55defa520d10_0, 0; - %load/vec4 v0x55defa520990_0; - %addi 1, 0, 9; - %assign/vec4 v0x55defa520990_0, 0; - %load/vec4 v0x55defa5208b0_0; - %pad/u 9; - %load/vec4 v0x55defa520990_0; - %cmp/u; - %flag_or 5, 4; - %jmp/0xz T_2.11, 5; - %pushi/vec4 0, 0, 9; - %assign/vec4 v0x55defa520990_0, 0; - %load/vec4 v0x55defa520dd0_0; - %inv; - %assign/vec4 v0x55defa520dd0_0, 0; - %load/vec4 v0x55defa520dd0_0; - %cmpi/e 0, 0, 1; - %jmp/0xz T_2.13, 4; - %load/vec4 v0x55defa520c30_0; - %ix/load 4, 1, 0; - %flag_set/imm 4, 0; - %shiftl 4; - %assign/vec4 v0x55defa520c30_0, 0; - %load/vec4 v0x55defa4e0b20_0; - %addi 1, 0, 3; - %assign/vec4 v0x55defa4e0b20_0, 0; -T_2.13 ; - %load/vec4 v0x55defa520dd0_0; - %cmpi/e 1, 0, 1; - %jmp/0xz T_2.15, 4; - %load/vec4 v0x55defa520b50_0; - %parti/s 7, 0, 2; - %load/vec4 v0x55defa5204d0_0; - %concat/vec4; draw_concat_vec4 - %assign/vec4 v0x55defa520b50_0, 0; - %load/vec4 v0x55defa4e0b20_0; - %cmpi/e 0, 0, 3; - %jmp/0xz T_2.17, 4; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa4e9d20_0, 0; -T_2.17 ; -T_2.15 ; -T_2.11 ; -T_2.9 ; -T_2.1 ; - %jmp T_2; - .thread T_2; - .scope S_0x55defa4b6270; -T_3 ; -Ewait_0 .event/or E_0x55defa4f2fe0, E_0x0; - %wait Ewait_0; - %load/vec4 v0x55defa4e11c0_0; - %dup/vec4; - %pushi/vec4 0, 0, 2; - %cmp/u; - %jmp/1 T_3.0, 6; - %dup/vec4; - %pushi/vec4 1, 0, 2; - %cmp/u; - %jmp/1 T_3.1, 6; - %dup/vec4; - %pushi/vec4 2, 0, 2; - %cmp/u; - %jmp/1 T_3.2, 6; - %dup/vec4; - %pushi/vec4 3, 0, 2; - %cmp/u; - %jmp/1 T_3.3, 6; - %vpi_call/w 4 88 "$warning", "value is unhandled for priority or unique case statement" {0 0 0}; - %jmp T_3.4; -T_3.0 ; - %load/vec4 v0x55defa5208b0_0; - %store/vec4 v0x55defa520590_0, 0, 8; - %jmp T_3.4; -T_3.1 ; - %load/vec4 v0x55defa520b50_0; - %store/vec4 v0x55defa520590_0, 0, 8; - %jmp T_3.4; -T_3.2 ; - %jmp T_3.4; -T_3.3 ; - %load/vec4 v0x55defa4e9d20_0; - %load/vec4 v0x55defa520a70_0; - %parti/s 7, 0, 2; - %concat/vec4; draw_concat_vec4 - %store/vec4 v0x55defa520590_0, 0, 8; - %jmp T_3.4; -T_3.4 ; - %pop/vec4 1; - %jmp T_3; - .thread T_3, $push; - .scope S_0x55defa4f9970; -T_4 ; - %delay 10, 0; - %load/vec4 v0x55defa5218a0_0; - %pushi/vec4 0, 0, 1; - %cmp/e; - %flag_get/vec4 6; - %store/vec4 v0x55defa5218a0_0, 0, 1; - %jmp T_4; - .thread T_4; - .scope S_0x55defa4f9970; -T_5 ; - %delay 1000, 0; - %load/vec4 v0x55defa521ae0_0; - %pushi/vec4 0, 0, 1; - %cmp/e; - %flag_get/vec4 6; - %store/vec4 v0x55defa521ae0_0, 0, 1; - %jmp T_5; - .thread T_5; - .scope S_0x55defa4f9970; -T_6 ; - %vpi_call/w 3 55 "$dumpfile", "spi_controller.vcd" {0 0 0}; - %vpi_call/w 3 56 "$dumpvars", 32'sb00000000000000000000000000000000, S_0x55defa4f9970 {0 0 0}; - %end; - .thread T_6; - .scope S_0x55defa4f9970; -T_7 ; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521d10_0, 0; - %pushi/vec4 5, 0, 32; -T_7.0 %dup/vec4; - %pushi/vec4 0, 0, 32; - %cmp/s; - %jmp/1xz T_7.1, 5; - %jmp/1 T_7.1, 4; - %pushi/vec4 1, 0, 32; - %sub; - %wait E_0x55defa4da3a0; - %jmp T_7.0; -T_7.1 ; - %pop/vec4 1; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521bd0_0, 0; - %pushi/vec4 1, 0, 1; - %assign/vec4 v0x55defa521db0_0, 0; - %pushi/vec4 0, 0, 2; - %assign/vec4 v0x55defa521a20_0, 0; - %pushi/vec4 0, 0, 1; - %assign/vec4 v0x55defa521d10_0, 0; - %pushi/vec4 5, 0, 32; -T_7.2 %dup/vec4; - %pushi/vec4 0, 0, 32; - %cmp/s; - %jmp/1xz T_7.3, 5; - %jmp/1 T_7.3, 4; - %pushi/vec4 1, 0, 32; - %sub; - %wait E_0x55defa4da3a0; - %jmp T_7.2; -T_7.3 ; - %pop/vec4 1; - %pushi/vec4 3, 0, 3; - %store/vec4 v0x55defa5215e0_0, 0, 3; - %pushi/vec4 1, 0, 8; - %store/vec4 v0x55defa5216c0_0, 0, 8; - %fork TD_sim.write_reg, S_0x55defa521400; - %join; - %pushi/vec4 2, 0, 3; - %store/vec4 v0x55defa5215e0_0, 0, 3; - %pushi/vec4 170, 0, 8; - %store/vec4 v0x55defa5216c0_0, 0, 8; - %fork TD_sim.write_reg, S_0x55defa521400; - %join; - %pushi/vec4 128, 0, 8; - %store/vec4 v0x55defa521960_0, 0, 8; -T_7.4 ; - %load/vec4 v0x55defa521960_0; - %pad/u 32; - %pushi/vec4 128, 0, 32; - %and; - %or/r; - %flag_set/vec4 8; - %jmp/0xz T_7.5, 8; - %pushi/vec4 3, 0, 3; - %store/vec4 v0x55defa521220_0, 0, 3; - %fork TD_sim.read_reg, S_0x55defa521050; - %join; - %load/vec4 v0x55defa521320_0; - %store/vec4 v0x55defa521960_0, 0, 8; - %jmp T_7.4; -T_7.5 ; - %pushi/vec4 3, 0, 3; - %store/vec4 v0x55defa5215e0_0, 0, 3; - %pushi/vec4 0, 0, 8; - %store/vec4 v0x55defa5216c0_0, 0, 8; - %fork TD_sim.write_reg, S_0x55defa521400; - %join; - %pushi/vec4 1, 0, 3; - %store/vec4 v0x55defa521220_0, 0, 3; - %fork TD_sim.read_reg, S_0x55defa521050; - %join; - %load/vec4 v0x55defa521320_0; - %store/vec4 v0x55defa521960_0, 0, 8; - %load/vec4 v0x55defa521960_0; - %cmpi/e 85, 0, 8; - %jmp/0xz T_7.6, 4; - %jmp T_7.7; -T_7.6 ; - %vpi_call/w 3 79 "$error" {0 0 0}; -T_7.7 ; - %pushi/vec4 50, 0, 32; -T_7.8 %dup/vec4; - %pushi/vec4 0, 0, 32; - %cmp/s; - %jmp/1xz T_7.9, 5; - %jmp/1 T_7.9, 4; - %pushi/vec4 1, 0, 32; - %sub; - %wait E_0x55defa4da3a0; - %jmp T_7.8; -T_7.9 ; - %pop/vec4 1; - %vpi_call/w 3 83 "$finish" {0 0 0}; - %end; - .thread T_7; - .scope S_0x55defa4f9970; -T_8 ; - %pushi/vec4 85, 0, 8; - %assign/vec4 v0x55defa5217a0_0, 0; - %end; - .thread T_8; - .scope S_0x55defa4f9970; -T_9 ; - %wait E_0x55defa4f0300; - %load/vec4 v0x55defa5220c0_0; - %cmpi/e 0, 0, 1; - %jmp/0xz T_9.0, 4; - %load/vec4 v0x55defa521ff0_0; - %cmpi/e 1, 0, 1; - %jmp/0xz T_9.2, 4; - %load/vec4 v0x55defa5217a0_0; - %parti/s 1, 7, 4; - %assign/vec4 v0x55defa521e50_0, 0; -T_9.2 ; - %load/vec4 v0x55defa521ff0_0; - %cmpi/e 0, 0, 1; - %jmp/0xz T_9.4, 4; - %load/vec4 v0x55defa5217a0_0; - %ix/load 4, 1, 0; - %flag_set/imm 4, 0; - %shiftl 4; - %assign/vec4 v0x55defa5217a0_0, 0; -T_9.4 ; -T_9.0 ; - %jmp T_9; - .thread T_9; -# The file index is used to find the file name in the following table. -:file_names 5; - "N/A"; - ""; - "-"; - "spi_controller_tb.sv"; - "../spi_controller.sv"; diff --git a/hw/efinix_fpga/simulation/spi_controller_tb.sv b/hw/efinix_fpga/simulation/spi_controller_tb.sv index daeddd3..ad20da4 100644 --- a/hw/efinix_fpga/simulation/spi_controller_tb.sv +++ b/hw/efinix_fpga/simulation/spi_controller_tb.sv @@ -69,7 +69,7 @@ initial begin repeat(5) @(posedge i_clk); write_reg(3, 1); - write_reg(2, 8'hAA); + write_reg(2, 8'hFF); data = (1 << 7); while(data & (1 << 7)) begin read_reg(3, data); @@ -99,4 +99,4 @@ always @(edge o_spi_clk) begin end end -endmodule \ No newline at end of file +endmodule diff --git a/hw/efinix_fpga/super6502.peri.xml b/hw/efinix_fpga/super6502.peri.xml index c44660e..d32a564 100644 --- a/hw/efinix_fpga/super6502.peri.xml +++ b/hw/efinix_fpga/super6502.peri.xml @@ -1,5 +1,5 @@ - + @@ -306,21 +306,17 @@ - - - - - - - - - - - - + + + + + + + + diff --git a/hw/efinix_fpga/super6502.sv b/hw/efinix_fpga/super6502.sv index c0d8457..abe90d8 100644 --- a/hw/efinix_fpga/super6502.sv +++ b/hw/efinix_fpga/super6502.sv @@ -41,30 +41,12 @@ module super6502 output uart_tx, output sd_cs, - output sd_clk, - - input sd_cmd_IN, - output sd_cmd_OUT, - output sd_cmd_OE, - - input sd_data_IN, - output sd_data_OUT, - output sd_data_OE + output spi_clk, + output spi_mosi, + + input spi_miso ); -assign sd_cs = '1; - -logic o_sd_cmd, i_sd_cmd; -logic o_sd_data, i_sd_data; - -assign i_sd_cmd = sd_cmd_IN; -assign sd_cmd_OUT = '0; -assign sd_cmd_OE = ~o_sd_cmd; - -assign i_sd_data = sd_data_IN; -assign sd_data_OUT = '0; -assign sd_data_OE = ~o_sd_data; - assign pll_cpu_reset = '1; assign o_pll_reset = '1; @@ -97,7 +79,7 @@ logic w_timer_cs; logic w_multiplier_cs; logic w_divider_cs; logic w_uart_cs; -logic w_sdcard_cs; +logic w_spi_cs; addr_decode u_addr_decode( .i_addr(cpu_addr), @@ -107,7 +89,7 @@ addr_decode u_addr_decode( .o_multiplier_cs(w_multiplier_cs), .o_divider_cs(w_divider_cs), .o_uart_cs(w_uart_cs), - .o_sdcard_cs(w_sdcard_cs), + .o_spi_cs(w_spi_cs), .o_sdram_cs(w_sdram_cs) ); @@ -117,7 +99,7 @@ logic [7:0] w_timer_data_out; logic [7:0] w_multiplier_data_out; logic [7:0] w_divider_data_out; logic [7:0] w_uart_data_out; -logic [7:0] w_sdcard_data_out; +logic [7:0] w_spi_data_out; logic [7:0] w_sdram_data_out; always_comb begin @@ -133,8 +115,8 @@ always_comb begin cpu_data_out = w_divider_data_out; else if (w_uart_cs) cpu_data_out = w_uart_data_out; - else if (w_sdcard_cs) - cpu_data_out = w_sdcard_data_out; + else if (w_spi_cs) + cpu_data_out = w_spi_data_out; else if (w_sdram_cs) cpu_data_out = w_sdram_data_out; else @@ -206,28 +188,19 @@ uart_wrapper u_uart( .irqb(w_uart_irqb) ); -logic sd_clk; -always @(posedge clk_2) begin - sd_clk <= ~sd_clk; -end +spi_controller spi_controller( + .i_clk(clk_2), + .i_rst(~cpu_resb), + .i_cs(w_spi_cs), + .i_rwb(cpu_rwb), + .i_addr(cpu_addr[1:0]), + .i_data(cpu_data_in), + .o_data(w_spi_data_out), - -sd_controller sd_controller( - .clk(clk_2), - .sd_clk(sd_clk), - .rst(rst), - .addr(cpu_addr[2:0]), - .data(cpu_data_in), - .cs(w_sdcard_cs), - .rw(cpu_rwb), - - .i_sd_cmd(i_sd_cmd), - .o_sd_cmd(o_sd_cmd), - - .i_sd_data(i_sd_data), - .o_sd_data(o_sd_data), - - .data_out(w_sdcard_data_out) + .o_spi_cs(sd_cs), + .o_spi_clk(spi_clk), + .o_spi_mosi(spi_mosi), + .i_spi_miso(spi_miso) ); diff --git a/hw/efinix_fpga/super6502.xml b/hw/efinix_fpga/super6502.xml index 3843189..91bbcc4 100644 --- a/hw/efinix_fpga/super6502.xml +++ b/hw/efinix_fpga/super6502.xml @@ -1,5 +1,5 @@ - + @@ -19,6 +19,7 @@ + @@ -62,11 +63,11 @@ + + - - diff --git a/sw/bootloader/Makefile b/sw/bootloader/Makefile index ac2d520..7a23090 100644 --- a/sw/bootloader/Makefile +++ b/sw/bootloader/Makefile @@ -15,7 +15,7 @@ LISTS=lists TESTS=tests SRCS=$(wildcard *.s) $(wildcard *.c) -SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*) $(wildcard filesystem/*), $(wildcard **/*.c)) +SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*) $(wildcard filesystem/*) devices/sd_print.c, $(wildcard **/*.c)) OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) diff --git a/sw/bootloader/devices/io.inc65 b/sw/bootloader/devices/io.inc65 index 9e797f5..42b0910 100644 --- a/sw/bootloader/devices/io.inc65 +++ b/sw/bootloader/devices/io.inc65 @@ -6,7 +6,8 @@ UART_STATUS = UART + 1 LED = $efff SW = LED -SD_ARG = $efd8 -SD_CMD = $efdc -SD_DATA = $efdd - +SPI_BAUD = $efd8 +SPI_INPUT = $efd9 +SPI_OUTPUT = $efda +SPI_CTRL = $efdb +SPI_STATUS = SPI_CTRL \ No newline at end of file diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 4e548ba..7193233 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -1,89 +1,455 @@ -#include #include -#include "devices/sd_card.h" +#include "sd_card.h" +#include "sd_print.h" +#include "spi.h" -void sd_init() { - uint32_t resp; - uint8_t attempts, i; +/******************************************************************************* + Initialize SD card +*******************************************************************************/ +uint8_t SD_init() +{ + uint16_t i; - cputs("In sd_init\n"); + uint8_t res[5], cmdAttempts = 0; - sd_card_command(0, 0); + SD_powerUpSeq(); - cprintf("Sent Reset\n"); + while((res[0] = SD_goIdleState()) != SD_IN_IDLE_STATE) + { + cmdAttempts++; + if(cmdAttempts == CMD0_MAX_ATTEMPTS) + { + cputs("Go IDLE\r\n"); + return SD_ERROR; + } + } - sd_card_command(0x000001aa, 8); - sd_card_resp(&resp); - cprintf("CMD8: %lx\n", resp); + for (i = 0; i < 1000; i++); - attempts = 0; - do { - if (attempts > 100) { - cprintf("SD Timed out"); - return; - } - sd_card_command(0, 55); - sd_card_resp(&resp); - sd_card_command(0x40180000, 41); - sd_card_resp(&resp); - cprintf("CMD41: %lx\n", resp); + SD_sendIfCond(res); + if(res[0] != SD_IN_IDLE_STATE) + { + cputs("IF Cond\r\n"); + return SD_ERROR; + } - //10ms loop? - for (i = 0; i < 255; i++); + if(res[4] != 0xAA) + { + return SD_ERROR; + } - attempts++; - } while (resp != 0); + cmdAttempts = 0; + do + { + if(cmdAttempts == CMD55_MAX_ATTEMPTS) + { + cputs("op_cond error\r\n"); + return SD_ERROR; + } - sd_card_command(0, 2); - sd_card_resp(&resp); - cprintf("CMD2: %lx\n", resp); + res[0] = SD_sendApp(); + if(SD_R1_NO_ERROR(res[0])) + { + res[0] = SD_sendOpCond(); + } + + for (i = 0; i < 1000; i++); + + cmdAttempts++; + } + while(res[0] != SD_READY); + + for (i = 0; i < 1000; i++); + + SD_readOCR(res); + + return SD_SUCCESS; } -uint16_t sd_get_rca() { - uint32_t resp; +/******************************************************************************* + Run power up sequence +*******************************************************************************/ +void SD_powerUpSeq() +{ + uint16_t i; + uint8_t j; - sd_card_command(0, 3); - resp = 0; - sd_card_resp(&resp); + // make sure card is deselected + spi_deselect(0); - //cprintf("CMD3: %lx\n", resp); + // give SD card time to power up + for (i = 0; i < 1000; i++); - return resp >> 16; + + // select SD card + spi_exchange(0xFF); + spi_deselect(0); + + // send 80 clock cycles to synchronize + for(j = 0; j < SD_INIT_CYCLES; j++) + spi_exchange(0xFF); } -uint16_t sd_select_card(uint16_t rca) { - uint32_t resp; +/******************************************************************************* + Send command to SD card +*******************************************************************************/ +void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) +{ + // transmit command to sd card + spi_exchange(cmd|0x40); - sd_card_command((uint32_t)rca << 16, 7); - sd_card_resp(&resp); + // transmit argument + spi_exchange((uint8_t)(arg >> 24)); + spi_exchange((uint8_t)(arg >> 16)); + spi_exchange((uint8_t)(arg >> 8)); + spi_exchange((uint8_t)(arg)); - return (uint16_t) resp; + // transmit crc + spi_exchange(crc|0x01); } -uint16_t sd_get_status(uint16_t rca) { - uint32_t resp; +/******************************************************************************* + Read R1 from SD card +*******************************************************************************/ +uint8_t SD_readRes1() +{ + uint8_t i = 0, res1; - sd_card_command((uint32_t)rca << 16, 13); - sd_card_resp(&resp); + // keep polling until actual data received + while((res1 = spi_exchange(0xFF)) == 0xFF) + { + i++; - return (uint16_t) resp; + // if no data received for 8 bytes, break + if(i > 8) break; + } + + return res1; } -void sd_readblock(uint32_t addr, void* buf) { - uint32_t resp; - int i; +/******************************************************************************* + Read R2 from SD card +*******************************************************************************/ +void SD_readRes2(uint8_t *res) +{ + // read response 1 in R2 + res[0] = SD_readRes1(); - sd_card_command(addr, 17); - sd_card_resp(&resp); - //cprintf("CMD17: %lx\n", resp); - - sd_card_wait_for_data(); - - //cprintf("Read data: \n"); - for (i = 0; i < 512; i++){ - ((uint8_t*)buf)[i] = sd_card_read_byte(); - } - - //cprintf("\n"); + // read final byte of response + res[1] = spi_exchange(0xFF); +} + +/******************************************************************************* + Read R3 from SD card +*******************************************************************************/ +void SD_readRes3(uint8_t *res) +{ + // read response 1 in R3 + res[0] = SD_readRes1(); + + // if error reading R1, return + if(res[0] > 1) return; + + // read remaining bytes + SD_readBytes(res + 1, R3_BYTES); +} + +/******************************************************************************* + Read R7 from SD card +*******************************************************************************/ +void SD_readRes7(uint8_t *res) +{ + // read response 1 in R7 + res[0] = SD_readRes1(); + + // if error reading R1, return + if(res[0] > 1) return; + + // read remaining bytes + SD_readBytes(res + 1, R7_BYTES); +} + +/******************************************************************************* + Read specified number of bytes from SD card +*******************************************************************************/ +void SD_readBytes(uint8_t *res, uint8_t n) +{ + while(n--) *res++ = spi_exchange(0xFF); +} + +/******************************************************************************* + Command Idle State (CMD0) +*******************************************************************************/ +uint8_t SD_goIdleState() +{ + uint8_t res1; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(CMD0, CMD0_ARG, CMD0_CRC); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; +} + +/******************************************************************************* + Send Interface Conditions (CMD8) +*******************************************************************************/ +void SD_sendIfCond(uint8_t *res) +{ + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD8 + SD_command(CMD8, CMD8_ARG, CMD8_CRC); + + // read response + SD_readRes7(res); + //SD_readBytes(res + 1, R7_BYTES); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); +} + +/******************************************************************************* + Read Status +*******************************************************************************/ +void SD_sendStatus(uint8_t *res) +{ + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD13 + SD_command(CMD13, CMD13_ARG, CMD13_CRC); + + // read response + SD_readRes2(res); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); +} + +/******************************************************************************* + Read single 512 byte block + token = 0xFE - Successful read + token = 0x0X - Data error + token = 0xFF - timeout +*******************************************************************************/ +uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) +{ + uint8_t res1, read; + uint16_t readAttempts; + uint16_t i; + + /* + + // set token to none + *token = 0xFF; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD17 + SD_command(CMD17, addr, CMD17_CRC); + + // read R1 + res1 = SD_readRes1(); + + // if response received from card + if(res1 != 0xFF) + { + // wait for a response token (timeout = 100ms) + readAttempts = 0; + while(++readAttempts != SD_MAX_READ_ATTEMPTS) + if((read = spi_exchange(0xFF)) != 0xFF) break; + + // if response token is 0xFE + if(read == SD_START_TOKEN) + { + // read 512 byte block + for(i = 0; i < SD_BLOCK_LEN; i++) *buf++ = spi_exchange(0xFF); + + // read 16-bit CRC + spi_exchange(0xFF); + spi_exchange(0xFF); + } + + // set token to card response + *token = read; + } + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + */ + + return res1; +} + +#define SD_MAX_WRITE_ATTEMPTS 3907 + +/******************************************************************************* +Write single 512 byte block +token = 0x00 - busy timeout +token = 0x05 - data accepted +token = 0xFF - response timeout +*******************************************************************************/ +uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) +{ + uint16_t readAttempts; + uint8_t res1, read; + uint16_t i; + + /* + + // set token to none + *token = 0xFF; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD24 + SD_command(CMD24, addr, CMD24_CRC); + + // read response + res1 = SD_readRes1(); + + // if no error + if(res1 == SD_READY) + { + // send start token + spi_exchange(SD_START_TOKEN); + + // write buffer to card + for(i = 0; i < SD_BLOCK_LEN; i++) spi_exchange(buf[i]); + + // wait for a response (timeout = 250ms) + readAttempts = 0; + while(++readAttempts != SD_MAX_WRITE_ATTEMPTS) + if((read = spi_exchange(0xFF)) != 0xFF) { *token = 0xFF; break; } + + // if data accepted + if((read & 0x1F) == 0x05) + { + // set token to data accepted + *token = 0x05; + + // wait for write to finish (timeout = 250ms) + readAttempts = 0; + while(spi_exchange(0xFF) == 0x00) + if(++readAttempts == SD_MAX_WRITE_ATTEMPTS) { *token = 0x00; break; } + } + } + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + */ + + return res1; +} + +/******************************************************************************* + Reads OCR from SD Card +*******************************************************************************/ +void SD_readOCR(uint8_t *res) +{ + uint8_t tmp; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + tmp = spi_exchange(0xFF); + + if(tmp != 0xFF) while(spi_exchange(0xFF) != 0xFF) ; + + // send CMD58 + SD_command(CMD58, CMD58_ARG, CMD58_CRC); + + // read response + SD_readRes3(res); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); +} + +/******************************************************************************* + Send application command (CMD55) +*******************************************************************************/ +uint8_t SD_sendApp() +{ + uint8_t res1; + + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(CMD55, CMD55_ARG, CMD55_CRC); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; +} + +/******************************************************************************* + Send operating condition (ACMD41) +*******************************************************************************/ +uint8_t SD_sendOpCond() +{ + uint8_t res1; + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(ACMD41, ACMD41_ARG, ACMD41_CRC); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; } diff --git a/sw/bootloader/devices/sd_card.h b/sw/bootloader/devices/sd_card.h index 7e3cb00..6488e8b 100644 --- a/sw/bootloader/devices/sd_card.h +++ b/sw/bootloader/devices/sd_card.h @@ -3,16 +3,76 @@ #include -void sd_init(); -uint16_t sd_get_rca(); -uint16_t sd_select_card(uint16_t rca); -uint16_t sd_get_status(uint16_t rca); -void sd_readblock(uint32_t addr, void* buf); +// command definitions +#define CMD0 0 +#define CMD0_ARG 0x00000000 +#define CMD0_CRC 0x94 +#define CMD8 8 +#define CMD8_ARG 0x0000001AA +#define CMD8_CRC 0x86 +#define CMD9 9 +#define CMD9_ARG 0x00000000 +#define CMD9_CRC 0x00 +#define CMD10 9 +#define CMD10_ARG 0x00000000 +#define CMD10_CRC 0x00 +#define CMD13 13 +#define CMD13_ARG 0x00000000 +#define CMD13_CRC 0x00 +#define CMD17 17 +#define CMD17_CRC 0x00 +#define CMD24 24 +#define CMD24_CRC 0x00 +#define CMD55 55 +#define CMD55_ARG 0x00000000 +#define CMD55_CRC 0x00 +#define CMD58 58 +#define CMD58_ARG 0x00000000 +#define CMD58_CRC 0x00 +#define ACMD41 41 +#define ACMD41_ARG 0x40000000 +#define ACMD41_CRC 0x00 -void sd_card_command(uint32_t arg, uint8_t cmd); +#define SD_IN_IDLE_STATE 0x01 +#define SD_READY 0x00 +#define SD_R1_NO_ERROR(X) X < 0x02 -void sd_card_resp(uint32_t* resp); -uint8_t sd_card_read_byte(); -void sd_card_wait_for_data(); +#define R3_BYTES 4 +#define R7_BYTES 4 -#endif +#define CMD0_MAX_ATTEMPTS 255 +#define CMD55_MAX_ATTEMPTS 255 +#define SD_ERROR 1 +#define SD_SUCCESS 0 +#define SD_MAX_READ_ATTEMPTS 1563 +#define SD_READ_START_TOKEN 0xFE +#define SD_INIT_CYCLES 80 + +#define SD_START_TOKEN 0xFE +#define SD_ERROR_TOKEN 0x00 + +#define SD_DATA_ACCEPTED 0x05 +#define SD_DATA_REJECTED_CRC 0x0B +#define SD_DATA_REJECTED_WRITE 0x0D + +#define SD_BLOCK_LEN 512 + +// SD functions +uint8_t SD_init(); +void SD_powerUpSeq(); +void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc); +uint8_t SD_readRes1(); +void SD_readRes2(uint8_t *res); +void SD_readRes3(uint8_t *res); +void SD_readRes7(uint8_t *res); +void SD_readBytes(uint8_t *res, uint8_t n); +uint8_t SD_goIdleState(); +void SD_sendIfCond(uint8_t *res); +void SD_sendStatus(uint8_t *res); +void SD_readOCR(uint8_t *res); +uint8_t SD_sendApp(); +uint8_t SD_sendOpCond(); +uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *error); +uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *res); + +#endif \ No newline at end of file diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s deleted file mode 100644 index fe4f4e2..0000000 --- a/sw/bootloader/devices/sd_card_asm.s +++ /dev/null @@ -1,66 +0,0 @@ -.include "io.inc65" - -.importzp sp, sreg, ptr1 - -.export _sd_card_command -.export _sd_card_resp -.export _sd_card_read_byte -.export _sd_card_wait_for_data - -.autoimport on - -.code - -; Send sd card command. -; command is in A register, the args are on the stack -; I think the order is high byte first? -_sd_card_command: - pha - - jsr popeax - sta SD_ARG - stx SD_ARG+1 - lda sreg - sta SD_ARG+2 - lda sreg+1 - sta SD_ARG+3 - - pla - sta SD_CMD - rts - -; void sd_card_resp(uint32_t* resp); -_sd_card_resp: - phy - sta ptr1 ; store pointer - stx ptr1+1 -@1: lda SD_CMD ; wait for status flag - and #$01 - beq @1 - lda SD_ARG - ldy #$0 - sta (ptr1),y - lda SD_ARG+1 - iny - sta (ptr1),y - lda SD_ARG+2 - iny - sta (ptr1),y - lda SD_ARG+3 - iny - sta (ptr1),y - ply - rts - -_sd_card_read_byte: - lda SD_DATA - ldx #$00 - rts - -_sd_card_wait_for_data: - pha -@1: lda SD_CMD ; wait for status flag - and #$02 - beq @1 - pla - rts \ No newline at end of file diff --git a/sw/bootloader/devices/sd_print.c b/sw/bootloader/devices/sd_print.c new file mode 100644 index 0000000..4e8ead5 --- /dev/null +++ b/sw/bootloader/devices/sd_print.c @@ -0,0 +1,176 @@ +#include + +#include "sd_print.h" +#include "sd_card.h" + +void SD_printR1(uint8_t res) +{ + if(res == 0xFF) + { cputs("\tNo response\r\n"); return; } + if(res & 0x80) + { cputs("\tError: MSB = 1\r\n"); return; } + if(res == 0) + { cputs("\tCard Ready\r\n"); return; } + if(PARAM_ERROR(res)) + cputs("\tParameter Error\r\n"); + if(ADDR_ERROR(res)) + cputs("\tAddress Error\r\n"); + if(ERASE_SEQ_ERROR(res)) + cputs("\tErase Sequence Error\r\n"); + if(CRC_ERROR(res)) + cputs("\tCRC Error\r\n"); + if(ILLEGAL_CMD(res)) + cputs("\tIllegal Command\r\n"); + if(ERASE_RESET(res)) + cputs("\tErase Reset Error\r\n"); + if(IN_IDLE(res)) + cputs("\tIn Idle State\r\n"); +} + +void SD_printR2(uint8_t *res) +{ + SD_printR1(res[0]); + + if(res[0] == 0xFF) return; + + if(res[1] == 0x00) + cputs("\tNo R2 Error\r\n"); + if(OUT_OF_RANGE(res[1])) + cputs("\tOut of Range\r\n"); + if(ERASE_PARAM(res[1])) + cputs("\tErase Parameter\r\n"); + if(WP_VIOLATION(res[1])) + cputs("\tWP Violation\r\n"); + if(CARD_ECC_FAILED(res[1])) + cputs("\tECC Failed\r\n"); + if(CC_ERROR(res[1])) + cputs("\tCC Error\r\n"); + if(ERROR(res[1])) + cputs("\tError\r\n"); + if(WP_ERASE_SKIP(res[1])) + cputs("\tWP Erase Skip\r\n"); + if(CARD_LOCKED(res[1])) + cputs("\tCard Locked\r\n"); +} + +void SD_printR3(uint8_t *res) +{ + SD_printR1(res[0]); + + if(res[0] > 1) return; + + cputs("\tCard Power Up Status: "); + if(POWER_UP_STATUS(res[1])) + { + cputs("READY\r\n"); + cputs("\tCCS Status: "); + if(CCS_VAL(res[1])){ cputs("1\r\n"); } + else cputs("0\r\n"); + } + else + { + cputs("BUSY\r\n"); + } + + cputs("\tVDD Window: "); + if(VDD_2728(res[3])) cputs("2.7-2.8, "); + if(VDD_2829(res[2])) cputs("2.8-2.9, "); + if(VDD_2930(res[2])) cputs("2.9-3.0, "); + if(VDD_3031(res[2])) cputs("3.0-3.1, "); + if(VDD_3132(res[2])) cputs("3.1-3.2, "); + if(VDD_3233(res[2])) cputs("3.2-3.3, "); + if(VDD_3334(res[2])) cputs("3.3-3.4, "); + if(VDD_3435(res[2])) cputs("3.4-3.5, "); + if(VDD_3536(res[2])) cputs("3.5-3.6"); + cputs("\r\n"); +} + +void SD_printR7(uint8_t *res) +{ + SD_printR1(res[0]); + + if(res[0] > 1) return; + + cputs("\tCommand Version: "); + cprintf("%x", CMD_VER(res[1])); + cputs("\r\n"); + + cputs("\tVoltage Accepted: "); + if(VOL_ACC(res[3]) == VOLTAGE_ACC_27_33) { + cputs("2.7-3.6V\r\n"); + } else if(VOL_ACC(res[3]) == VOLTAGE_ACC_LOW) { + cputs("LOW VOLTAGE\r\n"); + } else if(VOL_ACC(res[3]) == VOLTAGE_ACC_RES1) { + cputs("RESERVED\r\n"); + } else if(VOL_ACC(res[3]) == VOLTAGE_ACC_RES2) { + cputs("RESERVED\r\n"); + } else { + cputs("NOT DEFINED\r\n"); + } + + cputs("\tEcho: "); + cprintf("%x", res[4]); + cputs("\r\n"); +} + +void SD_printCSD(uint8_t *buf) +{ + cputs("CSD:\r\n"); + + cputs("\tCSD Structure: "); + cprintf("%x", (buf[0] & 0b11000000) >> 6); + cputs("\r\n"); + + cputs("\tTAAC: "); + cprintf("%x", buf[1]); + cputs("\r\n"); + + cputs("\tNSAC: "); + cprintf("%x", buf[2]); + cputs("\r\n"); + + cputs("\tTRAN_SPEED: "); + cprintf("%x", buf[3]); + cputs("\r\n"); + + cputs("\tDevice Size: "); + cprintf("%x", buf[7] & 0b00111111); + cprintf("%x", buf[8]); + cprintf("%x", buf[9]); + cputs("\r\n"); +} + +void SD_printBuf(uint8_t *buf) +{ + uint8_t colCount = 0; + uint16_t i; + for(i = 0; i < SD_BLOCK_LEN; i++) + { + cprintf("%x", *buf++); + if(colCount == 19) + { + cputs("\r\n"); + colCount = 0; + } + else + { + cputc(' '); + colCount++; + } + } + cputs("\r\n"); +} + +void SD_printDataErrToken(uint8_t token) +{ + if(token & 0xF0) + cputs("\tNot Error token\r\n"); + if(SD_TOKEN_OOR(token)) + cputs("\tData out of range\r\n"); + if(SD_TOKEN_CECC(token)) + cputs("\tCard ECC failed\r\n"); + if(SD_TOKEN_CC(token)) + cputs("\tCC Error\r\n"); + if(SD_TOKEN_ERROR(token)) + cputs("\tError\r\n"); +} diff --git a/sw/bootloader/devices/sd_print.h b/sw/bootloader/devices/sd_print.h new file mode 100644 index 0000000..fd42418 --- /dev/null +++ b/sw/bootloader/devices/sd_print.h @@ -0,0 +1,61 @@ +#ifndef SD_PRINT_H +#define SD_PRINT_H + + +#include + + +/* R1 MACROS */ +#define PARAM_ERROR(X) X & 0b01000000 +#define ADDR_ERROR(X) X & 0b00100000 +#define ERASE_SEQ_ERROR(X) X & 0b00010000 +#define CRC_ERROR(X) X & 0b00001000 +#define ILLEGAL_CMD(X) X & 0b00000100 +#define ERASE_RESET(X) X & 0b00000010 +#define IN_IDLE(X) X & 0b00000001 + +/* R2 MACROS */ +#define OUT_OF_RANGE(X) X & 0b10000000 +#define ERASE_PARAM(X) X & 0b01000000 +#define WP_VIOLATION(X) X & 0b00100000 +#define CARD_ECC_FAILED(X) X & 0b00010000 +#define CC_ERROR(X) X & 0b00001000 +#define ERROR(X) X & 0b00000100 +#define WP_ERASE_SKIP(X) X & 0b00000010 +#define CARD_LOCKED(X) X & 0b00000001 + +/* R3 MACROS */ +#define POWER_UP_STATUS(X) X & 0x40 +#define CCS_VAL(X) X & 0x40 +#define VDD_2728(X) X & 0b10000000 +#define VDD_2829(X) X & 0b00000001 +#define VDD_2930(X) X & 0b00000010 +#define VDD_3031(X) X & 0b00000100 +#define VDD_3132(X) X & 0b00001000 +#define VDD_3233(X) X & 0b00010000 +#define VDD_3334(X) X & 0b00100000 +#define VDD_3435(X) X & 0b01000000 +#define VDD_3536(X) X & 0b10000000 + +/* R7 MACROS */ +#define CMD_VER(X) ((X >> 4) & 0xF0) +#define VOL_ACC(X) (X & 0x1F) +#define VOLTAGE_ACC_27_33 0b00000001 +#define VOLTAGE_ACC_LOW 0b00000010 +#define VOLTAGE_ACC_RES1 0b00000100 +#define VOLTAGE_ACC_RES2 0b00001000 + +/* DATA ERROR TOKEN */ +#define SD_TOKEN_OOR(X) X & 0b00001000 +#define SD_TOKEN_CECC(X) X & 0b00000100 +#define SD_TOKEN_CC(X) X & 0b00000010 +#define SD_TOKEN_ERROR(X) X & 0b00000001 + +void SD_printR1(uint8_t res); +void SD_printR2(uint8_t *res); +void SD_printR3(uint8_t *res); +void SD_printR7(uint8_t *res); +void SD_printBuf(uint8_t *buf); +void SD_printDataErrToken(uint8_t token); + +#endif \ No newline at end of file diff --git a/sw/bootloader/devices/spi.h b/sw/bootloader/devices/spi.h new file mode 100644 index 0000000..61816d0 --- /dev/null +++ b/sw/bootloader/devices/spi.h @@ -0,0 +1,12 @@ +#ifndef _SPI_H +#define _SPI_H + +#include + +void spi_select(uint8_t id); +void spi_deselect(uint8_t id); +uint8_t spi_read(); +void spi_write(uint8_t data); +uint8_t spi_exchange(uint8_t data); + +#endif \ No newline at end of file diff --git a/sw/bootloader/devices/spi.s b/sw/bootloader/devices/spi.s new file mode 100644 index 0000000..5595a9a --- /dev/null +++ b/sw/bootloader/devices/spi.s @@ -0,0 +1,39 @@ +.include "io.inc65" + +.importzp zp, sreg + +.export _spi_select, _spi_deselect +.export _spi_read, _spi_write, _spi_exchange + +.autoimport on + +.code + +; void spi_select(uint8_t id) +; Select a (the) slave by pulling its CS line down +; TODO allow active high or active low CS +; TODO allow more than one slave +_spi_select: + lda #$1 ; Ignore whatever id is, 1 is the only option + sta SPI_CTRL + rts + +; void spi_deslect(uint8_t id) +; Deslect a slave by pulling its CS line up +; TODO allow active high or active low CS +_spi_deselect: + stz SPI_CTRL + rts + +; uint8_t spi_read() +_spi_read: + lda #$0 +; void spi_write(uint8_t data) +_spi_write: +; uint8_t spi_exchange(uint8_t data) +_spi_exchange: + sta SPI_OUTPUT +@1: lda SPI_CTRL + bmi @1 + lda SPI_INPUT + rts diff --git a/sw/bootloader/main.c b/sw/bootloader/main.c index 97290d3..bd4f1b3 100644 --- a/sw/bootloader/main.c +++ b/sw/bootloader/main.c @@ -6,6 +6,7 @@ #include "devices/board_io.h" #include "devices/uart.h" #include "devices/sd_card.h" +#include "devices/sd_print.h" #include "filesystem/fat.h" #define KERNEL_LOAD_ADDR 0xD000 @@ -13,40 +14,68 @@ uint8_t buf[512]; int main() { - uint16_t rca; - clrscr(); - cputs("Starting sd_init\n"); - cprintf("And testing cprintf\n"); + // array to hold responses + uint8_t res[5], token; + uint32_t addr = 0x00000000; + uint16_t i; - sd_init(); + cputs("Start\r\n"); - cprintf("finish sd_init\n"); + // initialize sd card + if(SD_init() != SD_SUCCESS) + { + cputs("Error init SD CARD\r\n"); + } + else + { + cputs("SD Card init\r\n"); - rca = sd_get_rca(); - cprintf("rca: %x\n", rca); + // read sector 0 + // cputs("\r\nReading sector: 0x"); + // ((uint8_t)(addr >> 24)); + // cprintf("%x", (uint8_t)(addr >> 16)); + // cprintf("%x", (uint8_t)(addr >> 8)); + // cprintf("%x", (uint8_t)addr); + // res[0] = SD_readSingleBlock(addr, buf, &token); + // cputs("\r\nResponse:\r\n"); + // //SD_printR1(res[0]); - sd_select_card(rca); + // if no error, print buffer + // if((res[0] == 0x00) && (token == SD_START_TOKEN)) + // SD_printBuf(buf); + // else if error token received, print + // else if(!(token & 0xF0)) + // { + // cputs("Ercputsror token:\r\n"); + // SD_printDataErrToken(token); + // } - /* - fat_init(); + // update address to 0x00000100 + // addr = 0x00000100; - filename = (char*)malloc(FAT_MAX_FILE_NAME); + // // fill buffer with 0x55 + // for(i = 0; i < 512; i++) buf[i] = 0x55; - cluster = fat_parse_path_to_cluster("/kernel.bin"); - for (kernel_load = (uint8_t*)KERNEL_LOAD_ADDR; cluster < FAT_CLUSTERMASK; kernel_load+=(8*512)) { - cprintf("cluster: %lx\n", cluster); - cprintf("Writing to %p\n", kernel_load); - fat_read_cluster(cluster, kernel_load); - cluster = fat_get_chain_value(cluster); - } + // cputs("Writing 0x55 to sector: 0x"); + // cprintf("%x", (uint8_t)(addr >> 24)); + // cprintf("%x", (uint8_t)(addr >> 16)); + // cprintf("%x", (uint8_t)(addr >> 8)); + // cprintf("%x", (uint8_t)addr); - */ + // // write data to sector + // res[0] = SD_writeSingleBlock(addr, buf, &token); - cprintf("Done!\n"); + // cputs("\r\nResponse:\r\n"); + // //SD_printR1(res[0]); - for(;;); + // // if no errors writing + // if(res[0] == 0x00) + // { + // if(token == SD_DATA_ACCEPTED) + // cputs("Write successful\r\n"); + // } + } - cprintf("Reset vector: %x\n", *((uint16_t*)0xfffc)); + while(1) ; - return 0; } From 709c60cf3695045798ce8e2630031c88ff99fe40 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 16:25:13 -0700 Subject: [PATCH 04/12] SD_command assembly rewrite --- hw/efinix_fpga/debug_profile.wizard.json | 278 +--------------------- hw/efinix_fpga/init_hex.mem | 290 +++++++++++------------ hw/efinix_fpga/super6502.xml | 2 +- sw/bootloader/devices/sd_card.c | 2 + sw/bootloader/devices/sd_card_asm.s | 32 +++ 5 files changed, 188 insertions(+), 416 deletions(-) create mode 100644 sw/bootloader/devices/sd_card_asm.s diff --git a/hw/efinix_fpga/debug_profile.wizard.json b/hw/efinix_fpga/debug_profile.wizard.json index 73565a8..f161bb2 100644 --- a/hw/efinix_fpga/debug_profile.wizard.json +++ b/hw/efinix_fpga/debug_profile.wizard.json @@ -3,12 +3,12 @@ { "name": "la0", "type": "la", - "uuid": "68ae6f6753aa4c41b26baf6770f0d8e4", + "uuid": "fc5ad0b7db9846e2b64719110e7975d8", "trigin_en": false, "trigout_en": false, "auto_inserted": true, "capture_control": false, - "data_depth": 8192, + "data_depth": 16384, "input_pipeline": 1, "probes": [ { @@ -36,31 +36,11 @@ "width": 16, "probe_type": 1 }, - { - "name": "cpu_nmib", - "width": 1, - "probe_type": 1 - }, - { - "name": "cpu_irqb", - "width": 1, - "probe_type": 1 - }, - { - "name": "cpu_data_out", - "width": 8, - "probe_type": 1 - }, { "name": "cpu_phi2", "width": 1, "probe_type": 1 }, - { - "name": "cpu_rdy", - "width": 1, - "probe_type": 1 - }, { "name": "spi_clk", "width": 1, @@ -85,16 +65,6 @@ "name": "spi_controller/active", "width": 1, "probe_type": 1 - }, - { - "name": "spi_controller/r_clock_counter", - "width": 9, - "probe_type": 1 - }, - { - "name": "spi_controller/r_baud_rate", - "width": 8, - "probe_type": 1 } ] } @@ -362,209 +332,35 @@ }, { "name": "la0_probe5", - "net": "cpu_nmib", - "path": [] - }, - { - "name": "la0_probe6", - "net": "cpu_irqb", - "path": [] - }, - { - "name": "la0_probe7[0]", - "net": "cpu_data_out[0]", - "path": [] - }, - { - "name": "la0_probe7[1]", - "net": "cpu_data_out[1]", - "path": [] - }, - { - "name": "la0_probe7[2]", - "net": "cpu_data_out[2]", - "path": [] - }, - { - "name": "la0_probe7[3]", - "net": "cpu_data_out[3]", - "path": [] - }, - { - "name": "la0_probe7[4]", - "net": "cpu_data_out[4]", - "path": [] - }, - { - "name": "la0_probe7[5]", - "net": "cpu_data_out[5]", - "path": [] - }, - { - "name": "la0_probe7[6]", - "net": "cpu_data_out[6]", - "path": [] - }, - { - "name": "la0_probe7[7]", - "net": "cpu_data_out[7]", - "path": [] - }, - { - "name": "la0_probe8", "net": "cpu_phi2", "path": [] }, { - "name": "la0_probe9", - "net": "cpu_rdy", - "path": [] - }, - { - "name": "la0_probe10", + "name": "la0_probe6", "net": "spi_clk", "path": [] }, { - "name": "la0_probe11", + "name": "la0_probe7", "net": "spi_mosi", "path": [] }, { - "name": "la0_probe12", + "name": "la0_probe8", "net": "sd_cs", "path": [] }, { - "name": "la0_probe13", + "name": "la0_probe9", "net": "spi_miso", "path": [] }, { - "name": "la0_probe14", + "name": "la0_probe10", "net": "active", "path": [ "spi_controller" ] - }, - { - "name": "la0_probe15[0]", - "net": "r_clock_counter[0]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[1]", - "net": "r_clock_counter[1]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[2]", - "net": "r_clock_counter[2]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[3]", - "net": "r_clock_counter[3]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[4]", - "net": "r_clock_counter[4]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[5]", - "net": "r_clock_counter[5]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[6]", - "net": "r_clock_counter[6]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[7]", - "net": "r_clock_counter[7]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe15[8]", - "net": "r_clock_counter[8]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[0]", - "net": "r_baud_rate[0]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[1]", - "net": "r_baud_rate[1]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[2]", - "net": "r_baud_rate[2]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[3]", - "net": "r_baud_rate[3]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[4]", - "net": "r_baud_rate[4]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[5]", - "net": "r_baud_rate[5]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[6]", - "net": "r_baud_rate[6]", - "path": [ - "spi_controller" - ] - }, - { - "name": "la0_probe16[7]", - "net": "r_baud_rate[7]", - "path": [ - "spi_controller" - ] } ] } @@ -578,7 +374,7 @@ ], "session": { "wizard": { - "data_depth": 8192, + "data_depth": 16384, "capture_control": false, "selected_nets": [ { @@ -625,32 +421,6 @@ "net_idx_left": 15, "net_idx_right": 0 }, - { - "name": "cpu_nmib", - "width": 1, - "clk_domain": "clk_50", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [] - }, - { - "name": "cpu_irqb", - "width": 1, - "clk_domain": "clk_50", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [] - }, - { - "name": "cpu_data_out", - "width": 8, - "clk_domain": "clk_50", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [], - "net_idx_left": 7, - "net_idx_right": 0 - }, { "name": "cpu_phi2", "width": 1, @@ -659,14 +429,6 @@ "child": [], "path": [] }, - { - "name": "cpu_rdy", - "width": 1, - "clk_domain": "clk_50", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [] - }, { "name": "spi_clk", "width": 1, @@ -708,30 +470,6 @@ "path": [ "spi_controller" ] - }, - { - "name": "r_clock_counter", - "width": 9, - "clk_domain": "clk_50", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "spi_controller" - ], - "net_idx_left": 8, - "net_idx_right": 0 - }, - { - "name": "r_baud_rate", - "width": 8, - "clk_domain": "clk_50", - "selected_probe_type": "DATA AND TRIGGER", - "child": [], - "path": [ - "spi_controller" - ], - "net_idx_left": 7, - "net_idx_right": 0 } ], "top_module": "super6502", diff --git a/hw/efinix_fpga/init_hex.mem b/hw/efinix_fpga/init_hex.mem index b095bf6..ad3eb76 100644 --- a/hw/efinix_fpga/init_hex.mem +++ b/hw/efinix_fpga/init_hex.mem @@ -2,151 +2,151 @@ 8D 0E 02 8E 0F 02 8D 15 02 8E 16 02 88 B9 FF FF 8D 1F 02 88 B9 FF FF 8D 1E 02 8C 21 02 20 FF FF A0 FF D0 E8 60 A2 FF 9A D8 A9 F0 85 00 A9 7E 85 -01 20 CD F8 20 38 F7 20 45 F0 58 20 E6 F0 6C FC -FF 20 2C F7 00 A0 00 F0 07 A9 45 A2 F0 4C 00 02 -60 AD FF EF A2 00 60 8D FF EF 60 20 CC F0 C9 0A -D0 05 A9 0D 20 CC F0 60 DA 5A A8 B2 00 AA A9 1B -20 CC F0 A9 5B 20 CC F0 98 20 CC F0 A9 3B 20 CC -F0 8A 20 CC F0 A9 48 20 CC F0 7A FA 60 DA A9 1B -20 CC F0 A9 63 20 CC F0 68 60 40 DA BA 48 E8 E8 -BD 00 01 29 10 D0 06 68 FA 20 E5 F0 40 4C AD F0 -A9 01 8D DB EF 60 9C DB EF 60 A9 00 8D DA EF AD -DB EF 30 FB AD D9 EF 60 8D E6 EF 60 48 8D E6 EF -AD E7 EF 89 02 D0 F9 68 60 AD E6 EF A2 00 60 AD -E7 EF A2 00 60 60 20 B8 F7 A2 00 86 02 86 03 A9 -00 20 38 F8 20 91 F7 A9 14 A2 F9 20 6F F7 20 28 -F1 C9 00 20 50 F8 D0 03 4C 15 F1 A9 F0 A2 F8 20 -6F F7 4C 1C F1 A9 05 A2 F9 20 6F F7 4C 1F F1 4C -1F F1 A0 0C 20 1F F7 60 20 C5 F7 A9 00 20 80 F8 -20 9A F2 4C 5F F1 A0 00 A2 00 18 A9 01 71 00 91 -00 A0 00 A2 00 B1 00 C9 FF 20 56 F8 D0 03 4C 5F -F1 A9 36 A2 F9 20 6F F7 A2 00 A9 01 4C 96 F2 20 -B1 F4 A0 01 91 00 C9 01 20 50 F8 D0 C9 A2 00 A9 -00 A0 06 20 C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 -E8 20 6F F8 F0 03 4C 8C F1 4C 98 F1 A0 06 A2 00 -A9 01 20 0F F7 4C 76 F1 A9 01 20 23 F8 20 0B F5 -A0 01 A2 00 B1 00 C9 01 20 50 F8 D0 03 4C BE F1 -A9 2C A2 F9 20 6F F7 A2 00 A9 01 4C 96 F2 A0 05 -A2 00 B1 00 C9 AA 20 50 F8 D0 03 4C D5 F1 A2 00 -A9 01 4C 96 F2 A2 00 A9 00 A0 00 91 00 A0 00 A2 -00 B1 00 C9 FF 20 56 F8 D0 03 4C FB F1 A9 1C A2 -F9 20 6F F7 A2 00 A9 01 4C 96 F2 20 2D F6 A0 01 -91 00 A0 01 A2 00 B1 00 C9 02 20 6F F8 D0 03 4C -19 F2 20 87 F6 A0 01 91 00 A2 00 A9 00 A0 06 20 -C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 E8 20 6F F8 -F0 03 4C 38 F2 4C 44 F2 A0 06 A2 00 A9 01 20 0F -F7 4C 22 F2 A0 00 A2 00 18 A9 01 71 00 91 00 A0 -01 A2 00 B1 00 C9 00 20 50 F8 D0 81 A2 00 A9 00 -A0 06 20 C4 F8 A0 07 20 09 F8 E0 03 D0 02 C9 E8 -20 6F F8 F0 03 4C 7B F2 4C 87 F2 A0 06 A2 00 A9 -01 20 0F F7 4C 65 F2 A9 01 20 23 F8 20 B3 F5 A2 -00 A9 00 4C 96 F2 20 F9 F7 60 20 9E F7 A2 00 A9 -00 20 B6 F0 A2 00 A9 00 A0 01 20 C4 F8 A0 02 20 -09 F8 E0 03 D0 02 C9 E8 20 6F F8 F0 03 4C C3 F2 -4C CF F2 A0 01 A2 00 A9 01 20 0F F7 4C AD F2 A2 -00 A9 FF 20 BC F0 A2 00 A9 00 20 B6 F0 A2 00 A9 -00 A0 00 91 00 A0 00 A2 00 B1 00 C9 50 20 6F F8 -F0 03 4C F8 F2 4C 0D F3 A2 00 A9 FF 20 BC F0 A0 -00 A2 00 18 A9 01 71 00 91 00 4C E5 F2 20 EF F7 -60 20 80 F8 A0 05 A2 00 B1 00 09 40 A2 00 20 BC -F0 A0 04 20 12 F8 A2 00 A5 03 86 02 86 03 A2 00 -20 BC F0 A0 04 20 12 F8 A0 00 A6 03 A5 02 84 03 -84 02 A2 00 20 BC F0 A0 04 20 12 F8 8A A6 02 A4 -03 84 02 A0 00 84 03 A2 00 20 BC F0 A0 01 A2 00 -B1 00 20 BC F0 A0 00 A2 00 B1 00 09 01 A2 00 20 -BC F0 20 F4 F7 60 A9 00 20 80 F8 20 88 F7 4C A1 -F3 A0 01 A2 00 18 A9 01 71 00 91 00 A0 01 A2 00 -B1 00 C9 09 A9 00 A2 00 2A D0 03 4C A1 F3 4C B3 -F3 A2 00 A9 FF 20 BC F0 A0 00 91 00 C9 FF 20 56 -F8 D0 CE A0 00 A2 00 B1 00 4C BC F3 20 E1 F7 60 -20 96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 A0 00 -20 AC F8 A0 01 20 09 F8 1A D0 01 E8 20 96 F8 A2 -00 A9 FF 20 BC F0 A0 00 20 AC F8 20 E1 F7 60 20 -96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 A0 00 20 -AC F8 A0 01 20 09 F8 A0 00 20 FE F7 C9 02 A9 00 -A2 00 2A D0 03 4C 1B F4 4C 2E F4 A0 01 20 09 F8 -1A D0 01 E8 20 96 F8 A2 00 A9 04 20 75 F4 20 E1 -F7 60 20 96 F8 A0 01 20 09 F8 20 96 F8 20 76 F3 -A0 00 20 AC F8 A0 01 20 09 F8 A0 00 20 FE F7 C9 -02 A9 00 A2 00 2A D0 03 4C 5E F4 4C 71 F4 A0 01 -20 09 F8 1A D0 01 E8 20 96 F8 A2 00 A9 04 20 75 -F4 20 E1 F7 60 20 80 F8 4C 9A F4 A0 02 20 09 F8 -20 96 F8 A2 00 A9 FF 48 A0 03 A2 00 A9 01 20 0F -F7 68 20 BC F0 A0 00 20 AC F8 A0 00 B1 00 08 A0 -00 A2 00 B1 00 38 E9 01 91 00 28 D0 CE 20 EF F7 -60 20 88 F7 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 -B0 F0 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 80 F8 -A2 00 86 02 86 03 A9 00 20 38 F8 A2 00 A9 94 20 -11 F3 20 76 F3 A0 00 91 00 A2 00 A9 FF 20 BC F0 -A2 00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 A0 00 -A2 00 B1 00 4C 07 F5 20 D2 F7 60 20 96 F8 A2 00 -A9 FF 20 BC F0 A2 00 A9 00 20 B0 F0 A2 00 A9 FF -20 BC F0 A2 00 A9 08 20 80 F8 A2 01 A9 00 85 02 -A9 00 85 03 A9 AA 20 38 F8 A2 00 A9 86 20 11 F3 -A0 01 20 09 F8 20 32 F4 A2 00 A9 FF 20 BC F0 A2 -00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 20 E1 F7 -60 20 96 F8 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 -B0 F0 A2 00 A9 FF 20 BC F0 A2 00 A9 0D 20 80 F8 -A2 00 86 02 86 03 A9 00 20 38 F8 A2 00 A9 00 20 -11 F3 A0 01 20 09 F8 20 C0 F3 A2 00 A9 FF 20 BC -F0 A2 00 A9 00 20 B6 F0 A2 00 A9 FF 20 BC F0 20 -E1 F7 60 20 96 F8 20 88 F7 A2 00 A9 FF 20 BC F0 -A2 00 A9 00 20 B0 F0 A2 00 A9 FF 20 BC F0 A0 00 -91 00 A0 00 A2 00 B1 00 C9 FF 20 50 F8 D0 03 4C -F3 F5 4C E5 F5 A2 00 A9 FF 20 BC F0 C9 FF 20 50 -F8 D0 F2 A2 00 A9 3A 20 80 F8 A2 00 86 02 86 03 -A9 00 20 38 F8 A2 00 A9 00 20 11 F3 A0 02 20 09 -F8 20 EF F3 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 -B6 F0 A2 00 A9 FF 20 BC F0 20 EF F7 60 20 88 F7 -A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 B0 F0 A2 00 -A9 FF 20 BC F0 A2 00 A9 37 20 80 F8 A2 00 86 02 -86 03 A9 00 20 38 F8 A2 00 A9 00 20 11 F3 20 76 -F3 A0 00 91 00 A2 00 A9 FF 20 BC F0 A2 00 A9 00 -20 B6 F0 A2 00 A9 FF 20 BC F0 A0 00 A2 00 B1 00 -4C 83 F6 20 D2 F7 60 20 88 F7 A2 00 A9 FF 20 BC -F0 A2 00 A9 00 20 B0 F0 A2 00 A9 FF 20 BC F0 A2 -00 A9 29 20 80 F8 A2 00 86 02 A9 40 85 03 A9 00 -20 38 F8 A2 00 A9 00 20 11 F3 20 76 F3 A0 00 91 -00 A2 00 A9 FF 20 BC F0 A2 00 A9 00 20 B6 F0 A2 -00 A9 FF 20 BC F0 A0 00 A2 00 B1 00 4C DF F6 20 -D2 F7 60 20 96 F8 20 B8 F7 A0 05 A2 00 B1 00 4C -F2 F6 A0 0E 20 1F F7 60 20 96 F8 20 B8 F7 A0 03 -A2 00 B1 00 4C 07 F7 A0 0E 20 1F F7 60 A0 00 18 -71 00 91 00 48 C8 8A 71 00 91 00 AA 68 60 C8 48 -18 98 65 00 85 00 90 02 E6 01 68 60 A0 00 F0 07 -A9 45 A2 F0 4C 00 02 60 A9 00 85 08 A9 F0 85 09 -A9 00 85 0A A9 02 85 0B A2 DA A9 FF 85 10 A0 00 -E8 F0 0D B1 08 91 0A C8 D0 F6 E6 09 E6 0B D0 F0 -E6 10 D0 EF 60 85 08 86 09 20 68 F0 4C 73 F7 85 -08 86 09 A0 00 B1 08 F0 0E C8 84 10 20 5B F0 A4 -10 D0 F2 E6 09 D0 EE 60 A4 00 D0 02 C6 01 C6 00 -60 A5 00 38 E9 02 85 00 90 01 60 C6 01 60 A5 00 -38 E9 03 85 00 90 01 60 C6 01 60 A5 00 38 E9 04 -85 00 90 01 60 C6 01 60 A5 00 38 E9 06 85 00 90 -01 60 C6 01 60 A5 00 38 E9 07 85 00 90 01 60 C6 -01 60 E6 00 D0 02 E6 01 60 A0 01 B1 00 AA 88 B1 -00 E6 00 F0 05 E6 00 F0 03 60 E6 00 E6 01 60 A0 -03 4C 1F F7 A0 06 4C 1F F7 A0 08 4C 1F F7 85 08 -86 09 A2 00 B1 08 60 A0 01 B1 00 AA 88 B1 00 60 -A0 03 B1 00 85 03 88 B1 00 85 02 88 B1 00 AA 88 -B1 00 60 A2 00 18 65 00 48 8A 65 01 AA 68 60 A9 -00 AA A0 00 84 02 84 03 48 20 AB F7 A0 03 A5 03 -91 00 88 A5 02 91 00 88 8A 91 00 68 88 91 00 60 -D0 06 A2 00 8A 60 D0 FA A2 00 A9 01 60 F0 F9 30 -F7 A2 00 8A 60 F0 02 10 EF A2 00 8A 60 F0 E9 90 -E7 A2 00 8A 60 F0 DB A2 00 8A 2A 60 A0 00 B1 00 -A4 00 F0 07 C6 00 A0 00 91 00 60 C6 01 C6 00 91 -00 60 A9 00 A2 00 48 A5 00 38 E9 02 85 00 B0 02 -C6 01 A0 01 8A 91 00 68 88 91 00 60 48 84 10 A0 -01 B1 00 85 09 88 B1 00 85 08 A4 10 68 91 08 4C -E1 F7 A0 00 91 00 C8 48 8A 91 00 68 60 A9 25 85 -08 A9 02 85 09 A9 00 A8 A2 02 F0 0A 91 08 C8 D0 -FB E6 09 CA D0 F6 C0 00 F0 05 91 08 C8 D0 F7 60 -45 72 72 6F 72 20 69 6E 69 74 20 53 44 20 43 41 -52 44 0D 0A 00 53 44 20 43 61 72 64 20 69 6E 69 -74 0D 0A 00 53 74 61 72 74 0D 0A 00 6F 70 5F 63 -6F 6E 64 20 65 72 72 6F 72 0D 0A 00 49 46 20 43 -6F 6E 64 0D 0A 00 47 6F 20 49 44 4C 45 0D 0A 00 +01 20 72 F8 20 F0 F6 20 45 F0 58 20 03 F1 6C FC +FF 20 E4 F6 00 A0 00 F0 07 A9 45 A2 F0 4C 00 02 +60 AD FF EF A2 00 60 8D FF EF 60 20 E9 F0 C9 0A +D0 05 A9 0D 20 E9 F0 60 DA 5A A8 B2 00 AA A9 1B +20 E9 F0 A9 5B 20 E9 F0 98 20 E9 F0 A9 3B 20 E9 +F0 8A 20 E9 F0 A9 48 20 E9 F0 7A FA 60 DA A9 1B +20 E9 F0 A9 63 20 E9 F0 68 60 40 DA BA 48 E8 E8 +BD 00 01 29 10 D0 06 68 FA 20 02 F1 40 4C AD F0 +48 A0 04 B1 00 09 40 20 D9 F0 88 B1 00 20 D9 F0 +88 10 F8 68 09 01 20 D9 F0 20 AC F7 60 A9 01 8D +DB EF 60 9C DB EF 60 A9 00 8D DA EF AD DB EF 30 +FB AD D9 EF 60 8D E6 EF 60 48 8D E6 EF AD E7 EF +89 02 D0 F9 68 60 AD E6 EF A2 00 60 AD E7 EF A2 +00 60 60 20 70 F7 A2 00 86 02 86 03 A9 00 20 DD +F7 20 49 F7 A9 B9 A2 F8 20 27 F7 20 45 F1 C9 00 +20 F5 F7 D0 03 4C 32 F1 A9 95 A2 F8 20 27 F7 4C +39 F1 A9 AA A2 F8 20 27 F7 4C 3C F1 4C 3C F1 A0 +0C 20 D7 F6 60 20 7D F7 A9 00 20 25 F8 20 B7 F2 +4C 7C F1 A0 00 A2 00 18 A9 01 71 00 91 00 A0 00 +A2 00 B1 00 C9 FF 20 FB F7 D0 03 4C 7C F1 A9 DB +A2 F8 20 27 F7 A2 00 A9 01 4C B3 F2 20 69 F4 A0 +01 91 00 C9 01 20 F5 F7 D0 C9 A2 00 A9 00 A0 06 +20 69 F8 A0 07 20 C1 F7 E0 03 D0 02 C9 E8 20 14 +F8 F0 03 4C A9 F1 4C B5 F1 A0 06 A2 00 A9 01 20 +C7 F6 4C 93 F1 A9 01 20 C8 F7 20 C3 F4 A0 01 A2 +00 B1 00 C9 01 20 F5 F7 D0 03 4C DB F1 A9 D1 A2 +F8 20 27 F7 A2 00 A9 01 4C B3 F2 A0 05 A2 00 B1 +00 C9 AA 20 F5 F7 D0 03 4C F2 F1 A2 00 A9 01 4C +B3 F2 A2 00 A9 00 A0 00 91 00 A0 00 A2 00 B1 00 +C9 FF 20 FB F7 D0 03 4C 18 F2 A9 C1 A2 F8 20 27 +F7 A2 00 A9 01 4C B3 F2 20 E5 F5 A0 01 91 00 A0 +01 A2 00 B1 00 C9 02 20 14 F8 D0 03 4C 36 F2 20 +3F F6 A0 01 91 00 A2 00 A9 00 A0 06 20 69 F8 A0 +07 20 C1 F7 E0 03 D0 02 C9 E8 20 14 F8 F0 03 4C +55 F2 4C 61 F2 A0 06 A2 00 A9 01 20 C7 F6 4C 3F +F2 A0 00 A2 00 18 A9 01 71 00 91 00 A0 01 A2 00 +B1 00 C9 00 20 F5 F7 D0 81 A2 00 A9 00 A0 06 20 +69 F8 A0 07 20 C1 F7 E0 03 D0 02 C9 E8 20 14 F8 +F0 03 4C 98 F2 4C A4 F2 A0 06 A2 00 A9 01 20 C7 +F6 4C 82 F2 A9 01 20 C8 F7 20 6B F5 A2 00 A9 00 +4C B3 F2 20 B1 F7 60 20 56 F7 A2 00 A9 00 20 D3 +F0 A2 00 A9 00 A0 01 20 69 F8 A0 02 20 C1 F7 E0 +03 D0 02 C9 E8 20 14 F8 F0 03 4C E0 F2 4C EC F2 +A0 01 A2 00 A9 01 20 C7 F6 4C CA F2 A2 00 A9 FF +20 D9 F0 A2 00 A9 00 20 D3 F0 A2 00 A9 00 A0 00 +91 00 A0 00 A2 00 B1 00 C9 50 20 14 F8 F0 03 4C +15 F3 4C 2A F3 A2 00 A9 FF 20 D9 F0 A0 00 A2 00 +18 A9 01 71 00 91 00 4C 02 F3 20 A7 F7 60 A9 00 +20 25 F8 20 40 F7 4C 59 F3 A0 01 A2 00 18 A9 01 +71 00 91 00 A0 01 A2 00 B1 00 C9 09 A9 00 A2 00 +2A D0 03 4C 59 F3 4C 6B F3 A2 00 A9 FF 20 D9 F0 +A0 00 91 00 C9 FF 20 FB F7 D0 CE A0 00 A2 00 B1 +00 4C 74 F3 20 99 F7 60 20 3B F8 A0 01 20 C1 F7 +20 3B F8 20 2E F3 A0 00 20 51 F8 A0 01 20 C1 F7 +1A D0 01 E8 20 3B F8 A2 00 A9 FF 20 D9 F0 A0 00 +20 51 F8 20 99 F7 60 20 3B F8 A0 01 20 C1 F7 20 +3B F8 20 2E F3 A0 00 20 51 F8 A0 01 20 C1 F7 A0 +00 20 B6 F7 C9 02 A9 00 A2 00 2A D0 03 4C D3 F3 +4C E6 F3 A0 01 20 C1 F7 1A D0 01 E8 20 3B F8 A2 +00 A9 04 20 2D F4 20 99 F7 60 20 3B F8 A0 01 20 +C1 F7 20 3B F8 20 2E F3 A0 00 20 51 F8 A0 01 20 +C1 F7 A0 00 20 B6 F7 C9 02 A9 00 A2 00 2A D0 03 +4C 16 F4 4C 29 F4 A0 01 20 C1 F7 1A D0 01 E8 20 +3B F8 A2 00 A9 04 20 2D F4 20 99 F7 60 20 25 F8 +4C 52 F4 A0 02 20 C1 F7 20 3B F8 A2 00 A9 FF 48 +A0 03 A2 00 A9 01 20 C7 F6 68 20 D9 F0 A0 00 20 +51 F8 A0 00 B1 00 08 A0 00 A2 00 B1 00 38 E9 01 +91 00 28 D0 CE 20 A7 F7 60 20 40 F7 A2 00 A9 FF +20 D9 F0 A2 00 A9 00 20 CD F0 A2 00 A9 FF 20 D9 +F0 A2 00 A9 00 20 25 F8 A2 00 86 02 86 03 A9 00 +20 DD F7 A2 00 A9 94 20 B0 F0 20 2E F3 A0 00 91 +00 A2 00 A9 FF 20 D9 F0 A2 00 A9 00 20 D3 F0 A2 +00 A9 FF 20 D9 F0 A0 00 A2 00 B1 00 4C BF F4 20 +8A F7 60 20 3B F8 A2 00 A9 FF 20 D9 F0 A2 00 A9 +00 20 CD F0 A2 00 A9 FF 20 D9 F0 A2 00 A9 08 20 +25 F8 A2 01 A9 00 85 02 A9 00 85 03 A9 AA 20 DD +F7 A2 00 A9 86 20 B0 F0 A0 01 20 C1 F7 20 EA F3 +A2 00 A9 FF 20 D9 F0 A2 00 A9 00 20 D3 F0 A2 00 +A9 FF 20 D9 F0 20 99 F7 60 20 3B F8 A2 00 A9 FF +20 D9 F0 A2 00 A9 00 20 CD F0 A2 00 A9 FF 20 D9 +F0 A2 00 A9 0D 20 25 F8 A2 00 86 02 86 03 A9 00 +20 DD F7 A2 00 A9 00 20 B0 F0 A0 01 20 C1 F7 20 +78 F3 A2 00 A9 FF 20 D9 F0 A2 00 A9 00 20 D3 F0 +A2 00 A9 FF 20 D9 F0 20 99 F7 60 20 3B F8 20 40 +F7 A2 00 A9 FF 20 D9 F0 A2 00 A9 00 20 CD F0 A2 +00 A9 FF 20 D9 F0 A0 00 91 00 A0 00 A2 00 B1 00 +C9 FF 20 F5 F7 D0 03 4C AB F5 4C 9D F5 A2 00 A9 +FF 20 D9 F0 C9 FF 20 F5 F7 D0 F2 A2 00 A9 3A 20 +25 F8 A2 00 86 02 86 03 A9 00 20 DD F7 A2 00 A9 +00 20 B0 F0 A0 02 20 C1 F7 20 A7 F3 A2 00 A9 FF +20 D9 F0 A2 00 A9 00 20 D3 F0 A2 00 A9 FF 20 D9 +F0 20 A7 F7 60 20 40 F7 A2 00 A9 FF 20 D9 F0 A2 +00 A9 00 20 CD F0 A2 00 A9 FF 20 D9 F0 A2 00 A9 +37 20 25 F8 A2 00 86 02 86 03 A9 00 20 DD F7 A2 +00 A9 00 20 B0 F0 20 2E F3 A0 00 91 00 A2 00 A9 +FF 20 D9 F0 A2 00 A9 00 20 D3 F0 A2 00 A9 FF 20 +D9 F0 A0 00 A2 00 B1 00 4C 3B F6 20 8A F7 60 20 +40 F7 A2 00 A9 FF 20 D9 F0 A2 00 A9 00 20 CD F0 +A2 00 A9 FF 20 D9 F0 A2 00 A9 29 20 25 F8 A2 00 +86 02 A9 40 85 03 A9 00 20 DD F7 A2 00 A9 00 20 +B0 F0 20 2E F3 A0 00 91 00 A2 00 A9 FF 20 D9 F0 +A2 00 A9 00 20 D3 F0 A2 00 A9 FF 20 D9 F0 A0 00 +A2 00 B1 00 4C 97 F6 20 8A F7 60 20 3B F8 20 70 +F7 A0 05 A2 00 B1 00 4C AA F6 A0 0E 20 D7 F6 60 +20 3B F8 20 70 F7 A0 03 A2 00 B1 00 4C BF F6 A0 +0E 20 D7 F6 60 A0 00 18 71 00 91 00 48 C8 8A 71 +00 91 00 AA 68 60 C8 48 18 98 65 00 85 00 90 02 +E6 01 68 60 A0 00 F0 07 A9 45 A2 F0 4C 00 02 60 +A9 00 85 08 A9 F0 85 09 A9 00 85 0A A9 02 85 0B +A2 DA A9 FF 85 10 A0 00 E8 F0 0D B1 08 91 0A C8 +D0 F6 E6 09 E6 0B D0 F0 E6 10 D0 EF 60 85 08 86 +09 20 68 F0 4C 2B F7 85 08 86 09 A0 00 B1 08 F0 +0E C8 84 10 20 5B F0 A4 10 D0 F2 E6 09 D0 EE 60 +A4 00 D0 02 C6 01 C6 00 60 A5 00 38 E9 02 85 00 +90 01 60 C6 01 60 A5 00 38 E9 03 85 00 90 01 60 +C6 01 60 A5 00 38 E9 04 85 00 90 01 60 C6 01 60 +A5 00 38 E9 06 85 00 90 01 60 C6 01 60 A5 00 38 +E9 07 85 00 90 01 60 C6 01 60 E6 00 D0 02 E6 01 +60 A0 01 B1 00 AA 88 B1 00 E6 00 F0 05 E6 00 F0 +03 60 E6 00 E6 01 60 A0 03 4C D7 F6 A0 05 4C D7 +F6 A0 08 4C D7 F6 85 08 86 09 A2 00 B1 08 60 A0 +01 B1 00 AA 88 B1 00 60 A2 00 18 65 00 48 8A 65 +01 AA 68 60 A9 00 AA A0 00 84 02 84 03 48 20 63 +F7 A0 03 A5 03 91 00 88 A5 02 91 00 88 8A 91 00 +68 88 91 00 60 D0 06 A2 00 8A 60 D0 FA A2 00 A9 +01 60 F0 F9 30 F7 A2 00 8A 60 F0 02 10 EF A2 00 +8A 60 F0 E9 90 E7 A2 00 8A 60 F0 DB A2 00 8A 2A +60 A0 00 B1 00 A4 00 F0 07 C6 00 A0 00 91 00 60 +C6 01 C6 00 91 00 60 A9 00 A2 00 48 A5 00 38 E9 +02 85 00 B0 02 C6 01 A0 01 8A 91 00 68 88 91 00 +60 48 84 10 A0 01 B1 00 85 09 88 B1 00 85 08 A4 +10 68 91 08 4C 99 F7 A0 00 91 00 C8 48 8A 91 00 +68 60 A9 25 85 08 A9 02 85 09 A9 00 A8 A2 02 F0 +0A 91 08 C8 D0 FB E6 09 CA D0 F6 C0 00 F0 05 91 +08 C8 D0 F7 60 45 72 72 6F 72 20 69 6E 69 74 20 +53 44 20 43 41 52 44 0D 0A 00 53 44 20 43 61 72 +64 20 69 6E 69 74 0D 0A 00 53 74 61 72 74 0D 0A +00 6F 70 5F 63 6F 6E 64 20 65 72 72 6F 72 0D 0A +00 49 46 20 43 6F 6E 64 0D 0A 00 47 6F 20 49 44 +4C 45 0D 0A 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 diff --git a/hw/efinix_fpga/super6502.xml b/hw/efinix_fpga/super6502.xml index 91bbcc4..495eacf 100644 --- a/hw/efinix_fpga/super6502.xml +++ b/hw/efinix_fpga/super6502.xml @@ -1,5 +1,5 @@ - + diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 7193233..537450e 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -94,6 +94,7 @@ void SD_powerUpSeq() /******************************************************************************* Send command to SD card *******************************************************************************/ +/* void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) { // transmit command to sd card @@ -108,6 +109,7 @@ void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) // transmit crc spi_exchange(crc|0x01); } +*/ /******************************************************************************* Read R1 from SD card diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s new file mode 100644 index 0000000..99622d0 --- /dev/null +++ b/sw/bootloader/devices/sd_card_asm.s @@ -0,0 +1,32 @@ +.export _SD_command + +.importzp sp + +.autoimport on + +; void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) + +; The plan: push crc to stack, load arg into tmp1 through 4 + +.proc _SD_command: near + + pha ; Push CRC to cpu stack + ldy #$04 + lda (sp),y ; Load CMD + ora #$40 ; start bit + jsr _spi_exchange + + dey +arg_loop: ; send ARG + lda (sp),y + jsr _spi_exchange + dey + bpl arg_loop + + pla ; Pull CRC from stack + ora #$01 ; stop bit + jsr _spi_exchange + jsr incsp5 ; pop all off stack + rts + +.endproc From 60072603d9dd12560f50e68d335041a348b73d02 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 17:26:40 -0700 Subject: [PATCH 05/12] Rewrite readRes1, consolidate res1 commands --- sw/bootloader/devices/sd_card.c | 38 +++++++++++------------------ sw/bootloader/devices/sd_card_asm.s | 22 +++++++++++++++++ 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 537450e..8b714a9 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -114,6 +114,7 @@ void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) /******************************************************************************* Read R1 from SD card *******************************************************************************/ +/* uint8_t SD_readRes1() { uint8_t i = 0, res1; @@ -129,6 +130,7 @@ uint8_t SD_readRes1() return res1; } +*/ /******************************************************************************* Read R2 from SD card @@ -405,20 +407,17 @@ void SD_readOCR(uint8_t *res) spi_exchange(0xFF); } -/******************************************************************************* - Send application command (CMD55) -*******************************************************************************/ -uint8_t SD_sendApp() +// Send a command with starting end ending clock pulses +uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) { uint8_t res1; - // assert chip select spi_exchange(0xFF); spi_select(0); spi_exchange(0xFF); // send CMD0 - SD_command(CMD55, CMD55_ARG, CMD55_CRC); + SD_command(cmd, arg, crc); // read response res1 = SD_readRes1(); @@ -431,27 +430,18 @@ uint8_t SD_sendApp() return res1; } +/******************************************************************************* + Send application command (CMD55) +*******************************************************************************/ +uint8_t SD_sendApp() +{ + return res1_cmd(CMD55, CMD55_ARG, CMD55_CRC);; +} + /******************************************************************************* Send operating condition (ACMD41) *******************************************************************************/ uint8_t SD_sendOpCond() { - uint8_t res1; - // assert chip select - spi_exchange(0xFF); - spi_select(0); - spi_exchange(0xFF); - - // send CMD0 - SD_command(ACMD41, ACMD41_ARG, ACMD41_CRC); - - // read response - res1 = SD_readRes1(); - - // deassert chip select - spi_exchange(0xFF); - spi_deselect(0); - spi_exchange(0xFF); - - return res1; + return res1_cmd(ACMD41, ACMD41_ARG, ACMD41_CRC); } diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s index 99622d0..7cb5f32 100644 --- a/sw/bootloader/devices/sd_card_asm.s +++ b/sw/bootloader/devices/sd_card_asm.s @@ -1,4 +1,5 @@ .export _SD_command +.export _SD_readRes1 .importzp sp @@ -30,3 +31,24 @@ arg_loop: ; send ARG rts .endproc + +; uint8_t SD_readRes1 (void) + +.proc _SD_readRes1: near +; Try to read/write up to 8 times, then return value + + ldx #$08 + +tryread: + lda #$ff + jsr _spi_exchange + cmp #$ff + bne end + dex + bne tryread + +end: + rts + + +.endproc \ No newline at end of file From 2ef463846f4ea30a2320c324a0c6cf67fb513669 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 17:30:05 -0700 Subject: [PATCH 06/12] Consolidate another res1 function --- sw/bootloader/devices/sd_card.c | 66 ++++++++++++--------------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 8b714a9..9dab8ff 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -67,6 +67,29 @@ uint8_t SD_init() return SD_SUCCESS; } +// Send a command with starting end ending clock pulses +uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) +{ + uint8_t res1; + // assert chip select + spi_exchange(0xFF); + spi_select(0); + spi_exchange(0xFF); + + // send CMD0 + SD_command(cmd, arg, crc); + + // read response + res1 = SD_readRes1(); + + // deassert chip select + spi_exchange(0xFF); + spi_deselect(0); + spi_exchange(0xFF); + + return res1; +} + /******************************************************************************* Run power up sequence *******************************************************************************/ @@ -187,25 +210,7 @@ void SD_readBytes(uint8_t *res, uint8_t n) *******************************************************************************/ uint8_t SD_goIdleState() { - uint8_t res1; - - // assert chip select - spi_exchange(0xFF); - spi_select(0); - spi_exchange(0xFF); - - // send CMD0 - SD_command(CMD0, CMD0_ARG, CMD0_CRC); - - // read response - res1 = SD_readRes1(); - - // deassert chip select - spi_exchange(0xFF); - spi_deselect(0); - spi_exchange(0xFF); - - return res1; + return res1_cmd(CMD0, CMD0_ARG, CMD0_CRC); } /******************************************************************************* @@ -407,29 +412,6 @@ void SD_readOCR(uint8_t *res) spi_exchange(0xFF); } -// Send a command with starting end ending clock pulses -uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) -{ - uint8_t res1; - // assert chip select - spi_exchange(0xFF); - spi_select(0); - spi_exchange(0xFF); - - // send CMD0 - SD_command(cmd, arg, crc); - - // read response - res1 = SD_readRes1(); - - // deassert chip select - spi_exchange(0xFF); - spi_deselect(0); - spi_exchange(0xFF); - - return res1; -} - /******************************************************************************* Send application command (CMD55) *******************************************************************************/ From 028a4311892a5879c10f3a0558588ae98e99ab93 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 18:00:22 -0700 Subject: [PATCH 07/12] readres2 and readbytes assembly rewrite --- sw/bootloader/devices/sd_card.c | 4 +++ sw/bootloader/devices/sd_card_asm.s | 42 ++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 9dab8ff..7fdfeba 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -158,6 +158,7 @@ uint8_t SD_readRes1() /******************************************************************************* Read R2 from SD card *******************************************************************************/ +/* void SD_readRes2(uint8_t *res) { // read response 1 in R2 @@ -166,6 +167,7 @@ void SD_readRes2(uint8_t *res) // read final byte of response res[1] = spi_exchange(0xFF); } +*/ /******************************************************************************* Read R3 from SD card @@ -200,10 +202,12 @@ void SD_readRes7(uint8_t *res) /******************************************************************************* Read specified number of bytes from SD card *******************************************************************************/ +/* void SD_readBytes(uint8_t *res, uint8_t n) { while(n--) *res++ = spi_exchange(0xFF); } +*/ /******************************************************************************* Command Idle State (CMD0) diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s index 7cb5f32..c398031 100644 --- a/sw/bootloader/devices/sd_card_asm.s +++ b/sw/bootloader/devices/sd_card_asm.s @@ -1,7 +1,9 @@ .export _SD_command .export _SD_readRes1 +.export _SD_readRes2 +.export _SD_readBytes -.importzp sp +.importzp sp, ptr1 .autoimport on @@ -50,5 +52,43 @@ tryread: end: rts +.endproc + +; void SD_readRes2(uint8_t *res) + +.proc _SD_readRes2: near + + sta ptr1 ; store res in ptr1 + stx ptr1 + 1 + + jsr _SD_readRes1 ; get first response 1 + sta (ptr1) + + lda #$ff + jsr _spi_exchange ; get final byte of response + ldy #$01 + sta (ptr1),y + jsr incsp2 + rts + +.endproc + +; void SD_readBytes(uint8_t *res, uint8_t n) + +.proc _SD_readBytes: near + + tax + jsr popptr1 ; store res in ptr1 + +read: + lda #$ff ; read data first + jsr _spi_exchange + sta (ptr1) + inc ptr1 ; then increment res + bne @L1 + inc ptr1 + 1 +@L1: dex ; then decrement x + bne read ; and if x is zero we are done + rts .endproc \ No newline at end of file From 1c693b029db82662c5f722e7ea52968e0949435d Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 18:25:29 -0700 Subject: [PATCH 08/12] readres3 assembly rewrite --- sw/bootloader/devices/sd_card.c | 2 ++ sw/bootloader/devices/sd_card_asm.s | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 7fdfeba..1c72a0a 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -172,6 +172,7 @@ void SD_readRes2(uint8_t *res) /******************************************************************************* Read R3 from SD card *******************************************************************************/ +/* void SD_readRes3(uint8_t *res) { // read response 1 in R3 @@ -183,6 +184,7 @@ void SD_readRes3(uint8_t *res) // read remaining bytes SD_readBytes(res + 1, R3_BYTES); } +*/ /******************************************************************************* Read R7 from SD card diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s index c398031..99aa055 100644 --- a/sw/bootloader/devices/sd_card_asm.s +++ b/sw/bootloader/devices/sd_card_asm.s @@ -1,12 +1,15 @@ .export _SD_command .export _SD_readRes1 .export _SD_readRes2 +.export _SD_readRes3 .export _SD_readBytes .importzp sp, ptr1 .autoimport on +.MACPACK generic + ; void SD_command(uint8_t cmd, uint32_t arg, uint8_t crc) ; The plan: push crc to stack, load arg into tmp1 through 4 @@ -91,4 +94,30 @@ read: bne read ; and if x is zero we are done rts +.endproc + +; void SD_readRes3(uint8_t *res) + +.proc _SD_readRes3: near + + sta ptr1 ; store res in ptr1 + stx ptr1 + 1 + + jsr _SD_readRes1 ; read respopnse 1 in R3 + cmp #$02 ; if error reading R1, return + bge @L1 + + inc ptr1 ; read remaining bytes + bne @L2 + inc ptr1 +@L2: lda ptr1 ; push low byte + sta (sp) + ldy #$01 + lda ptr1 + 1 ; push high byte + sta (sp),y + lda #$04 ; R3_BYTES + jsr _SD_readBytes + +@L1: rts + .endproc \ No newline at end of file From 8f3a1a596832d3d7f520d63824f3e03e003c0e0d Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 18:43:39 -0700 Subject: [PATCH 09/12] res1_cmd assembly rewrite --- sw/bootloader/devices/sd_card.c | 2 ++ sw/bootloader/devices/sd_card.h | 2 ++ sw/bootloader/devices/sd_card_asm.s | 34 ++++++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 1c72a0a..55b4341 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -67,6 +67,7 @@ uint8_t SD_init() return SD_SUCCESS; } +/* // Send a command with starting end ending clock pulses uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) { @@ -89,6 +90,7 @@ uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) return res1; } +*/ /******************************************************************************* Run power up sequence diff --git a/sw/bootloader/devices/sd_card.h b/sw/bootloader/devices/sd_card.h index 6488e8b..3e9304d 100644 --- a/sw/bootloader/devices/sd_card.h +++ b/sw/bootloader/devices/sd_card.h @@ -75,4 +75,6 @@ uint8_t SD_sendOpCond(); uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *error); uint8_t SD_writeSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *res); +uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc); + #endif \ No newline at end of file diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s index 99aa055..f377964 100644 --- a/sw/bootloader/devices/sd_card_asm.s +++ b/sw/bootloader/devices/sd_card_asm.s @@ -3,6 +3,7 @@ .export _SD_readRes2 .export _SD_readRes3 .export _SD_readBytes +.export _res1_cmd .importzp sp, ptr1 @@ -52,7 +53,7 @@ tryread: dex bne tryread -end: +end: ; x will be 0 here anyway rts .endproc @@ -120,4 +121,35 @@ read: @L1: rts +.endproc + +; uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) + +.proc _res1_cmd: near + + pha ; push crc to processor stack + lda #$ff + jsr _spi_exchange + lda #$00 ; this gets ignored anyway + jsr _spi_select + lda #$ff + jsr _spi_exchange + + pla + jsr _SD_command ; rely on command to teardown stack + + jsr _SD_readRes1 + tay ; spi doesn't touch y + + lda #$ff + jsr _spi_exchange + lda #$00 ; this gets ignored anyway + jsr _spi_deselect + lda #$ff + jsr _spi_exchange + + tya + ldx #$00 ; Promote to integer + rts + .endproc \ No newline at end of file From 7e958c8a117d04f65b27ede9488ecf4bd8fac61c Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 19:00:39 -0700 Subject: [PATCH 10/12] powerupseq assembly rewrite --- sw/bootloader/devices/sd_card.c | 2 ++ sw/bootloader/devices/sd_card_asm.s | 35 +++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 55b4341..1d7cfc5 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -95,6 +95,7 @@ uint8_t res1_cmd(uint8_t cmd, uint32_t arg, uint8_t crc) /******************************************************************************* Run power up sequence *******************************************************************************/ +/* void SD_powerUpSeq() { uint16_t i; @@ -115,6 +116,7 @@ void SD_powerUpSeq() for(j = 0; j < SD_INIT_CYCLES; j++) spi_exchange(0xFF); } +*/ /******************************************************************************* Send command to SD card diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s index f377964..17833a9 100644 --- a/sw/bootloader/devices/sd_card_asm.s +++ b/sw/bootloader/devices/sd_card_asm.s @@ -3,6 +3,7 @@ .export _SD_readRes2 .export _SD_readRes3 .export _SD_readBytes +.export _SD_powerUpSeq .export _res1_cmd .importzp sp, ptr1 @@ -152,4 +153,38 @@ read: ldx #$00 ; Promote to integer rts +.endproc + +; void SD_powerUpSeq(void) + +.proc _SD_powerUpSeq: near + + lda #$00 + jsr _spi_deselect + jsr _sd_delay + lda #$ff + jsr _spi_exchange + lda #$00 + jsr _spi_deselect + + ldx #$50 ; SD_INIT_CYCLES +@L1: lda #$ff + jsr _spi_exchange + dex + bne @L1 + + rts + +.endproc + + +; 1ms delay approx. saves no registers +.proc _sd_delay: near + ldx #$01 ; delay loop: A*X*10 + 4 +@L1: lda #$c8 ; 1ms at 2MHz +@L2: dec ; 2 + bne @L2 ; 3 + dex ; 2 + bne @L1 ; 3 + rts .endproc \ No newline at end of file From d16675ed3c3b678b3ad336b8e1cf104a40aaa866 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 21:45:54 -0700 Subject: [PATCH 11/12] Consolidate resp3 and resp7, fix stack issue wasn't pushing res to stack, which makes stack pointer wrong --- sw/bootloader/devices/sd_card.c | 2 ++ sw/bootloader/devices/sd_card_asm.s | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 1d7cfc5..1e64d26 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -193,6 +193,7 @@ void SD_readRes3(uint8_t *res) /******************************************************************************* Read R7 from SD card *******************************************************************************/ +/* void SD_readRes7(uint8_t *res) { // read response 1 in R7 @@ -204,6 +205,7 @@ void SD_readRes7(uint8_t *res) // read remaining bytes SD_readBytes(res + 1, R7_BYTES); } +*/ /******************************************************************************* Read specified number of bytes from SD card diff --git a/sw/bootloader/devices/sd_card_asm.s b/sw/bootloader/devices/sd_card_asm.s index 17833a9..019286e 100644 --- a/sw/bootloader/devices/sd_card_asm.s +++ b/sw/bootloader/devices/sd_card_asm.s @@ -2,6 +2,7 @@ .export _SD_readRes1 .export _SD_readRes2 .export _SD_readRes3 +.export _SD_readRes7 .export _SD_readBytes .export _SD_powerUpSeq .export _res1_cmd @@ -98,8 +99,9 @@ read: .endproc +; void SD_readRes7(uint8_t *res) + _SD_readRes7: ; void SD_readRes3(uint8_t *res) - .proc _SD_readRes3: near sta ptr1 ; store res in ptr1 @@ -113,10 +115,8 @@ read: bne @L2 inc ptr1 @L2: lda ptr1 ; push low byte - sta (sp) - ldy #$01 - lda ptr1 + 1 ; push high byte - sta (sp),y + ldx ptr1 + 1 + jsr pushax lda #$04 ; R3_BYTES jsr _SD_readBytes From 096472e084fd5fd39f61011c21bfdb1e832e75b8 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 23 Jul 2023 22:44:19 -0700 Subject: [PATCH 12/12] Get SD card reads working --- sw/bootloader/Makefile | 2 +- sw/bootloader/devices/sd_card.c | 4 ---- sw/bootloader/devices/sd_print.c | 14 +++++++++++++- sw/bootloader/main.c | 28 ++++++++++++++-------------- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/sw/bootloader/Makefile b/sw/bootloader/Makefile index 7a23090..ac2d520 100644 --- a/sw/bootloader/Makefile +++ b/sw/bootloader/Makefile @@ -15,7 +15,7 @@ LISTS=lists TESTS=tests SRCS=$(wildcard *.s) $(wildcard *.c) -SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*) $(wildcard filesystem/*) devices/sd_print.c, $(wildcard **/*.c)) +SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*) $(wildcard filesystem/*), $(wildcard **/*.c)) OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) diff --git a/sw/bootloader/devices/sd_card.c b/sw/bootloader/devices/sd_card.c index 1e64d26..22d4f54 100644 --- a/sw/bootloader/devices/sd_card.c +++ b/sw/bootloader/devices/sd_card.c @@ -282,8 +282,6 @@ uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) uint16_t readAttempts; uint16_t i; - /* - // set token to none *token = 0xFF; @@ -326,8 +324,6 @@ uint8_t SD_readSingleBlock(uint32_t addr, uint8_t *buf, uint8_t *token) spi_deselect(0); spi_exchange(0xFF); - */ - return res1; } diff --git a/sw/bootloader/devices/sd_print.c b/sw/bootloader/devices/sd_print.c index 4e8ead5..2dcac25 100644 --- a/sw/bootloader/devices/sd_print.c +++ b/sw/bootloader/devices/sd_print.c @@ -3,6 +3,7 @@ #include "sd_print.h" #include "sd_card.h" +/* void SD_printR1(uint8_t res) { if(res == 0xFF) @@ -26,7 +27,9 @@ void SD_printR1(uint8_t res) if(IN_IDLE(res)) cputs("\tIn Idle State\r\n"); } +*/ +/* void SD_printR2(uint8_t *res) { SD_printR1(res[0]); @@ -52,7 +55,9 @@ void SD_printR2(uint8_t *res) if(CARD_LOCKED(res[1])) cputs("\tCard Locked\r\n"); } +*/ +/* void SD_printR3(uint8_t *res) { SD_printR1(res[0]); @@ -84,7 +89,9 @@ void SD_printR3(uint8_t *res) if(VDD_3536(res[2])) cputs("3.5-3.6"); cputs("\r\n"); } +*/ +/* void SD_printR7(uint8_t *res) { SD_printR1(res[0]); @@ -112,7 +119,9 @@ void SD_printR7(uint8_t *res) cprintf("%x", res[4]); cputs("\r\n"); } +*/ +/* void SD_printCSD(uint8_t *buf) { cputs("CSD:\r\n"); @@ -139,6 +148,7 @@ void SD_printCSD(uint8_t *buf) cprintf("%x", buf[9]); cputs("\r\n"); } +*/ void SD_printBuf(uint8_t *buf) { @@ -146,7 +156,7 @@ void SD_printBuf(uint8_t *buf) uint16_t i; for(i = 0; i < SD_BLOCK_LEN; i++) { - cprintf("%x", *buf++); + cprintf("%2x", *buf++); if(colCount == 19) { cputs("\r\n"); @@ -161,6 +171,7 @@ void SD_printBuf(uint8_t *buf) cputs("\r\n"); } +/* void SD_printDataErrToken(uint8_t token) { if(token & 0xF0) @@ -174,3 +185,4 @@ void SD_printDataErrToken(uint8_t token) if(SD_TOKEN_ERROR(token)) cputs("\tError\r\n"); } +*/ \ No newline at end of file diff --git a/sw/bootloader/main.c b/sw/bootloader/main.c index bd4f1b3..d22de3d 100644 --- a/sw/bootloader/main.c +++ b/sw/bootloader/main.c @@ -24,31 +24,31 @@ int main() { // initialize sd card if(SD_init() != SD_SUCCESS) { - cputs("Error init SD CARD\r\n"); + cputs("Error\r\n"); } else { - cputs("SD Card init\r\n"); + cputs("Success\r\n"); // read sector 0 - // cputs("\r\nReading sector: 0x"); + cputs("\r\nReading sector: 0x"); // ((uint8_t)(addr >> 24)); // cprintf("%x", (uint8_t)(addr >> 16)); // cprintf("%x", (uint8_t)(addr >> 8)); // cprintf("%x", (uint8_t)addr); - // res[0] = SD_readSingleBlock(addr, buf, &token); - // cputs("\r\nResponse:\r\n"); - // //SD_printR1(res[0]); + res[0] = SD_readSingleBlock(addr, buf, &token); + cputs("\r\nResponse:\r\n"); + //SD_printR1(res[0]); // if no error, print buffer - // if((res[0] == 0x00) && (token == SD_START_TOKEN)) - // SD_printBuf(buf); - // else if error token received, print - // else if(!(token & 0xF0)) - // { - // cputs("Ercputsror token:\r\n"); - // SD_printDataErrToken(token); - // } + if((res[0] == 0x00) && (token == SD_START_TOKEN)) + SD_printBuf(buf); + //else if error token received, print + else if(!(token & 0xF0)) + { + cputs("Error token:\r\n"); + //SD_printDataErrToken(token); + } // update address to 0x00000100 // addr = 0x00000100;