Tweak command encoding.
authorMalte S. Stretz <mss@apache.org>
Mon, 29 Jun 2009 12:46:50 +0000 (14:46 +0200)
committerMalte S. Stretz <mss@apache.org>
Mon, 29 Jun 2009 12:46:50 +0000 (14:46 +0200)
fhw_sd/sd_commands_p.vhd
fhw_sd/sd_globals_p.vhd

index 07fb43e..bed3dfc 100644 (file)
@@ -13,27 +13,30 @@ library ieee;
 use ieee.std_logic_1164.all;
 
 package sd_commands_p is
-  constant cmd_do_reset_c : std_logic_cmd_t := to_cmd(63);
-  constant arg_do_reset_c : std_logic_arg_t := to_arg(50); -- 1+ ms: 8 SCK (1 byte) @ 400 kHz = 2.5 us * 8 = 20 us
-  
-  constant cmd_do_start_c : std_logic_cmd_t := to_cmd(62);
-  constant arg_do_start_c : std_logic_arg_t := to_arg(10); -- 75+ SCKs (10 byte)
-  
-  constant cmd_do_pipe_c : std_logic_cmd_t := to_cmd(61);
-  constant arg_do_pipe_c : std_logic_arg_t := to_arg(512);
-  
-  constant cmd_do_skip_c : std_logic_cmd_t := to_cmd(60);
-  constant arg_do_skip_c : std_logic_arg_t := to_arg(2); -- CRC16
-  
-  constant cmd_go_idle_state_c : std_logic_cmd_t := to_cmd(0);
+  constant cmd_go_idle_state_c : std_logic_cmd_t := to_std_cmd(0);
   constant arg_go_idle_state_c : std_logic_arg_t := arg_null_c;
   
-  constant cmd_send_op_cond_c : std_logic_cmd_t := to_cmd(1);
+  constant cmd_send_op_cond_c : std_logic_cmd_t := to_std_cmd(1);
   constant arg_send_op_cond_c : std_logic_arg_t := arg_null_c;
   
-  constant cmd_set_blocklen_c : std_logic_cmd_t := to_cmd(16);
+  constant cmd_set_blocklen_c : std_logic_cmd_t := to_std_cmd(16);
   constant arg_set_blocklen_c : std_logic_arg_t := to_arg(512);
   
-  constant cmd_read_single_block_c : std_logic_cmd_t := to_cmd(17);
+  constant cmd_read_single_block_c : std_logic_cmd_t := to_std_cmd(17);
   constant pad_read_single_block_c : std_logic_vector(31 - block_address_width_c downto 0) := (others => '0');
+  
+  constant cmd_do_reset_c : std_logic_cmd_t := to_int_cmd(0, '0');
+  constant arg_do_reset_c : std_logic_arg_t := to_arg(50); -- 1+ ms: 8 SCK (1 byte) @ 400 kHz = 2.5 us * 8 = 20 us
+  
+  constant cmd_do_start_c : std_logic_cmd_t := to_int_cmd(1, '0');
+  constant arg_do_start_c : std_logic_arg_t := to_arg(10); -- 75+ SCKs (10 byte)
+  
+  constant cmd_do_seek_c : std_logic_cmd_t := to_int_cmd(2, '0');
+  constant arg_do_seek_c : std_logic_arg_t := to_arg(50); -- TODO: How many SCKs timeout?
+  
+  constant cmd_do_pipe_c : std_logic_cmd_t := to_int_cmd(15, '1');
+  constant arg_do_pipe_c : std_logic_arg_t := to_arg(512);
+  
+  constant cmd_do_skip_c : std_logic_cmd_t := to_int_cmd(3, '0');
+  constant arg_do_skip_c : std_logic_arg_t := to_arg(2); -- CRC16
 end sd_commands_p;
index e18119e..a91dbcf 100644 (file)
@@ -25,14 +25,18 @@ package sd_globals_p is
   subtype  std_logic_arg_t is std_logic_vector(31 downto 0);
   subtype  std_logic_rsp_t is std_logic_vector(6 downto 0);
   
-  function to_cmd(
-    number : integer range 0 to 63) return std_logic_cmd_t;
-  function to_arg(
-    number : integer range 0 to 65535) return std_logic_arg_t;
-  function get_cmd_type(
-    cmd : std_logic_cmd_t) return std_logic;
   constant cmd_type_std_c : std_logic := '0';
   constant cmd_type_int_c : std_logic := '1';
+  function to_std_cmd(
+    idx : integer range 0 to 31) return std_logic_cmd_t;
+  function to_int_cmd(
+    idx : integer range 0 to 15;
+    shd : std_logic) return std_logic_cmd_t;
+  function get_cmd_type(
+    cmd : std_logic_cmd_t) return std_logic;
+  
+  function to_arg(
+    val : integer range 0 to 65535) return std_logic_arg_t;
   
   subtype  std_logic_frame_t is std_logic_vector(47 downto 0);
   subtype  std_logic_crc7_t  is std_logic_vector(6 downto 0);
@@ -60,16 +64,24 @@ end sd_globals_p;
 
 package body sd_globals_p is
 
-  function to_cmd(
-    number : integer range 0 to 63) return std_logic_cmd_t is
+  function to_std_cmd(
+    idx : integer range 0 to 31) return std_logic_cmd_t is
+  begin
+    return std_logic_vector(to_unsigned(idx, std_logic_cmd_t'length));
+  end to_std_cmd;
+  function to_int_cmd(
+    idx : integer range 0 to 15;
+    shd : std_logic) return std_logic_cmd_t is
+    variable cmd : std_logic_cmd_t;
   begin
-    return std_logic_vector(to_unsigned(number, std_logic_cmd_t'length));
-  end to_cmd;
+    cmd := "1" & shd & std_logic_vector(to_unsigned(idx, std_logic_cmd_t'length - 2));
+    return cmd;
+  end to_int_cmd;
   
   function to_arg(
-    number : integer range 0 to 65535) return std_logic_arg_t is
+    val : integer range 0 to 65535) return std_logic_arg_t is
   begin
-    return std_logic_vector(to_unsigned(number, std_logic_arg_t'length));
+    return std_logic_vector(to_unsigned(val, std_logic_arg_t'length));
   end to_arg;
   
   function get_cmd_type(