Line 1... |
Line 1... |
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
--
|
--
|
-- SD/MMC Bootloader
|
-- SD/MMC Bootloader
|
--
|
--
|
-- $Id: spi_boot.vhd,v 1.3 2005-02-16 18:59:10 arniml Exp $
|
-- $Id: spi_boot.vhd,v 1.4 2005-02-18 06:42:08 arniml Exp $
|
--
|
--
|
-- Copyright (c) 2005, Arnim Laeuger (arniml@opencores.org)
|
-- Copyright (c) 2005, Arnim Laeuger (arniml@opencores.org)
|
--
|
--
|
-- All rights reserved, see COPYING.
|
-- All rights reserved, see COPYING.
|
--
|
--
|
Line 50... |
Line 50... |
entity spi_boot is
|
entity spi_boot is
|
|
|
generic (
|
generic (
|
-- width of bit counter: minimum 6, maximum 12
|
-- width of bit counter: minimum 6, maximum 12
|
width_bit_cnt_g : integer := 6;
|
width_bit_cnt_g : integer := 6;
|
-- width of set counter: minimum 0, maximum n
|
-- width of image counter: minimum 0, maximum n
|
width_set_cnt_g : integer := 2;
|
width_img_cnt_g : integer := 2;
|
-- number of bits required to address one set
|
-- number of bits required to address one image
|
num_bits_per_set_g : integer := 18;
|
num_bits_per_img_g : integer := 18;
|
-- SD specific initialization
|
-- SD specific initialization
|
sd_init_g : integer := 0;
|
sd_init_g : integer := 0;
|
-- clock divider to reach 400 kHz for MMC compatibility
|
-- clock divider to reach 400 kHz for MMC compatibility
|
mmc_compat_clk_div_g : integer := 0;
|
mmc_compat_clk_div_g : integer := 0;
|
width_mmc_clk_div_g : integer := 0;
|
width_mmc_clk_div_g : integer := 0;
|
Line 121... |
Line 121... |
CMD16,
|
CMD16,
|
WAIT_START,
|
WAIT_START,
|
WAIT_INIT_LOW, WAIT_INIT_HIGH,
|
WAIT_INIT_LOW, WAIT_INIT_HIGH,
|
CMD18, CMD18_DATA,
|
CMD18, CMD18_DATA,
|
CMD12,
|
CMD12,
|
INC_SET_CNT);
|
INC_IMG_CNT);
|
--
|
--
|
signal ctrl_fsm_q,
|
signal ctrl_fsm_q,
|
ctrl_fsm_s : ctrl_states_t;
|
ctrl_fsm_s : ctrl_states_t;
|
--
|
--
|
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
Line 158... |
Line 158... |
|
|
signal cfg_clk_q : std_logic;
|
signal cfg_clk_q : std_logic;
|
|
|
signal start_q : std_logic;
|
signal start_q : std_logic;
|
|
|
signal set_cnt_s : std_logic_vector(width_set_cnt_g downto 0);
|
signal img_cnt_s : std_logic_vector(width_img_cnt_g downto 0);
|
signal cnt_en_set_s : boolean;
|
signal cnt_en_img_s : boolean;
|
signal mmc_cnt_ovfl_s : boolean;
|
signal mmc_cnt_ovfl_s : boolean;
|
signal mmc_compat_s : boolean;
|
signal mmc_compat_s : boolean;
|
|
|
signal cmd_finished_s : boolean;
|
signal cmd_finished_s : boolean;
|
|
|
Line 456... |
Line 456... |
|
|
begin
|
begin
|
-- default assignments
|
-- default assignments
|
ctrl_fsm_s <= POWER_UP1;
|
ctrl_fsm_s <= POWER_UP1;
|
config_n_o <= '1';
|
config_n_o <= '1';
|
cnt_en_set_s <= false;
|
cnt_en_img_s <= false;
|
spi_cs_n_s <= '0';
|
spi_cs_n_s <= '0';
|
mmc_compat_v := false;
|
mmc_compat_v := false;
|
en_outs_s <= true;
|
en_outs_s <= true;
|
|
|
case ctrl_fsm_q is
|
case ctrl_fsm_q is
|
Line 626... |
Line 626... |
|
|
|
|
-- Issued CMD12: STOP_TRANSMISSION --------------------------------------
|
-- Issued CMD12: STOP_TRANSMISSION --------------------------------------
|
when CMD12 =>
|
when CMD12 =>
|
if cmd_finished_s then
|
if cmd_finished_s then
|
ctrl_fsm_s <= INC_SET_CNT;
|
ctrl_fsm_s <= INC_IMG_CNT;
|
else
|
else
|
ctrl_fsm_s <= CMD12;
|
ctrl_fsm_s <= CMD12;
|
end if;
|
end if;
|
|
|
|
|
-- Increment Set Counter ------------------------------------------------
|
-- Increment Image Counter ----------------------------------------------
|
when INC_SET_CNT =>
|
when INC_IMG_CNT =>
|
spi_cs_n_s <= '1';
|
spi_cs_n_s <= '1';
|
ctrl_fsm_s <= WAIT_START;
|
ctrl_fsm_s <= WAIT_START;
|
cnt_en_set_s <= true;
|
cnt_en_img_s <= true;
|
|
|
|
|
|
|
when others =>
|
when others =>
|
null;
|
null;
|
Line 793... |
Line 793... |
-- * Reduces logic.
|
-- * Reduces logic.
|
--
|
--
|
transmit: process (ctrl_fsm_q,
|
transmit: process (ctrl_fsm_q,
|
cmd_fsm_q,
|
cmd_fsm_q,
|
bit_cnt_q,
|
bit_cnt_q,
|
set_cnt_s,
|
img_cnt_s,
|
send_cmd12_q,
|
send_cmd12_q,
|
upper_bitcnt_zero_s)
|
upper_bitcnt_zero_s)
|
|
|
subtype cmd_r is natural range 47 downto 0;
|
subtype cmd_r is natural range 47 downto 0;
|
subtype cmd_t is std_logic_vector(cmd_r);
|
subtype cmd_t is std_logic_vector(cmd_r);
|
Line 832... |
Line 832... |
cmd_v(cmd_r) := cmd16_c;
|
cmd_v(cmd_r) := cmd16_c;
|
cmd_v(8 + width_bit_cnt_g-3) := '1';
|
cmd_v(8 + width_bit_cnt_g-3) := '1';
|
tx_v := true;
|
tx_v := true;
|
when CMD18 =>
|
when CMD18 =>
|
cmd_v(cmd_r) := cmd18_c;
|
cmd_v(cmd_r) := cmd18_c;
|
cmd_v(8 + num_bits_per_set_g + width_set_cnt_g downto 8 + num_bits_per_set_g)
|
cmd_v(8 + num_bits_per_img_g + width_img_cnt_g downto 8 + num_bits_per_img_g)
|
:= set_cnt_s;
|
:= img_cnt_s;
|
tx_v := true;
|
tx_v := true;
|
when CMD18_DATA =>
|
when CMD18_DATA =>
|
cmd_v(cmd_r) := cmd12_c;
|
cmd_v(cmd_r) := cmd12_c;
|
|
|
if send_cmd12_q and upper_bitcnt_zero_s then
|
if send_cmd12_q and upper_bitcnt_zero_s then
|
Line 863... |
Line 863... |
--
|
--
|
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
|
|
|
|
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
-- Optional Set Counter
|
-- Optional Image Counter
|
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
set_cnt: if width_set_cnt_g > 0 generate
|
img_cnt: if width_img_cnt_g > 0 generate
|
set_cnt_b : spi_counter
|
img_cnt_b : spi_counter
|
generic map (
|
generic map (
|
cnt_width_g => width_set_cnt_g,
|
cnt_width_g => width_img_cnt_g,
|
cnt_max_g => 2**width_set_cnt_g - 1,
|
cnt_max_g => 2**width_img_cnt_g - 1,
|
reset_level_g => reset_level_g
|
reset_level_g => reset_level_g
|
)
|
)
|
port map (
|
port map (
|
clk_i => clk_i,
|
clk_i => clk_i,
|
reset_i => reset_i,
|
reset_i => reset_i,
|
cnt_en_i => cnt_en_set_s,
|
cnt_en_i => cnt_en_img_s,
|
cnt_o => set_cnt_s(width_set_cnt_g-1 downto 0),
|
cnt_o => img_cnt_s(width_img_cnt_g-1 downto 0),
|
cnt_ovfl_o => open
|
cnt_ovfl_o => open
|
);
|
);
|
set_cnt_s(width_set_cnt_g) <= '0';
|
img_cnt_s(width_img_cnt_g) <= '0';
|
end generate;
|
end generate;
|
|
|
no_set_cnt: if width_set_cnt_g = 0 generate
|
no_img_cnt: if width_img_cnt_g = 0 generate
|
set_cnt_s <= (others => '0');
|
img_cnt_s <= (others => '0');
|
end generate;
|
end generate;
|
|
|
|
|
-----------------------------------------------------------------------------
|
-----------------------------------------------------------------------------
|
-- Optional MMC compatibility counter
|
-- Optional MMC compatibility counter
|
Line 930... |
Line 930... |
|
|
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
-- File History:
|
-- File History:
|
--
|
--
|
-- $Log: not supported by cvs2svn $
|
-- $Log: not supported by cvs2svn $
|
|
-- Revision 1.3 2005/02/16 18:59:10 arniml
|
|
-- include output enable control for SPI outputs
|
|
--
|
-- Revision 1.2 2005/02/13 17:25:51 arniml
|
-- Revision 1.2 2005/02/13 17:25:51 arniml
|
-- major update to fix several problems
|
-- major update to fix several problems
|
-- configuration/data download of multiple sets works now
|
-- configuration/data download of multiple sets works now
|
--
|
--
|
-- Revision 1.1 2005/02/08 20:41:33 arniml
|
-- Revision 1.1 2005/02/08 20:41:33 arniml
|