forked from Mirrors/usk
70 lines
No EOL
2 KiB
C
70 lines
No EOL
2 KiB
C
#include "hardware/clocks.h"
|
|
#include "hardware/gpio.h"
|
|
#include "hardware/pio.h"
|
|
#include "pins.h"
|
|
#include "pico/stdlib.h"
|
|
#include "glitch.h"
|
|
#include "misc.h"
|
|
#include "fuses.h"
|
|
|
|
bool mariko = true;
|
|
bool board_detected = false;
|
|
|
|
bool wait_for_boot(int timeout_ms) {
|
|
absolute_time_t tio_full = make_timeout_time_ms(timeout_ms);
|
|
absolute_time_t tio_cmd1 = tio_full;
|
|
init_glitch_pio();
|
|
reset_cpu();
|
|
uint32_t word=0, last_word=0;
|
|
bool was_read_zero = false;
|
|
bool was_cmd1 = false;
|
|
int reset_attempts = 0;
|
|
|
|
while(!time_reached(tio_full)) {
|
|
if (time_reached(tio_cmd1))
|
|
{
|
|
if (reset_attempts > 4)
|
|
{
|
|
halt_with_error(0, 3);
|
|
}
|
|
reset_attempts++;
|
|
reset_cpu();
|
|
tio_cmd1 = tio_full;
|
|
}
|
|
if(!pio_sm_is_rx_fifo_empty(pio1, 0))
|
|
{
|
|
word = pio_sm_get(pio1, 0);
|
|
if (last_word == 0x41000000 && word == 0x00F9) // cmd1 request
|
|
{
|
|
tio_cmd1 = make_timeout_time_ms(20);
|
|
was_cmd1 = true;
|
|
}
|
|
else if (last_word == 0x00F9 && (word >> 24) == 0x3F) // cmd1 responce
|
|
{
|
|
tio_cmd1 = tio_full;
|
|
}
|
|
else if (last_word == 0x51000000 && word == 0x0055) //read block 0
|
|
{
|
|
tio_full = make_timeout_time_ms(100);
|
|
was_read_zero = true;
|
|
} else if (was_read_zero && last_word == 0x4D000200 && word == 0x00B1) // read status - erista only
|
|
{
|
|
mariko = false;
|
|
} else if (last_word == 0x51000000 && word == 0x0147) // read block 1, can finish now
|
|
{
|
|
deinit_glitch_pio();
|
|
return true;
|
|
}
|
|
last_word = word;
|
|
}
|
|
}
|
|
if (was_read_zero) {
|
|
halt_with_error(1, 3);
|
|
}
|
|
else if (was_cmd1) {
|
|
halt_with_error(2, 3);
|
|
} else {
|
|
halt_with_error(3, 3);
|
|
}
|
|
return false;
|
|
} |