openpiton: Beautify status display in FSBL

This commit is contained in:
Michael Schaffner 2019-04-18 16:41:24 +02:00 committed by Florian Zaruba
parent 078c5c167d
commit fa3af5ece4
5 changed files with 39 additions and 19 deletions

View file

@ -0,0 +1 @@
../info.h

View file

@ -2,11 +2,14 @@
#include "spi.h"
#include "sd.h"
#include "gpt.h"
#include "info.h"
int main()
{
init_uart(UART_FREQ, 115200);
print_uart("Hello World!\r\n");
print_uart(info);
print_uart("sd initialized!\r\n");
int res = gpt_find_boot_partition((uint8_t *)0x80000000UL, 2 * 16384);

View file

@ -17,25 +17,31 @@ int init_sd()
int sd_copy(void *dst, uint32_t src_lba, uint32_t size)
{
char buf[100];
uint64_t raw_addr = PITON_SD_BASE_ADDR;
raw_addr += ((uint64_t)src_lba) << 9;
uint32_t num_chars = 0;
uint64_t * addr = (uint64_t *)raw_addr;
volatile uint64_t * p = (uint64_t *)dst;
for (uint32_t blk = 0; blk < size; blk++) {
if(blk % 100 == 0) {
print_uart("copying block ");
print_uart_dec(blk, 1);
print_uart(" of ");
print_uart_dec(size, 1);
print_uart(" blocks (");
print_uart_dec((blk*100)/size, 1);
print_uart(" %)\r\n");
for(uint32_t k=0; k<num_chars; k++) {
print_uart("\b");
}
num_chars =print_uart("copying block ");
num_chars+=print_uart_dec(blk, 1);
num_chars+=print_uart(" of ");
num_chars+=print_uart_dec(size, 1);
num_chars+=print_uart(" blocks (");
num_chars+=print_uart_dec((blk*100)/size, 1);
num_chars+=print_uart(" %)");
}
for (uint32_t offset = 0; offset < 64; offset++) {
*(p++) = *(addr++);
}
}
print_uart("\r\n");
return 0;
}

View file

@ -35,14 +35,18 @@ void init_uart(uint32_t freq, uint32_t baud)
write_reg_u8(UART_MODEM_CONTROL, 0x20); // Autoflow mode
}
void print_uart(const char *str)
// returns number of characters printed
int print_uart(const char *str)
{
int num = 0;
const char *cur = &str[0];
while (*cur != '\0')
{
write_serial((uint8_t)*cur);
++cur;
++num;
}
return num;
}
uint8_t bin_to_hex_table[16] = {
@ -55,8 +59,9 @@ void bin_to_hex(uint8_t inp, uint8_t res[2])
return;
}
void print_uart_dec(uint32_t val, uint32_t digits)
int print_uart_dec(uint32_t val, uint32_t digits)
{
int num = 0;
int i;
uint32_t k = 1000000000;
for (i = 9; i > -1; i--)
@ -69,11 +74,13 @@ void print_uart_dec(uint32_t val, uint32_t digits)
uint8_t dec;
dec = bin_to_hex_table[cur & 0xf];
write_serial(dec);
num++;
}
}
return num;
}
void print_uart_int(uint32_t addr)
int print_uart_int(uint32_t addr)
{
int i;
for (i = 3; i > -1; i--)
@ -84,9 +91,10 @@ void print_uart_int(uint32_t addr)
write_serial(hex[0]);
write_serial(hex[1]);
}
return 8;
}
void print_uart_addr(uint64_t addr)
int print_uart_addr(uint64_t addr)
{
int i;
for (i = 7; i > -1; i--)
@ -97,12 +105,14 @@ void print_uart_addr(uint64_t addr)
write_serial(hex[0]);
write_serial(hex[1]);
}
return 16;
}
void print_uart_byte(uint8_t byte)
int print_uart_byte(uint8_t byte)
{
uint8_t hex[2];
bin_to_hex(byte, hex);
write_serial(hex[0]);
write_serial(hex[1]);
return 2;
}

View file

@ -18,12 +18,12 @@
void init_uart();
void print_uart(const char* str);
int print_uart(const char* str);
void print_uart_dec(uint32_t val, uint32_t digits);
int print_uart_dec(uint32_t val, uint32_t digits);
void print_uart_int(uint32_t addr);
int print_uart_int(uint32_t addr);
void print_uart_addr(uint64_t addr);
int print_uart_addr(uint64_t addr);
void print_uart_byte(uint8_t byte);
int print_uart_byte(uint8_t byte);