Improve PicoSoC demo firmware

This commit is contained in:
Clifford Wolf 2017-09-15 16:28:19 +02:00
parent cfd4933272
commit 797c21e95c
2 changed files with 116 additions and 15 deletions

View File

@ -5,23 +5,101 @@
#define reg_uart_data (*(volatile uint32_t*)0x02000008) #define reg_uart_data (*(volatile uint32_t*)0x02000008)
#define reg_leds (*(volatile uint32_t*)0x03000000) #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() void main()
{ {
reg_uart_clkdiv = 104; reg_uart_clkdiv = 104;
reg_leds = 1; while (getchar_prompt("Press ENTER to continue..\n") != '\r') { /* wait */ }
reg_uart_data = 'H';
reg_leds = 2; print("\n");
reg_uart_data = 'e'; print(" ____ _ ____ ____\n");
reg_leds = 3; print(" | _ \\(_) ___ ___/ ___| ___ / ___|\n");
reg_uart_data = 'l'; print(" | |_) | |/ __/ _ \\___ \\ / _ \\| |\n");
reg_leds = 4; print(" | __/| | (_| (_) |__) | (_) | |___\n");
reg_uart_data = 'l'; print(" |_| |_|\\___\\___/____/ \\___/ \\____|\n");
reg_leds = 5;
reg_uart_data = 'o'; while (1)
reg_leds = 6; {
reg_uart_data = '\r'; print("\n");
reg_leds = 7; print("\n");
reg_uart_data = '\n'; print("Select an action:\n");
reg_leds = 8; 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;
}
}
}
} }

View File

@ -36,3 +36,26 @@ addi x31, zero, 0
li sp, 4*256 li sp, 4*256
call main call main
j start 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: