mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-22 14:09:16 +01:00
general fixes
This commit is contained in:
parent
9dfdcdc631
commit
bce2d29cfa
@ -83,7 +83,7 @@ module n64_cfg (
|
|||||||
REG_DATA_0_L: n64_scb.cfg_rdata[0][15:0] <= reg_bus.wdata;
|
REG_DATA_0_L: n64_scb.cfg_rdata[0][15:0] <= reg_bus.wdata;
|
||||||
REG_DATA_1_H: n64_scb.cfg_rdata[1][31:16] <= reg_bus.wdata;
|
REG_DATA_1_H: n64_scb.cfg_rdata[1][31:16] <= reg_bus.wdata;
|
||||||
REG_DATA_1_L: n64_scb.cfg_rdata[1][15:0] <= reg_bus.wdata;
|
REG_DATA_1_L: n64_scb.cfg_rdata[1][15:0] <= reg_bus.wdata;
|
||||||
REG_VERSION_L: irq <= 1'b0;
|
REG_VERSION_H: irq <= 1'b0;
|
||||||
REG_KEY_H, REG_KEY_L: begin
|
REG_KEY_H, REG_KEY_L: begin
|
||||||
lock_sequence_counter <= lock_sequence_counter + 1'd1;
|
lock_sequence_counter <= lock_sequence_counter + 1'd1;
|
||||||
if (reg_bus.wdata != 16'hFFFF) begin
|
if (reg_bus.wdata != 16'hFFFF) begin
|
||||||
|
@ -5,8 +5,12 @@
|
|||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define BUTTON_COUNTER_TRIGGER_ON (64)
|
||||||
|
#define BUTTON_COUNTER_TRIGGER_OFF (0)
|
||||||
|
|
||||||
|
|
||||||
struct process {
|
struct process {
|
||||||
uint32_t shift;
|
uint8_t counter;
|
||||||
bool state;
|
bool state;
|
||||||
button_mode_t mode;
|
button_mode_t mode;
|
||||||
bool trigger;
|
bool trigger;
|
||||||
@ -36,7 +40,7 @@ button_mode_t button_get_mode (void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void button_init (void) {
|
void button_init (void) {
|
||||||
p.shift = 0x00000000UL;
|
p.counter = 0;
|
||||||
p.state = false;
|
p.state = false;
|
||||||
p.mode = BUTTON_MODE_NONE;
|
p.mode = BUTTON_MODE_NONE;
|
||||||
p.trigger = false;
|
p.trigger = false;
|
||||||
@ -45,15 +49,20 @@ void button_init (void) {
|
|||||||
void button_process (void) {
|
void button_process (void) {
|
||||||
usb_tx_info_t packet_info;
|
usb_tx_info_t packet_info;
|
||||||
uint32_t status = fpga_reg_get(REG_CFG_SCR);
|
uint32_t status = fpga_reg_get(REG_CFG_SCR);
|
||||||
p.shift <<= 1;
|
|
||||||
if (status & CFG_SCR_BUTTON_STATE) {
|
if (status & CFG_SCR_BUTTON_STATE) {
|
||||||
p.shift |= (1 << 0);
|
if (p.counter < BUTTON_COUNTER_TRIGGER_ON) {
|
||||||
|
p.counter += 1;
|
||||||
}
|
}
|
||||||
if (!p.state && p.shift == 0xFFFFFFFFUL) {
|
} else {
|
||||||
|
if (p.counter > BUTTON_COUNTER_TRIGGER_OFF) {
|
||||||
|
p.counter -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!p.state && p.counter == BUTTON_COUNTER_TRIGGER_ON) {
|
||||||
p.state = true;
|
p.state = true;
|
||||||
p.trigger = true;
|
p.trigger = true;
|
||||||
}
|
}
|
||||||
if (p.state && p.shift == 0x00000000UL) {
|
if (p.state && p.counter == BUTTON_COUNTER_TRIGGER_OFF) {
|
||||||
p.state = false;
|
p.state = false;
|
||||||
}
|
}
|
||||||
if (p.trigger) {
|
if (p.trigger) {
|
||||||
|
@ -312,7 +312,7 @@ void cic_reset_parameters (void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void cic_set_parameters (uint32_t *args) {
|
void cic_set_parameters (uint32_t *args) {
|
||||||
cic_disabled = (args[0 >> 24]) & (1 << 1);
|
cic_disabled = (args[0] >> 24) & (1 << 1);
|
||||||
cic_dd_mode = (args[0] >> 24) & (1 << 0);
|
cic_dd_mode = (args[0] >> 24) & (1 << 0);
|
||||||
cic_seed = (args[0] >> 16) & 0xFF;
|
cic_seed = (args[0] >> 16) & 0xFF;
|
||||||
cic_checksum[0] = (args[0] >> 8) & 0xFF;
|
cic_checksum[0] = (args[0] >> 8) & 0xFF;
|
||||||
|
@ -44,8 +44,8 @@ void flashram_process (void) {
|
|||||||
uint8_t buffer[FLASHRAM_PAGE_SIZE];
|
uint8_t buffer[FLASHRAM_PAGE_SIZE];
|
||||||
uint32_t address = FLASHRAM_ADDRESS;
|
uint32_t address = FLASHRAM_ADDRESS;
|
||||||
uint32_t erase_size = (op == OP_ERASE_SECTOR) ? FLASHRAM_SECTOR_SIZE : FLASHRAM_SIZE;
|
uint32_t erase_size = (op == OP_ERASE_SECTOR) ? FLASHRAM_SECTOR_SIZE : FLASHRAM_SIZE;
|
||||||
uint32_t sector = (op != OP_ERASE_ALL) ? ((scr & FLASHRAM_SCR_PAGE_MASK) >> FLASHRAM_SCR_PAGE_BIT) : 0;
|
uint32_t page = (op != OP_ERASE_ALL) ? ((scr & FLASHRAM_SCR_PAGE_MASK) >> FLASHRAM_SCR_PAGE_BIT) : 0;
|
||||||
address += sector * FLASHRAM_PAGE_SIZE;
|
address += page * FLASHRAM_PAGE_SIZE;
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case OP_ERASE_ALL:
|
case OP_ERASE_ALL:
|
||||||
|
@ -4,89 +4,85 @@
|
|||||||
#include "task.h"
|
#include "task.h"
|
||||||
|
|
||||||
|
|
||||||
#define LED_TICKRATE_MS (10)
|
#define LED_MS_PER_TICK (10)
|
||||||
#define LED_CYCLE_TICKS_PERIOD (10)
|
#define LED_ERROR_TICKS_PERIOD (50)
|
||||||
#define LED_CYCLE_TICKS_ON (3)
|
#define LED_ERROR_TICKS_ON (25)
|
||||||
|
#define LED_ACT_TICKS_PERIOD (15)
|
||||||
|
#define LED_ACT_TICKS_ON (6)
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
static bool error_mode = false;
|
||||||
ON,
|
static uint32_t error_timer = 0;
|
||||||
OFF
|
|
||||||
} led_state_e;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t timer;
|
|
||||||
led_state_e state;
|
|
||||||
} error_cycle_t;
|
|
||||||
|
|
||||||
|
|
||||||
static uint32_t timer = 0;
|
|
||||||
static uint8_t error_cycle = 0;
|
|
||||||
static uint32_t current_act_counter = 0;
|
|
||||||
static volatile uint32_t next_act_counter = 0;
|
|
||||||
static volatile bool cic_error = false;
|
static volatile bool cic_error = false;
|
||||||
static volatile bool rtc_error = false;
|
static volatile bool rtc_error = false;
|
||||||
static const error_cycle_t error_codes[2][8] = {
|
|
||||||
{ { 50, ON }, { 50, OFF }, { 5, ON }, { 0, OFF }, { 0, OFF }, { 0, OFF }, { 0, OFF }, { 100, OFF } },
|
static uint32_t act_timer = 0;
|
||||||
{ { 50, ON }, { 50, OFF }, { 5, ON }, { 20, OFF }, { 5, ON }, { 0, OFF }, { 0, OFF }, { 100, OFF } },
|
static uint32_t current_act_counter = 0;
|
||||||
};
|
static volatile uint32_t next_act_counter = 0;
|
||||||
|
|
||||||
|
|
||||||
static void led_task_resume (void) {
|
static void led_task_resume (void) {
|
||||||
task_set_ready(TASK_ID_LED);
|
task_set_ready(TASK_ID_LED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool led_has_errors (void) {
|
static void led_update_error_mode (void) {
|
||||||
return (cic_error | rtc_error);
|
if (error_mode) {
|
||||||
}
|
if (!(cic_error || rtc_error)) {
|
||||||
|
error_mode = false;
|
||||||
static void led_process_act (void) {
|
act_timer = 0;
|
||||||
if (timer > 0) {
|
|
||||||
timer -= 1;
|
|
||||||
uint32_t cycle = ((LED_CYCLE_TICKS_PERIOD - 1) - (timer % LED_CYCLE_TICKS_PERIOD));
|
|
||||||
if (cycle < LED_CYCLE_TICKS_ON) {
|
|
||||||
hw_gpio_set(GPIO_ID_LED);
|
|
||||||
} else {
|
|
||||||
hw_gpio_reset(GPIO_ID_LED);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (current_act_counter != next_act_counter) {
|
if (cic_error || rtc_error) {
|
||||||
current_act_counter = next_act_counter;
|
error_mode = true;
|
||||||
timer = LED_CYCLE_TICKS_PERIOD;
|
error_timer = 0;
|
||||||
} else {
|
|
||||||
hw_gpio_reset(GPIO_ID_LED);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void led_process_errors (void) {
|
static void led_process_errors (void) {
|
||||||
if (timer > 0) {
|
if (error_timer == 0) {
|
||||||
timer -= 1;
|
error_timer = LED_ERROR_TICKS_PERIOD;
|
||||||
} else {
|
|
||||||
uint8_t error_code = 0;
|
|
||||||
if (cic_error) {
|
if (cic_error) {
|
||||||
error_code = 0;
|
error_timer *= 1;
|
||||||
} else if (rtc_error) {
|
} else if (rtc_error) {
|
||||||
error_code = 1;
|
error_timer *= 2;
|
||||||
}
|
}
|
||||||
error_cycle_t error = error_codes[error_code][error_cycle];
|
error_timer += LED_ERROR_TICKS_PERIOD;
|
||||||
timer = error.timer;
|
}
|
||||||
if (error.state == ON) {
|
|
||||||
|
if (error_timer > 0) {
|
||||||
|
error_timer -= 1;
|
||||||
|
if (error_timer >= LED_ERROR_TICKS_PERIOD) {
|
||||||
|
uint32_t error_cycle = (error_timer % LED_ERROR_TICKS_PERIOD);
|
||||||
|
if (error_cycle == LED_ERROR_TICKS_ON) {
|
||||||
hw_gpio_set(GPIO_ID_LED);
|
hw_gpio_set(GPIO_ID_LED);
|
||||||
} else {
|
}
|
||||||
|
if (error_cycle == 0) {
|
||||||
hw_gpio_reset(GPIO_ID_LED);
|
hw_gpio_reset(GPIO_ID_LED);
|
||||||
}
|
}
|
||||||
error_cycle += 1;
|
|
||||||
if (error_cycle >= 8) {
|
|
||||||
error_cycle = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void led_process_act (void) {
|
||||||
void led_blink_act (void) {
|
if (act_timer == 0) {
|
||||||
next_act_counter += 1;
|
if (current_act_counter != next_act_counter) {
|
||||||
|
current_act_counter = next_act_counter;
|
||||||
|
act_timer = LED_ACT_TICKS_PERIOD;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (act_timer > 0) {
|
||||||
|
act_timer -= 1;
|
||||||
|
if (act_timer == LED_ACT_TICKS_ON) {
|
||||||
|
hw_gpio_set(GPIO_ID_LED);
|
||||||
|
}
|
||||||
|
if (act_timer == 0) {
|
||||||
|
hw_gpio_reset(GPIO_ID_LED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void led_blink_error (led_error_t error) {
|
void led_blink_error (led_error_t error) {
|
||||||
switch (error) {
|
switch (error) {
|
||||||
@ -110,14 +106,19 @@ void led_clear_error (led_error_t error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void led_blink_act (void) {
|
||||||
|
next_act_counter += 1;
|
||||||
|
}
|
||||||
|
|
||||||
void led_task (void) {
|
void led_task (void) {
|
||||||
while (1) {
|
while (1) {
|
||||||
hw_tim_setup(TIM_ID_LED, LED_TICKRATE_MS, led_task_resume);
|
hw_tim_setup(TIM_ID_LED, LED_MS_PER_TICK, led_task_resume);
|
||||||
|
|
||||||
if (led_has_errors()) {
|
led_update_error_mode();
|
||||||
|
|
||||||
|
if (error_mode) {
|
||||||
led_process_errors();
|
led_process_errors();
|
||||||
} else {
|
} else {
|
||||||
error_cycle = 0;
|
|
||||||
led_process_act();
|
led_process_act();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,9 +8,9 @@ typedef enum {
|
|||||||
} led_error_t;
|
} led_error_t;
|
||||||
|
|
||||||
|
|
||||||
void led_blink_act (void);
|
|
||||||
void led_blink_error (led_error_t error);
|
void led_blink_error (led_error_t error);
|
||||||
void led_clear_error (led_error_t error);
|
void led_clear_error (led_error_t error);
|
||||||
|
void led_blink_act (void);
|
||||||
void led_task (void);
|
void led_task (void);
|
||||||
|
|
||||||
|
|
||||||
|
@ -315,6 +315,7 @@ class SC64:
|
|||||||
HEADER = 3
|
HEADER = 3
|
||||||
SCREENSHOT = 4
|
SCREENSHOT = 4
|
||||||
|
|
||||||
|
__isv_line_buffer: bytes = b''
|
||||||
__debug_header: Optional[bytes] = None
|
__debug_header: Optional[bytes] = None
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
@ -558,7 +559,10 @@ class SC64:
|
|||||||
self.__dd_set_block_ready(1)
|
self.__dd_set_block_ready(1)
|
||||||
|
|
||||||
def __handle_isv_packet(self, data: bytes) -> None:
|
def __handle_isv_packet(self, data: bytes) -> None:
|
||||||
print(data.decode('EUC-JP', errors='backslashreplace'), end='')
|
self.__isv_line_buffer += data
|
||||||
|
while (b'\n' in self.__isv_line_buffer):
|
||||||
|
(line, self.__isv_line_buffer) = self.__isv_line_buffer.split(b'\n', 1)
|
||||||
|
print(line.decode('EUC-JP', errors='backslashreplace'))
|
||||||
|
|
||||||
def __handle_usb_packet(self, data: bytes) -> None:
|
def __handle_usb_packet(self, data: bytes) -> None:
|
||||||
header = self.__get_int(data[0:4])
|
header = self.__get_int(data[0:4])
|
||||||
|
Loading…
Reference in New Issue
Block a user