fix sdcard read (cleanup needed)
This commit is contained in:
parent
fa4bd69388
commit
99e613497d
@ -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);
|
||||
|
||||
@ -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 */
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user