From 99e613497db99f9493706a42f9060b9623894a5d Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Sun, 10 Jan 2021 13:13:04 -0500 Subject: [PATCH] fix sdcard read (cleanup needed) --- .../9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.c | 8 ++++ .../9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.h | 2 + sbus-to-ztex-gateware/sbus_fsm.vhd | 46 ++++++++++++++----- sbus-to-ztex-gateware/xess_sdcard_wrapper.vhd | 25 ++++++++-- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.c b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.c index 2790c6d..1f09fa6 100644 --- a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.c +++ b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.c @@ -91,6 +91,8 @@ struct rdfpga_sdcard_rb_32to512 { #define RDFPGA_SDCARD_RSO3 _IOR(0, 5, u_int32_t) #define RDFPGA_SDCARD_RSTC _IOR(0, 6, u_int32_t) #define RDFPGA_SDCARD_RSTD _IOR(0, 7, u_int32_t) +#define RDFPGA_SDCARD_RSD _IOR(0, 8, u_int32_t) +#define RDFPGA_SDCARD_RSD2 _IOR(0, 9, u_int32_t) #define RDFPGA_SDCARD_RB _IOWR(0, 2, struct rdfpga_sdcard_rb_32to512) int @@ -112,6 +114,12 @@ rdfpga_sdcard_ioctl (dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) case RDFPGA_SDCARD_RSO3: *((u_int32_t*)data) = bus_space_read_4(sc->sc_bustag, sc->sc_bhregs, RDFPGA_SDCARD_REG_STATUS_OLD3); break; + case RDFPGA_SDCARD_RSD: + *((u_int32_t*)data) = bus_space_read_4(sc->sc_bustag, sc->sc_bhregs, RDFPGA_SDCARD_REG_STATUS_DAT); + break; + case RDFPGA_SDCARD_RSD2: + *((u_int32_t*)data) = bus_space_read_4(sc->sc_bustag, sc->sc_bhregs, RDFPGA_SDCARD_REG_STATUS_DAT2); + break; case RDFPGA_SDCARD_RSTC: *((u_int32_t*)data) = bus_space_read_4(sc->sc_bustag, sc->sc_bhregs, RDFPGA_SDCARD_REG_CTRL); bus_space_write_4(sc->sc_bustag, sc->sc_bhregs, RDFPGA_SDCARD_REG_CTRL, 0); diff --git a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.h b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.h index 9a00ab6..0d28124 100644 --- a/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.h +++ b/NetBSD/9.0/usr/src/sys/dev/sbus/rdfpga_sdcard.h @@ -55,6 +55,8 @@ struct rdfpga_sdcard_softc { #define RDFPGA_SDCARD_REG_DMAW_CTRL (RDFPGA_SDCARD_REG_BASE + 0x14) #define RDFPGA_SDCARD_REG_STATUS_OLD2 (RDFPGA_SDCARD_REG_BASE + 0x18) #define RDFPGA_SDCARD_REG_STATUS_OLD3 (RDFPGA_SDCARD_REG_BASE + 0x1c) +#define RDFPGA_SDCARD_REG_STATUS_DAT (RDFPGA_SDCARD_REG_BASE + 0x20) +#define RDFPGA_SDCARD_REG_STATUS_DAT2 (RDFPGA_SDCARD_REG_BASE + 0x24) /* nothing 0x18 - 0x3c ; DATA* not used directly */ diff --git a/sbus-to-ztex-gateware/sbus_fsm.vhd b/sbus-to-ztex-gateware/sbus_fsm.vhd index 530dd09..ed450e0 100644 --- a/sbus-to-ztex-gateware/sbus_fsm.vhd +++ b/sbus-to-ztex-gateware/sbus_fsm.vhd @@ -164,6 +164,8 @@ ENTITY SBusFSM is CONSTANT REG_INDEX_SDDMAW_CTRL : integer := 5; CONSTANT REG_INDEX_SD_STATUS_OLD2: integer := 6; CONSTANT REG_INDEX_SD_STATUS_OLD3: integer := 7; + CONSTANT REG_INDEX_SD_STATUS_DAT : integer := 8; + CONSTANT REG_INDEX_SD_STATUS_DAT2 : integer := 9; CONSTANT REG_INDEX_SDDMAW_DATA1 : integer := 16; CONSTANT REG_INDEX_SDDMAW_DATA2 : integer := 17; CONSTANT REG_INDEX_SDDMAW_DATA3 : integer := 18; @@ -355,6 +357,7 @@ ARCHITECTURE RTL OF SBusFSM IS signal out_sd_rd_addr_rcv : STD_LOGIC; signal out_sd_rd_addr_req : STD_LOGIC; signal out_sd_rd_addr_ack : STD_LOGIC; + signal sd_LEDs : std_logic_vector(7 downto 0); -- SIGNAL LIFE_COUNTER25 : natural range 0 to 25000000 := 300; SIGNAL RES_COUNTER : natural range 0 to 4 := 4; @@ -715,7 +718,9 @@ ARCHITECTURE RTL OF SBusFSM IS cs_bo : out std_logic; sclk_o : out std_logic; mosi_o : out std_logic; - miso_i : in std_logic + miso_i : in std_logic; + -- leds + leds : out std_logic_vector(7 downto 0) ); end component xess_sdcard_wrapper; @@ -780,9 +785,8 @@ BEGIN IOBerrs : IOBUF GENERIC MAP(DRIVE => 12, IOSTANDARD => "DEFAULT", SLEW => "SLOW") PORT MAP(O => BUF_ERRs_I, IO => SBUS_3V3_ERRs, I => BUF_ERRs_O, T => SMs_T); - --label_led_handler: LedHandler PORT MAP( l_ifclk => SBUS_3V3_CLK, l_LED_RESET => LED_RESET, l_LED_DATA => LED_DATA, l_LED0 => LED0, l_LED1 => LED1, l_LED2 => LED2, l_LED3 => LED3 ); - label_led_handler: LedHandler PORT MAP( l_ifclk => SBUS_3V3_CLK, l_LED_RESET => LED_RESET, l_LED_DATA => REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_LED), l_LED0 => LED0, l_LED1 => LED1, l_LED2 => LED2, l_LED3 => LED3, - l_LED4 => LED4, l_LED5 => LED5, l_LED6 => LED6, l_LED7 => LED7); + --label_led_handler: LedHandler PORT MAP( l_ifclk => SBUS_3V3_CLK, l_LED_RESET => LED_RESET, l_LED_DATA => REGISTERS(reg_bank_size*reg_bank_crypto_idx + REG_INDEX_LED), l_LED0 => LED0, l_LED1 => LED1, l_LED2 => LED2, l_LED3 => LED3, + -- l_LED4 => LED4, l_LED5 => LED5, l_LED6 => LED6, l_LED7 => LED7); label_prom: Prom PORT MAP (addr => p_addr, data => p_data); @@ -843,7 +847,9 @@ BEGIN cs_bo => SD_nCS, sclk_o => SD_CLK, mosi_o => SD_DI, - miso_i => SD_DO + miso_i => SD_DO, + -- leds + leds => sd_LEDs ); -- label_clk_wiz: clk_wiz_0 port map(clk_out1 => uart_clk, clk_in1 => fxclk_in); @@ -1137,6 +1143,7 @@ BEGIN dma_basereg_idx := reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_DATA1; BUF_DATA_O <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_ADDR); -- virt address BUF_PPRD_O <= '0'; -- writing to slave + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_DAT) <= fifo_fromsdcard_dout(159 downto 128); REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_DATA1) <= fifo_fromsdcard_dout(127 downto 96); REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_DATA2) <= fifo_fromsdcard_dout( 95 downto 64); REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_DATA3) <= fifo_fromsdcard_dout( 63 downto 32); @@ -1674,13 +1681,20 @@ BEGIN -- fixme REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_CTRL) <= x"00000000"; END IF; - elsif ((fifo_fromsdcard_dout(160) = '0') AND (REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS) /= x"FFFFFFFF")) THEN + elsif (fifo_fromsdcard_dout(160) = '0') THEN -- status indicating last stuff out of the FIFO was valid data -- indicative, does not remove word from FIFO - REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD3) <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD2); - REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD2) <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD); - REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD) <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS); - REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS) <= x"FFFFFFFF"; + IF (REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS)(31 downto 8) /= x"FFFFFF") THEN + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD3) <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD2); + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD2) <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD); + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_OLD) <= REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS); + END IF; + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS_DAT2) <= fifo_fromsdcard_dout(159 downto 128); + if (REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SDDMAW_CTRL) = x"00000000") THEN + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS) <= x"FFFFFF0" & '0' & '0' & fifo_fromsdcard_full & fifo_fromsdcard_empty; + else + REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_STATUS) <= x"FFFFFFFF"; + END IF; end if; WHEN others => @@ -1694,7 +1708,8 @@ BEGIN -- copy the output of the XDM_CDC_GRAY macro back in the register file REGISTERS(reg_bank_size*reg_bank_trng_idx + REG_INDEX_TRNG_TIMER) <= trng_timer_counter_fast; - IF ((REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_CTRL)(SD_CTRL_START_IDX) = '1') AND (out_sd_rd_addr_rcv = '0')) THEN + IF ((REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_CTRL)(SD_CTRL_START_IDX) = '1') AND + (out_sd_rd_addr_rcv = '0')) THEN IF (REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_CTRL)(SD_CTRL_READ_IDX) = '1') THEN REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_CTRL)(SD_CTRL_START_IDX) <= '0'; REGISTERS(reg_bank_size*reg_bank_sdcard_idx + REG_INDEX_SD_CTRL)(SD_CTRL_SENT_IDX) <= '1'; @@ -1755,6 +1770,15 @@ BEGIN fast_clk_rst_n <= '0'; AES_RST_COUNTER <= 1; ELSIF RISING_EDGE(fast_100m_clk_out) THEN + LED0 <= sd_LEDs(0); + LED1 <= sd_LEDs(1); + LED2 <= sd_LEDs(2); + LED3 <= sd_LEDs(3); + LED4 <= sd_LEDs(4); + LED5 <= sd_LEDs(5); + LED6 <= sd_LEDs(6); + LED7 <= sd_LEDs(7); + if (AES_RST_COUNTER = 0) THEN fast_clk_rst_n <= '1'; else diff --git a/sbus-to-ztex-gateware/xess_sdcard_wrapper.vhd b/sbus-to-ztex-gateware/xess_sdcard_wrapper.vhd index 20a4839..a2b1e6e 100644 --- a/sbus-to-ztex-gateware/xess_sdcard_wrapper.vhd +++ b/sbus-to-ztex-gateware/xess_sdcard_wrapper.vhd @@ -22,7 +22,9 @@ entity xess_sdcard_wrapper is cs_bo : out std_logic; sclk_o : out std_logic; mosi_o : out std_logic; - miso_i : in std_logic + miso_i : in std_logic; + -- LEDs + leds : out std_logic_vector(7 downto 0) ); end xess_sdcard_wrapper; @@ -113,8 +115,10 @@ begin variable init_done : boolean := false; variable timeout_counter : natural range 0 to 100000 := 0; variable timedout : std_logic_vector(15 downto 0) := x"0000"; - variable byte_counter : natural range 0 to BLOCK_SIZE_G := 0; + variable byte_counter : natural range 0 to BLOCK_SIZE_G := 0; -- fixme, wasteful variable databuf : std_logic_vector(127 downto 0); + variable buf_counter : natural range 0 to 65535 := 0; + variable last_addr : std_logic_vector(31 downto 0); begin -- process xess_sdcard_wrapper IF (xess_sdcard_wrapper_rst = '0') THEN @@ -125,14 +129,19 @@ begin byte_counter := 0; timeout_counter := 100000; init_done := false; + buf_counter := 0; -- end if; ELSIF RISING_EDGE(xess_sdcard_wrapper_clk) then sd_reset <= '0'; output_fifo_wr_en <= '0'; - out_sd_rd_addr_ack <= '0'; + if (out_sd_rd_addr_req = '0') THEN + out_sd_rd_addr_ack <= '0'; + END IF; + -- out_sd_rd_addr_ack <= '0'; case XESS_SDCARD_State IS when XESS_SDCARD_IDLE => + leds <= x"01"; if (out_sd_rd_addr_req ='1') THEN -- handshake --output_fifo_in <= '1' & x"7000" & sd_error & x"00000000000000000000000000000000"; --output_fifo_wr_en <= '1'; @@ -142,7 +151,9 @@ begin --output_fifo_wr_en <= '1'; sd_rd <= '1'; sd_addr <= out_sd_addr; +last_addr := out_sd_addr; byte_counter := 0; + buf_counter := 0; timeout_counter := 100000; XESS_SDCARD_State <= XESS_SDCARD_READ_WAIT_BUSY; END IF; @@ -157,6 +168,7 @@ begin -- end if; when XESS_SDCARD_INIT => + leds <= x"FF"; sd_rd <= '0'; sd_wr <= '0'; sd_continue <= '0'; @@ -182,6 +194,7 @@ output_fifo_wr_en <= '1'; end IF; when XESS_SDCARD_READ_WAIT_BUSY => + leds <= x"02"; IF (sd_busy = '1') THEN --output_fifo_in <= '1' & x"5000" & sd_error & x"00000000000000000000000000000000"; --output_fifo_wr_en <= '1'; @@ -198,6 +211,7 @@ output_fifo_wr_en <= '1'; END IF; when XESS_SDCARD_READ_WAIT_READ => + leds <= x"1F"; --only read byte if we'll have some space to output the buffer IF ((output_fifo_full = '0') AND (sd_hndshk_o = '1')) THEN --output_fifo_in <= '1' & x"40" & sd_data_o & conv_std_logic_vector(byte_counter,16) & x"00000000000000000000000000000000"; @@ -213,13 +227,15 @@ output_fifo_wr_en <= '1'; END IF; when XESS_SDCARD_READ_WAIT_READ2 => + leds <= x"2F"; IF (sd_hndshk_o = '0') THEN --output_fifo_in <= '1' & x"3000" & sd_error & x"00000000000000000000000000000000"; --output_fifo_wr_en <= '1'; sd_hndshk_i <= '0'; IF ((byte_counter mod 16) = 0) THEN - output_fifo_in <= '0' & x"0000" & sd_error & databuf; + output_fifo_in <= '0' & last_addr(15 downto 0) & conv_std_logic_vector(buf_counter,16) & databuf; output_fifo_wr_en <= '1'; + buf_counter := buf_counter + 1; END IF; IF (byte_counter = BLOCK_SIZE_G) THEN timeout_counter := 100000; @@ -230,6 +246,7 @@ output_fifo_wr_en <= '1'; END IF; when XESS_SDCARD_READ_WAIT_NOTBUSY => + leds <= x"04"; IF (sd_busy = '0') THEN XESS_SDCARD_State <= XESS_SDCARD_IDLE; elsif (timeout_counter = 0) then