mirror of https://github.com/wolfSSL/wolfBoot.git
Added minimalistic printf UART support (enabled with `DEBUG_UART`).
parent
bfed41889b
commit
bc89cb6594
17
arch.mk
17
arch.mk
|
@ -176,26 +176,21 @@ endif
|
|||
## RISCV
|
||||
ifeq ($(ARCH),RISCV)
|
||||
CROSS_COMPILE?=riscv32-unknown-elf-
|
||||
CFLAGS+=-DUSE_M_TIME -g -march=rv32imac -mabi=ilp32 -mcmodel=medany -nostartfiles -DARCH_RISCV
|
||||
CFLAGS+=-fno-builtin-printf -DUSE_M_TIME -g -march=rv32imac -mabi=ilp32 -mcmodel=medany -nostartfiles -DARCH_RISCV
|
||||
LDFLAGS+=-march=rv32imac -mabi=ilp32 -mcmodel=medany
|
||||
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
|
||||
|
||||
ifeq ($(DEBUG_UART),0)
|
||||
CFLAGS+=-fno-builtin-printf
|
||||
endif
|
||||
|
||||
# Prune unused functions and data
|
||||
CFLAGS +=-ffunction-sections -fdata-sections
|
||||
LDFLAGS+=-Wl,--gc-sections
|
||||
|
||||
OBJS+=src/boot_riscv.o src/vector_riscv.o
|
||||
ARCH_FLASH_OFFSET?=0x20010000
|
||||
ARCH_FLASH_OFFSET=0x20010000
|
||||
endif
|
||||
|
||||
# powerpc
|
||||
ifeq ($(ARCH),PPC)
|
||||
CROSS_COMPILE?=powerpc-linux-gnu-
|
||||
CFLAGS+=-g -nostartfiles
|
||||
LDFLAGS+=-Wl,--build-id=none
|
||||
|
||||
ifeq ($(DEBUG_UART),0)
|
||||
|
@ -267,8 +262,12 @@ ifeq ($(TARGET),t2080)
|
|||
# Power PC big endian
|
||||
ARCH_FLAGS=-m32 -mhard-float -mcpu=e6500
|
||||
CFLAGS+=$(ARCH_FLAGS) -DBIG_ENDIAN_ORDER
|
||||
CFLAGS+=-DMMU -DWOLFBOOT_DUALBOOT -pipe -feliminate-unused-debug-types
|
||||
LDFLAGS+=$(ARCH_FLAGS) -Wl,--hash-style=gnu -Wl,--as-needed
|
||||
CFLAGS+=-DMMU -DWOLFBOOT_DUALBOOT
|
||||
CFLAGS+=-pipe # use pipes instead of temp files
|
||||
CFLAGS+=-feliminate-unused-debug-types
|
||||
LDFLAGS+=$(ARCH_FLAGS)
|
||||
LDFLAGS+=-Wl,--hash-style=both # generate both sysv and gnu symbol hash table
|
||||
LDFLAGS+=-Wl,--as-needed # remove weak functions not used
|
||||
UPDATE_OBJS:=src/update_ram.o
|
||||
ifeq ($(SPMATH),1)
|
||||
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
|
||||
|
|
|
@ -213,6 +213,10 @@ enum ifc_amask_sizes {
|
|||
#define SATA_ENBL (*(volatile uint32_t *)(0xB1003F4C)) /* also saw 0xB4003F4C */
|
||||
|
||||
|
||||
/* DDR */
|
||||
/* NAII 68PPC2 - 8GB discrete DDR3 IM8G08D3EBDG-15E */
|
||||
|
||||
|
||||
#ifdef DEBUG_UART
|
||||
static void uart_init(void)
|
||||
{
|
||||
|
@ -239,13 +243,13 @@ static void uart_init(void)
|
|||
UART_LCR(UART_SEL) = (UART_LCR_WLS);
|
||||
}
|
||||
|
||||
static void uart_write(const char* buf, uint32_t sz)
|
||||
void uart_write(const char* buf, uint32_t sz)
|
||||
{
|
||||
uint32_t pos = 0;
|
||||
while (sz-- > 0) {
|
||||
while (!(UART_LSR(UART_SEL) & UART_LSR_THRE))
|
||||
;
|
||||
UART_THR(0) = buf[pos++];
|
||||
UART_THR(UART_SEL) = buf[pos++];
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG_UART */
|
||||
|
@ -352,6 +356,7 @@ void hal_init(void)
|
|||
|
||||
uart_write("CPLD FW Rev: 0x", 15);
|
||||
tohexstr(fw, buf);
|
||||
uart_write(buf, (uint32_t)sizeof(buf));
|
||||
uart_write("\n", 1);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -25,11 +25,16 @@
|
|||
#define WOLFBOOT_PRINTF_INCLUDED
|
||||
|
||||
#if defined(DEBUG_ZYNQ) && !defined(PRINTF_ENABLED)
|
||||
# define PRINTF_ENABLED
|
||||
# define PRINTF_ENABLED
|
||||
#endif
|
||||
|
||||
#if defined(WOLFBOOT_DEBUG_EFI) && !defined(PRINTF_ENABLED)
|
||||
# define PRINTF_ENABLED
|
||||
# define PRINTF_ENABLED
|
||||
#endif
|
||||
|
||||
#if defined(DEBUG_UART) && !defined(PRINTF_ENABLED) && !defined(NO_PRINTF_UART)
|
||||
# define PRINTF_ENABLED
|
||||
void uart_write(const char* buf, unsigned int sz);
|
||||
#endif
|
||||
|
||||
#ifdef PRINTF_ENABLED
|
||||
|
@ -42,6 +47,10 @@
|
|||
# include "efi/efilib.h"
|
||||
/* NOTE: %s arguments will not work as EFI uses widechar string */
|
||||
# define wolfBoot_printf(_f_, ...) Print(L##_f_, ##__VA_ARGS__)
|
||||
# elif defined(DEBUG_UART)
|
||||
/* use minimal printf support in string.h */
|
||||
void uart_printf(const char* fmt, ...);
|
||||
# define wolfBoot_printf(_f_, ...) uart_printf(_f_, ##__VA_ARGS__)
|
||||
# else
|
||||
# define wolfBoot_printf(_f_, ...) printf(_f_, ##__VA_ARGS__)
|
||||
# endif
|
||||
|
|
120
src/string.c
120
src/string.c
|
@ -26,6 +26,13 @@
|
|||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef DEBUG_UART
|
||||
#include "printf.h"
|
||||
#ifdef PRINTF_ENABLED
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int islower(int c)
|
||||
{
|
||||
return (c >= 'a' && c <= 'z');
|
||||
|
@ -54,13 +61,13 @@ int isalpha(int c)
|
|||
#if !defined(__IAR_SYSTEMS_ICC__) && !defined(PLATFORM_X86_64_EFI)
|
||||
void *memset(void *s, int c, size_t n)
|
||||
{
|
||||
unsigned char *d = (unsigned char *)s;
|
||||
unsigned char *d = (unsigned char *)s;
|
||||
|
||||
while (n--) {
|
||||
*d++ = (unsigned char)c;
|
||||
}
|
||||
while (n--) {
|
||||
*d++ = (unsigned char)c;
|
||||
}
|
||||
|
||||
return s;
|
||||
return s;
|
||||
}
|
||||
#endif /* IAR */
|
||||
|
||||
|
@ -87,7 +94,7 @@ int strcmp(const char *s1, const char *s2)
|
|||
s2++;
|
||||
}
|
||||
|
||||
return diff;
|
||||
return diff;
|
||||
}
|
||||
|
||||
int strcasecmp(const char *s1, const char *s2)
|
||||
|
@ -104,7 +111,7 @@ int strcasecmp(const char *s1, const char *s2)
|
|||
s2++;
|
||||
}
|
||||
|
||||
return diff;
|
||||
return diff;
|
||||
}
|
||||
|
||||
int strncasecmp(const char *s1, const char *s2, size_t n)
|
||||
|
@ -123,7 +130,7 @@ int strncasecmp(const char *s1, const char *s2, size_t n)
|
|||
if (++i > n)
|
||||
break;
|
||||
}
|
||||
return diff;
|
||||
return diff;
|
||||
}
|
||||
|
||||
size_t strlen(const char *s)
|
||||
|
@ -225,7 +232,7 @@ int memcmp(const void *_s1, const void *_s2, size_t n)
|
|||
n--;
|
||||
}
|
||||
|
||||
return diff;
|
||||
return diff;
|
||||
}
|
||||
|
||||
#ifndef __IAR_SYSTEMS_ICC__
|
||||
|
@ -246,3 +253,98 @@ void *memmove(void *dst, const void *src, size_t n)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(PRINTF_ENABLED) && defined(DEBUG_UART)
|
||||
/* minimal printf for 32-bit */
|
||||
void uart_writenum(int num, int base)
|
||||
{
|
||||
int i = 0;
|
||||
char buf[sizeof(int)*2+1+1];
|
||||
const char* kDigitLut = "0123456789ABCDEF";
|
||||
unsigned int val = (unsigned int)num;
|
||||
if (base == 10 && num < 0) { /* handle negative */
|
||||
buf[i++] = '-';
|
||||
val = -num;
|
||||
}
|
||||
do {
|
||||
buf[i++] = kDigitLut[(val % base)];
|
||||
val /= base;
|
||||
} while (val > 0U);
|
||||
uart_write(buf, i);
|
||||
}
|
||||
|
||||
void uart_vprintf(const char* fmt, va_list argp)
|
||||
{
|
||||
char* fmtp = (char*)fmt;
|
||||
while (fmtp != NULL && *fmtp != '\0') {
|
||||
/* print non formatting characters */
|
||||
if (*fmtp != '%') {
|
||||
uart_write(fmtp++, 1);
|
||||
continue;
|
||||
}
|
||||
fmtp++; /* skip % */
|
||||
|
||||
/* find formatters */
|
||||
while (*fmtp != '\0') {
|
||||
if (*fmtp >= '0' && *fmtp <= '9') {
|
||||
/* length formatter - skip */
|
||||
fmtp++;
|
||||
}
|
||||
else if (*fmtp == 'l') {
|
||||
/* long - skip */
|
||||
fmtp++;
|
||||
}
|
||||
else if (*fmtp == 'z') {
|
||||
/* auto type - skip */
|
||||
fmtp++;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (*fmtp) {
|
||||
case '%':
|
||||
uart_write(fmtp, 1);
|
||||
break;
|
||||
case 'u':
|
||||
case 'i':
|
||||
case 'd':
|
||||
{
|
||||
int n = (int)va_arg(argp, int);
|
||||
uart_writenum(n, 10);
|
||||
break;
|
||||
}
|
||||
case 'x':
|
||||
case 'p':
|
||||
{
|
||||
int n = (int)va_arg(argp, int);
|
||||
uart_writenum(n, 16);
|
||||
break;
|
||||
}
|
||||
case 's':
|
||||
{
|
||||
char* str = (char*)va_arg(argp, char*);
|
||||
uart_write(str, (uint32_t)strlen(str));
|
||||
break;
|
||||
}
|
||||
case 'c':
|
||||
{
|
||||
char c = (char)va_arg(argp, int);
|
||||
uart_write(&c, 1);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
fmtp++;
|
||||
};
|
||||
}
|
||||
void uart_printf(const char* fmt, ...)
|
||||
{
|
||||
va_list argp;
|
||||
va_start(argp, fmt);
|
||||
uart_vprintf(fmt, argp);
|
||||
va_end(argp);
|
||||
}
|
||||
#endif /* PRINTF_ENABLED && DEBUG_UART */
|
||||
|
|
Loading…
Reference in New Issue