Improve PicoSoC demo firmware
This commit is contained in:
parent
cfd4933272
commit
797c21e95c
|
@ -5,23 +5,101 @@
|
|||
#define reg_uart_data (*(volatile uint32_t*)0x02000008)
|
||||
#define reg_leds (*(volatile uint32_t*)0x03000000)
|
||||
|
||||
void print(const char *p)
|
||||
{
|
||||
while (*p) {
|
||||
if (*p == '\n')
|
||||
reg_uart_data = '\r';
|
||||
reg_uart_data = *(p++);
|
||||
}
|
||||
}
|
||||
|
||||
char getchar_prompt(char *prompt)
|
||||
{
|
||||
int32_t c = -1;
|
||||
|
||||
uint32_t cycles_begin, cycles_now, cycles;
|
||||
__asm__ volatile ("rdcycle %0" : "=r"(cycles_begin));
|
||||
|
||||
if (prompt)
|
||||
print(prompt);
|
||||
|
||||
reg_leds = ~0;
|
||||
while (c == -1) {
|
||||
__asm__ volatile ("rdcycle %0" : "=r"(cycles_now));
|
||||
cycles = cycles_now - cycles_begin;
|
||||
if (cycles > 12000000) {
|
||||
if (prompt)
|
||||
print(prompt);
|
||||
cycles_begin = cycles_now;
|
||||
reg_leds = ~reg_leds;
|
||||
}
|
||||
c = reg_uart_data;
|
||||
}
|
||||
reg_leds = 0;
|
||||
return c;
|
||||
}
|
||||
|
||||
char getchar()
|
||||
{
|
||||
return getchar_prompt(0);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
extern uint32_t cmd_read_spi_flash_id_worker_begin;
|
||||
extern uint32_t cmd_read_spi_flash_id_worker_end;
|
||||
|
||||
void cmd_read_spi_flash_id()
|
||||
{
|
||||
uint32_t *src_ptr = &cmd_read_spi_flash_id_worker_begin;
|
||||
uint32_t *dst_ptr = (uint32_t*)0;
|
||||
|
||||
while (src_ptr != &cmd_read_spi_flash_id_worker_end)
|
||||
*(dst_ptr++) = *(src_ptr++);
|
||||
|
||||
((void(*)())0)();
|
||||
}
|
||||
|
||||
// --------------------------------------------------------
|
||||
|
||||
void main()
|
||||
{
|
||||
reg_uart_clkdiv = 104;
|
||||
reg_leds = 1;
|
||||
reg_uart_data = 'H';
|
||||
reg_leds = 2;
|
||||
reg_uart_data = 'e';
|
||||
reg_leds = 3;
|
||||
reg_uart_data = 'l';
|
||||
reg_leds = 4;
|
||||
reg_uart_data = 'l';
|
||||
reg_leds = 5;
|
||||
reg_uart_data = 'o';
|
||||
reg_leds = 6;
|
||||
reg_uart_data = '\r';
|
||||
reg_leds = 7;
|
||||
reg_uart_data = '\n';
|
||||
reg_leds = 8;
|
||||
while (getchar_prompt("Press ENTER to continue..\n") != '\r') { /* wait */ }
|
||||
|
||||
print("\n");
|
||||
print(" ____ _ ____ ____\n");
|
||||
print(" | _ \\(_) ___ ___/ ___| ___ / ___|\n");
|
||||
print(" | |_) | |/ __/ _ \\___ \\ / _ \\| |\n");
|
||||
print(" | __/| | (_| (_) |__) | (_) | |___\n");
|
||||
print(" |_| |_|\\___\\___/____/ \\___/ \\____|\n");
|
||||
|
||||
while (1)
|
||||
{
|
||||
print("\n");
|
||||
print("\n");
|
||||
print("Select an action:\n");
|
||||
print("\n");
|
||||
print(" [1] Read SPI Flash ID\n");
|
||||
print("\n");
|
||||
|
||||
for (int rep = 10; rep > 0; rep--)
|
||||
{
|
||||
print("Command> ");
|
||||
char cmd = getchar();
|
||||
if (cmd > 32 && cmd < 127)
|
||||
reg_uart_data = cmd;
|
||||
print("\n");
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case '1':
|
||||
cmd_read_spi_flash_id();
|
||||
rep = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -36,3 +36,26 @@ addi x31, zero, 0
|
|||
li sp, 4*256
|
||||
call main
|
||||
j start
|
||||
|
||||
.global cmd_read_spi_flash_id_worker_begin
|
||||
.global cmd_read_spi_flash_id_worker_end
|
||||
|
||||
cmd_read_spi_flash_id_worker_begin:
|
||||
li t0,0x02000008
|
||||
li t1,'F'
|
||||
sw t1,0(t0)
|
||||
li t1,'I'
|
||||
sw t1,0(t0)
|
||||
li t1,'X'
|
||||
sw t1,0(t0)
|
||||
li t1,'M'
|
||||
sw t1,0(t0)
|
||||
li t1,'E'
|
||||
sw t1,0(t0)
|
||||
li t1,'\r'
|
||||
sw t1,0(t0)
|
||||
li t1,'\n'
|
||||
sw t1,0(t0)
|
||||
ret
|
||||
cmd_read_spi_flash_id_worker_end:
|
||||
|
||||
|
|
Loading…
Reference in New Issue