1
0
mirror of synced 2026-01-18 08:52:45 +00:00

fix sdcard read (cleanup needed)

This commit is contained in:
Romain Dolbeau 2021-01-10 13:13:04 -05:00
parent fa4bd69388
commit 99e613497d
4 changed files with 66 additions and 15 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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

View File

@ -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