diff --git a/common/mist/mist.vhd b/common/mist/mist.vhd index 99db01c4..38fa2924 100644 --- a/common/mist/mist.vhd +++ b/common/mist/mist.vhd @@ -12,7 +12,11 @@ use IEEE.numeric_std.all; package mist is component user_io -generic(STRLEN : integer := 0 ); +generic( + STRLEN : integer := 0; + PS2DIV : integer := 100; + ROM_DIRECT_UPLOAD : boolean := false +); port ( clk_sys : in std_logic; clk_sd : in std_logic := '0'; @@ -35,14 +39,14 @@ port ( core_mod : out std_logic_vector(6 downto 0); sd_lba : in std_logic_vector(31 downto 0) := (others => '0'); - sd_rd : in std_logic := '0'; - sd_wr : in std_logic := '0'; + sd_rd : in std_logic_vector(1 downto 0) := (others => '0'); + sd_wr : in std_logic_vector(1 downto 0) := (others => '0'); sd_ack : out std_logic; sd_ack_conf : out std_logic; sd_conf : in std_logic := '0'; sd_sdhc : in std_logic := '1'; img_size : out std_logic_vector(31 downto 0); - img_mounted : out std_logic; + img_mounted : out std_logic_vector(1 downto 0); sd_buff_addr : out std_logic_vector(8 downto 0); sd_dout : out std_logic_vector(7 downto 0); @@ -61,8 +65,10 @@ port ( ps2_mouse_data : out std_logic; mouse_x : out signed(8 downto 0); mouse_y : out signed(8 downto 0); + mouse_z : out signed(3 downto 0); mouse_flags : out std_logic_vector(7 downto 0); -- YOvfl, XOvfl, dy8, dx8, 1, mbtn, rbtn, lbtn - mouse_strobe : out std_logic + mouse_strobe : out std_logic; + mouse_idx : out std_logic ); end component user_io; @@ -72,7 +78,9 @@ generic ( OSD_X_OFFSET : std_logic_vector(9 downto 0) := (others => '0'); OSD_Y_OFFSET : std_logic_vector(9 downto 0) := (others => '0'); SD_HCNT_WIDTH: integer := 9; - COLOR_DEPTH : integer := 6 + COLOR_DEPTH : integer := 6; + OSD_AUTO_CE : boolean := true; + SYNC_AND : boolean := false ); port ( clk_sys : in std_logic; diff --git a/common/mist/user_io.v b/common/mist/user_io.v index 0969900b..67dcfed4 100644 --- a/common/mist/user_io.v +++ b/common/mist/user_io.v @@ -52,8 +52,8 @@ module user_io #(parameter STRLEN=0, parameter PS2DIV=100, parameter ROM_DIRECT_ // connection to sd card emulation input [31:0] sd_lba, - input sd_rd, - input sd_wr, + input [1:0] sd_rd, + input [1:0] sd_wr, output reg sd_ack, output reg sd_ack_conf, input sd_conf, @@ -64,7 +64,7 @@ module user_io #(parameter STRLEN=0, parameter PS2DIV=100, parameter ROM_DIRECT_ output reg sd_din_strobe, output reg [8:0] sd_buff_addr, - output reg img_mounted, //rising edge if a new image is mounted + output reg [1:0] img_mounted, // rising edge if a new image is mounted output reg [31:0] img_size, // size of image in bytes // ps2 keyboard/mouse emulation @@ -82,8 +82,10 @@ module user_io #(parameter STRLEN=0, parameter PS2DIV=100, parameter ROM_DIRECT_ // mouse data output reg [8:0] mouse_x, output reg [8:0] mouse_y, + output reg [3:0] mouse_z, output reg [7:0] mouse_flags, // YOvfl, XOvfl, dy8, dx8, 1, mbtn, rbtn, lbtn output reg mouse_strobe, // mouse data is valid on mouse_strobe + output reg mouse_idx, // which mouse? // serial com port input [7:0] serial_data, @@ -109,8 +111,9 @@ assign conf_addr = byte_cnt; // bit 4 indicates ROM direct upload capability wire [7:0] core_type = ROM_DIRECT_UPLOAD ? 8'hb4 : 8'ha4; +wire drive_sel = sd_rd[1] | sd_wr[1]; // command byte read by the io controller -wire [7:0] sd_cmd = { 4'h5, sd_conf, sd_sdhc, sd_wr, sd_rd }; +wire [7:0] sd_cmd = { 4'h6, sd_conf, sd_sdhc, sd_wr[drive_sel], sd_rd[drive_sel] }; wire spi_sck = SPI_CLK; @@ -328,6 +331,7 @@ end always@(posedge spi_sck or posedge SPI_SS_IO) begin reg [31:0] sd_lba_r; + reg [7:0] drive_sel_r; if(SPI_SS_IO == 1) begin spi_byte_out <= core_type; @@ -346,8 +350,10 @@ always@(posedge spi_sck or posedge SPI_SS_IO) begin 8'h16: if(byte_cnt == 0) begin spi_byte_out <= sd_cmd; sd_lba_r <= sd_lba; - end - else if(byte_cnt < 5) spi_byte_out <= sd_lba_r[(4-byte_cnt)<<3 +:8]; + drive_sel_r <= {7'b0, drive_sel}; + end + else if(byte_cnt == 1) spi_byte_out <= drive_sel_r; + else if(byte_cnt < 6) spi_byte_out <= sd_lba_r[(5-byte_cnt)<<3 +:8]; // reading sd card write data 8'h18: spi_byte_out <= sd_din; @@ -397,6 +403,7 @@ always @(posedge clk_sys) begin reg [7:0] mouse_flags_r; reg [7:0] mouse_x_r; + reg [7:0] mouse_y_r; reg key_pressed_r; reg key_extended_r; @@ -428,18 +435,24 @@ always @(posedge clk_sys) begin 8'h62: if (abyte_cnt < 5) joystick_2[(abyte_cnt-1)<<3 +:8] <= spi_byte_in; 8'h63: if (abyte_cnt < 5) joystick_3[(abyte_cnt-1)<<3 +:8] <= spi_byte_in; 8'h64: if (abyte_cnt < 5) joystick_4[(abyte_cnt-1)<<3 +:8] <= spi_byte_in; - 8'h04: begin + 8'h70,8'h71: begin // store incoming ps2 mouse bytes - ps2_mouse_fifo[ps2_mouse_wptr] <= spi_byte_in; - ps2_mouse_wptr <= ps2_mouse_wptr + 1'd1; + if (~acmd[0]) begin + // PS2 serial protocol for the first mouse only + ps2_mouse_fifo[ps2_mouse_wptr] <= spi_byte_in; + ps2_mouse_wptr <= ps2_mouse_wptr + 1'd1; + end if (abyte_cnt == 1) mouse_flags_r <= spi_byte_in; else if (abyte_cnt == 2) mouse_x_r <= spi_byte_in; - else if (abyte_cnt == 3) begin + else if (abyte_cnt == 3) mouse_y_r <= spi_byte_in; + else if (abyte_cnt == 4) begin // flags: YOvfl, XOvfl, dy8, dx8, 1, mbtn, rbtn, lbtn mouse_flags <= mouse_flags_r; mouse_x <= { mouse_flags_r[4], mouse_x_r }; - mouse_y <= { mouse_flags_r[5], spi_byte_in }; + mouse_y <= { mouse_flags_r[5], mouse_y_r }; + mouse_z <= spi_byte_in[3:0]; mouse_strobe <= 1; + mouse_idx <= acmd[0]; end end 8'h05: begin @@ -500,7 +513,7 @@ always @(posedge clk_sd) begin reg spi_transfer_end; reg spi_receiver_strobeD; reg spi_transfer_endD; - reg sd_wrD; + reg [1:0] sd_wrD; reg [7:0] acmd; reg [7:0] abyte_cnt; // counts bytes @@ -518,7 +531,7 @@ always @(posedge clk_sd) begin sd_din_strobe<= 0; sd_wrD <= sd_wr; // fetch the first byte immediately after the write command seen - if (~sd_wrD & sd_wr) begin + if ((~sd_wrD[0] & sd_wr[0]) || (~sd_wrD[1] & sd_wrD[1])) begin sd_buff_addr <= 0; sd_din_strobe <= 1; end @@ -560,8 +573,10 @@ always @(posedge clk_sd) begin // send sector FPGA -> IO 8'h18: begin - sd_din_strobe <= 1'b1; - if(~&sd_buff_addr) sd_buff_addr <= sd_buff_addr + 1'b1; + if(~&sd_buff_addr) begin + sd_din_strobe <= 1'b1; + sd_buff_addr <= sd_buff_addr + 1'b1; + end end // send SD config IO -> FPGA @@ -572,7 +587,7 @@ always @(posedge clk_sd) begin sd_dout <= spi_byte_in; end - 8'h1c: img_mounted <= 1; + 8'h1c: img_mounted[spi_byte_in[0]] <= 1; // send image info 8'h1d: if(abyte_cnt<5) img_size[(abyte_cnt-1)<<3 +:8] <= spi_byte_in;