mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-29 00:44:13 +01:00
usb gets fast
This commit is contained in:
parent
1c8e7a4765
commit
39c2edbb9a
@ -28,6 +28,7 @@ module cpu_usb (
|
|||||||
logic cpu_tx_write;
|
logic cpu_tx_write;
|
||||||
|
|
||||||
logic usb_enabled;
|
logic usb_enabled;
|
||||||
|
logic tx_force;
|
||||||
|
|
||||||
always_comb begin
|
always_comb begin
|
||||||
dma.rx_empty = rx_empty;
|
dma.rx_empty = rx_empty;
|
||||||
@ -66,6 +67,7 @@ module cpu_usb (
|
|||||||
cpu_tx_write <= 1'b0;
|
cpu_tx_write <= 1'b0;
|
||||||
|
|
||||||
rx_escape_ack <= 1'b0;
|
rx_escape_ack <= 1'b0;
|
||||||
|
tx_force <= 1'b0;
|
||||||
|
|
||||||
if (sys.reset) begin
|
if (sys.reset) begin
|
||||||
usb_enabled <= 1'b0;
|
usb_enabled <= 1'b0;
|
||||||
@ -73,6 +75,9 @@ module cpu_usb (
|
|||||||
if (bus.request) begin
|
if (bus.request) begin
|
||||||
case (bus.address[2:2])
|
case (bus.address[2:2])
|
||||||
2'd0: begin
|
2'd0: begin
|
||||||
|
if (bus.wmask[1]) begin
|
||||||
|
tx_force <= bus.wdata[8];
|
||||||
|
end
|
||||||
if (bus.wmask[0]) begin
|
if (bus.wmask[0]) begin
|
||||||
rx_escape_ack <= bus.wdata[7];
|
rx_escape_ack <= bus.wdata[7];
|
||||||
{usb_enabled, tx_flush, rx_flush} <= bus.wdata[4:2];
|
{usb_enabled, tx_flush, rx_flush} <= bus.wdata[4:2];
|
||||||
@ -95,6 +100,7 @@ module cpu_usb (
|
|||||||
.sys(sys),
|
.sys(sys),
|
||||||
|
|
||||||
.usb_enabled(usb_enabled),
|
.usb_enabled(usb_enabled),
|
||||||
|
.tx_force(tx_force),
|
||||||
|
|
||||||
.usb_clk(usb_clk),
|
.usb_clk(usb_clk),
|
||||||
.usb_cs(usb_cs),
|
.usb_cs(usb_cs),
|
||||||
|
@ -2,6 +2,7 @@ module usb_ft1248 (
|
|||||||
if_system.sys sys,
|
if_system.sys sys,
|
||||||
|
|
||||||
input usb_enabled,
|
input usb_enabled,
|
||||||
|
input tx_force,
|
||||||
|
|
||||||
output usb_clk,
|
output usb_clk,
|
||||||
output usb_cs,
|
output usb_cs,
|
||||||
@ -111,7 +112,8 @@ module usb_ft1248 (
|
|||||||
|
|
||||||
typedef enum bit [7:0] {
|
typedef enum bit [7:0] {
|
||||||
C_WRITE = 8'h00,
|
C_WRITE = 8'h00,
|
||||||
C_READ = 8'h04
|
C_READ = 8'h04,
|
||||||
|
C_FORCE = 8'h80
|
||||||
} e_command;
|
} e_command;
|
||||||
|
|
||||||
typedef enum bit [1:0] {
|
typedef enum bit [1:0] {
|
||||||
@ -134,7 +136,9 @@ module usb_ft1248 (
|
|||||||
logic usb_miosi_output_enable_data;
|
logic usb_miosi_output_enable_data;
|
||||||
logic usb_miso_input;
|
logic usb_miso_input;
|
||||||
|
|
||||||
|
logic tx_force_pending;
|
||||||
logic is_cmd_write;
|
logic is_cmd_write;
|
||||||
|
logic is_cmd_tx_force;
|
||||||
logic [1:0] nibble_counter;
|
logic [1:0] nibble_counter;
|
||||||
logic [7:0] tx_buffer;
|
logic [7:0] tx_buffer;
|
||||||
|
|
||||||
@ -168,7 +172,9 @@ module usb_ft1248 (
|
|||||||
S_COMMAND: begin
|
S_COMMAND: begin
|
||||||
usb_clk_output = clock_phase[P_PRE_FALLING] || clock_phase[P_FALLING];
|
usb_clk_output = clock_phase[P_PRE_FALLING] || clock_phase[P_FALLING];
|
||||||
usb_cs_output = 1'b0;
|
usb_cs_output = 1'b0;
|
||||||
if (is_cmd_write) begin
|
if (is_cmd_tx_force) begin
|
||||||
|
usb_miosi_output_data = nibble_counter[0] ? C_FORCE[3:0] : C_FORCE[7:4];
|
||||||
|
end else if (is_cmd_write) begin
|
||||||
usb_miosi_output_data = nibble_counter[0] ? C_WRITE[3:0] : C_WRITE[7:4];
|
usb_miosi_output_data = nibble_counter[0] ? C_WRITE[3:0] : C_WRITE[7:4];
|
||||||
end else begin
|
end else begin
|
||||||
usb_miosi_output_data = nibble_counter[0] ? C_READ[3:0] : C_READ[7:4];
|
usb_miosi_output_data = nibble_counter[0] ? C_READ[3:0] : C_READ[7:4];
|
||||||
@ -202,12 +208,18 @@ module usb_ft1248 (
|
|||||||
|
|
||||||
if (sys.reset || !usb_enabled) begin
|
if (sys.reset || !usb_enabled) begin
|
||||||
state <= S_TRY_RX;
|
state <= S_TRY_RX;
|
||||||
|
tx_force_pending <= 1'b0;
|
||||||
end else begin
|
end else begin
|
||||||
|
if (tx_force) begin
|
||||||
|
tx_force_pending <= 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
case (state)
|
case (state)
|
||||||
S_TRY_RX: begin
|
S_TRY_RX: begin
|
||||||
if (!rx_full && !rx_escape_valid) begin
|
if (!rx_full && !rx_escape_valid) begin
|
||||||
state <= S_COMMAND;
|
state <= S_COMMAND;
|
||||||
is_cmd_write <= 1'b0;
|
is_cmd_write <= 1'b0;
|
||||||
|
is_cmd_tx_force <= 1'b0;
|
||||||
nibble_counter <= 2'b11;
|
nibble_counter <= 2'b11;
|
||||||
end else begin
|
end else begin
|
||||||
state <= S_TRY_TX;
|
state <= S_TRY_TX;
|
||||||
@ -218,6 +230,13 @@ module usb_ft1248 (
|
|||||||
if (!tx_empty) begin
|
if (!tx_empty) begin
|
||||||
state <= S_COMMAND;
|
state <= S_COMMAND;
|
||||||
is_cmd_write <= 1'b1;
|
is_cmd_write <= 1'b1;
|
||||||
|
is_cmd_tx_force <= 1'b0;
|
||||||
|
nibble_counter <= 2'b11;
|
||||||
|
end else if (tx_force_pending) begin
|
||||||
|
state <= S_COMMAND;
|
||||||
|
tx_force_pending <= 1'b0;
|
||||||
|
is_cmd_write <= 1'b1;
|
||||||
|
is_cmd_tx_force <= 1'b1;
|
||||||
nibble_counter <= 2'b11;
|
nibble_counter <= 2'b11;
|
||||||
end else begin
|
end else begin
|
||||||
state <= S_TRY_RX;
|
state <= S_TRY_RX;
|
||||||
@ -227,7 +246,7 @@ module usb_ft1248 (
|
|||||||
S_COMMAND: begin
|
S_COMMAND: begin
|
||||||
if (clock_phase[P_RISING]) begin
|
if (clock_phase[P_RISING]) begin
|
||||||
if (nibble_counter == 2'd2) begin
|
if (nibble_counter == 2'd2) begin
|
||||||
if (usb_miso_input) begin
|
if (usb_miso_input || is_cmd_tx_force) begin
|
||||||
state <= is_cmd_write ? S_TRY_RX : S_TRY_TX;
|
state <= is_cmd_write ? S_TRY_RX : S_TRY_TX;
|
||||||
end else begin
|
end else begin
|
||||||
state <= S_DATA;
|
state <= S_DATA;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "vr4300.h"
|
#include "vr4300.h"
|
||||||
|
|
||||||
|
|
||||||
#define WATCHDOG_TIMEOUT (1 * (93750000UL / 2))
|
#define WATCHDOG_TIMEOUT (5 * (93750000UL / 2))
|
||||||
|
|
||||||
#define VECTOR_LOCATION (0xA0000000UL)
|
#define VECTOR_LOCATION (0xA0000000UL)
|
||||||
#define VECTOR_SIZE (0x80)
|
#define VECTOR_SIZE (0x80)
|
||||||
|
@ -276,7 +276,7 @@ void exception_fatal_handler (uint32_t exception_code, uint32_t interrupt_mask,
|
|||||||
if (exception_code == EXCEPTION_INTERRUPT) {
|
if (exception_code == EXCEPTION_INTERRUPT) {
|
||||||
if (interrupt_mask & INTERRUPT_MASK_TIMER) {
|
if (interrupt_mask & INTERRUPT_MASK_TIMER) {
|
||||||
exception_disable_watchdog();
|
exception_disable_watchdog();
|
||||||
exception_print("Still loading after 1 second limit...\n\n");
|
exception_print("Still loading after 5 second limit...\n\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (exception_code == EXCEPTION_SYSCALL) {
|
} else if (exception_code == EXCEPTION_SYSCALL) {
|
||||||
|
@ -105,6 +105,7 @@ typedef volatile struct usb_regs {
|
|||||||
#define USB_SCR_PWREN (1 << 5)
|
#define USB_SCR_PWREN (1 << 5)
|
||||||
#define USB_SCR_ESCAPE_PENDING (1 << 6)
|
#define USB_SCR_ESCAPE_PENDING (1 << 6)
|
||||||
#define USB_SCR_ESCAPE_ACK (1 << 7)
|
#define USB_SCR_ESCAPE_ACK (1 << 7)
|
||||||
|
#define USB_SCR_FORCE_TX (1 << 8)
|
||||||
|
|
||||||
|
|
||||||
typedef volatile struct uart_regs {
|
typedef volatile struct uart_regs {
|
||||||
|
@ -252,6 +252,9 @@ void process_usb (void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
p.state = STATE_IDLE;
|
p.state = STATE_IDLE;
|
||||||
|
if (p.cmd == 'L') {
|
||||||
|
USB->SCR |= USB_SCR_FORCE_TX;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
p.state = STATE_RESPONSE;
|
p.state = STATE_RESPONSE;
|
||||||
}
|
}
|
||||||
@ -303,6 +306,7 @@ void process_usb (void) {
|
|||||||
case STATE_RESPONSE:
|
case STATE_RESPONSE:
|
||||||
if (tx_word((p.error ? USB_ERR_TOKEN : USB_CMP_TOKEN) | p.cmd)) {
|
if (tx_word((p.error ? USB_ERR_TOKEN : USB_CMP_TOKEN) | p.cmd)) {
|
||||||
p.state = STATE_IDLE;
|
p.state = STATE_IDLE;
|
||||||
|
USB->SCR |= USB_SCR_FORCE_TX;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -327,6 +331,7 @@ void process_usb (void) {
|
|||||||
}
|
}
|
||||||
p.event_pending = false;
|
p.event_pending = false;
|
||||||
p.state = STATE_IDLE;
|
p.state = STATE_IDLE;
|
||||||
|
USB->SCR |= USB_SCR_FORCE_TX;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user