From 498ffab9d11b9255bc0385b37312cae3e1cc700d Mon Sep 17 00:00:00 2001 From: Henrik Nordstrom Date: Fri, 24 May 2013 00:14:37 +0200 Subject: [PATCH] felboot: Use u-boot serial driver --- felboot/Makefile | 7 +- felboot/early_print.c | 65 ---------- felboot/early_print.h | 62 ---------- felboot/main.c | 20 --- felboot/printf-stdarg.c | 266 ---------------------------------------- 5 files changed, 1 insertion(+), 419 deletions(-) delete mode 100644 felboot/early_print.c delete mode 100644 felboot/early_print.h delete mode 100644 felboot/printf-stdarg.c diff --git a/felboot/Makefile b/felboot/Makefile index 5644ad4..91134b3 100644 --- a/felboot/Makefile +++ b/felboot/Makefile @@ -28,6 +28,7 @@ UBOOT_OBJS= \ spl/common/libcommon.o \ spl/common/spl/libspl.o \ spl/lib/libgeneric.o \ + spl/drivers/serial/libserial.o \ spl/board/sunxi/libsunxi.o .c.o: @@ -35,12 +36,6 @@ UBOOT_OBJS= \ OBJS += main.o -ifeq ($(NO_PRINTF),1) -CFLAGS += -DNO_PRINTF -else -OBJS += early_print.o -endif - fel-boot-$(BOARD).elf: $(OBJS) $(addprefix $(UBOOTOBJ),$(UBOOT_OBJS)) $(CROSS_COMPILE)$(CC) -Tfel-boot.ld -static -Wl,--gc-sections -nostartfiles -nostdlib $(CFLAGS) -Wl,-Map=$@.map -o $@ $(OBJS) -Wl,--start-group $(addprefix $(UBOOTOBJ),$(UBOOT_OBJS)) -lgcc -Wl,--end-group diff --git a/felboot/early_print.c b/felboot/early_print.c deleted file mode 100644 index 10b03c7..0000000 --- a/felboot/early_print.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * (C) Copyright 2007-2012 - * Allwinner Technology Co., Ltd. - * Tom Cubie - * - * Early uart print for debugging. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#include "config.h" -#include "common.h" -#include "early_print.h" -#include -#include -#include "io.h" - -static int uart_initialized = 0; - -#define UART CONFIG_CONS_INDEX-1 -void uart_init(void) { - - /* select dll dlh */ - writel(0x80, UART_LCR(UART)); - /* set baudrate */ - writel(0, UART_DLH(UART)); - writel(BAUD_115200, UART_DLL(UART)); - /* set line control */ - writel(LC_8_N_1, UART_LCR(UART)); - - uart_initialized = 1; -} - -#define TX_READY (readl(UART_LSR(UART)) & (1 << 6)) - -void uart_putc(char c) { - - while(!TX_READY) - ; - writel(c, UART_THR(UART)); -} - -void uart_puts(const char *s) { - - while(*s) - uart_putc(*s++); -} - - diff --git a/felboot/early_print.h b/felboot/early_print.h deleted file mode 100644 index cbcc6ea..0000000 --- a/felboot/early_print.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * (C) Copyright 2007-2012 - * Allwinner Technology Co., Ltd. - * Tom Cubie - * - * Early uart print for debugging. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA - */ - -#ifndef _SUNXI_EARLY_PRINT_H -#define _SUNXI_EARLY_PRINT_H - -#define SUNXI_UART_BASE SUNXI_UART0_BASE - -#define UART_RBR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x0) /* receive buffer register */ -#define UART_THR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x0) /* transmit holding register */ -#define UART_DLL(n) (SUNXI_UART_BASE + (n)*0x400 + 0x0) /* divisor latch low register */ - -#define UART_DLH(n) (SUNXI_UART_BASE + (n)*0x400 + 0x4) /* divisor latch high register */ -#define UART_IER(n) (SUNXI_UART_BASE + (n)*0x400 + 0x4) /* interrupt enable reigster */ - -#define UART_IIR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x8) /* interrupt identity register */ -#define UART_FCR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x8) /* fifo control register */ - -#define UART_LCR(n) (SUNXI_UART_BASE + (n)*0x400 + 0xc) /* line control register */ - -#define UART_LSR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x14) /* line status register */ -#define UART_RBR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x0) /* receive buffer register */ -#define UART_THR(n) (SUNXI_UART_BASE + (n)*0x400 + 0x0) /* transmit holding register */ -#define UART_DLL(n) (SUNXI_UART_BASE + (n)*0x400 + 0x0) /* divisor latch low register */ - - -#define BAUD_115200 (0xD) /* 24 * 1000 * 1000 / 16 / 115200 = 13 */ -#define NO_PARITY (0) -#define ONE_STOP_BIT (0) -#define DAT_LEN_8_BITS (3) -#define LC_8_N_1 (NO_PARITY << 3 | ONE_STOP_BIT << 2 | DAT_LEN_8_BITS) - -#ifndef __ASSEMBLY__ -void uart_init(void); -void uart_putc(char c); -void uart_puts(const char *s); -#endif /* __ASSEMBLY__ */ - -#endif /* _SUNXI_EARLY_PRINT_H */ diff --git a/felboot/main.c b/felboot/main.c index a086d33..43d2d4e 100644 --- a/felboot/main.c +++ b/felboot/main.c @@ -34,23 +34,3 @@ void status_led_set(int led, int state) { return; } - -int serial_init(void) -{ - uart_init(); - return 0; -} - -void putchar(int ch) -{ - if (ch == '\n') - uart_putc('\r'); - uart_putc(ch); -} - -void serial_puts(const char *str) -{ - while(*str) - putchar(*str++); -} - diff --git a/felboot/printf-stdarg.c b/felboot/printf-stdarg.c deleted file mode 100644 index 72fd2b9..0000000 --- a/felboot/printf-stdarg.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - Copyright 2001, 2002 Georges Menie (www.menie.org) - stdarg version contributed by Christian Ettinger - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -/* - putchar is the only external dependency for this file, - if you have a working putchar, leave it commented out. - If not, uncomment the define below and - replace outbyte(c) by your own function call. - -#define putchar(c) outbyte(c) -*/ - -#include - -static void printchar(char **str, int c) -{ - extern int putchar(int c); - - if (str) { - **str = c; - ++(*str); - } - else (void)putchar(c); -} - -#define PAD_RIGHT 1 -#define PAD_ZERO 2 - -static int prints(char **out, const char *string, int width, int pad) -{ - register int pc = 0, padchar = ' '; - - if (width > 0) { - register int len = 0; - register const char *ptr; - for (ptr = string; *ptr; ++ptr) ++len; - if (len >= width) width = 0; - else width -= len; - if (pad & PAD_ZERO) padchar = '0'; - } - if (!(pad & PAD_RIGHT)) { - for ( ; width > 0; --width) { - printchar (out, padchar); - ++pc; - } - } - for ( ; *string ; ++string) { - printchar (out, *string); - ++pc; - } - for ( ; width > 0; --width) { - printchar (out, padchar); - ++pc; - } - - return pc; -} - -/* the following should be enough for 32 bit int */ -#define PRINT_BUF_LEN 12 - -static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) -{ - char print_buf[PRINT_BUF_LEN]; - register char *s; - register int t, neg = 0, pc = 0; - register unsigned int u = i; - - if (i == 0) { - print_buf[0] = '0'; - print_buf[1] = '\0'; - return prints (out, print_buf, width, pad); - } - - if (sg && b == 10 && i < 0) { - neg = 1; - u = -i; - } - - s = print_buf + PRINT_BUF_LEN-1; - *s = '\0'; - - while (u) { - t = u % b; - if( t >= 10 ) - t += letbase - '0' - 10; - *--s = t + '0'; - u /= b; - } - - if (neg) { - if( width && (pad & PAD_ZERO) ) { - printchar (out, '-'); - ++pc; - --width; - } - else { - *--s = '-'; - } - } - - return pc + prints (out, s, width, pad); -} - -static int print(char **out, const char *format, va_list args ) -{ - register int width, pad; - register int pc = 0; - char scr[2]; - - for (; *format != 0; ++format) { - if (*format == '%') { - ++format; - width = pad = 0; - if (*format == '\0') break; - if (*format == '%') goto out; - if (*format == '-') { - ++format; - pad = PAD_RIGHT; - } - while (*format == '0') { - ++format; - pad |= PAD_ZERO; - } - for ( ; *format >= '0' && *format <= '9'; ++format) { - width *= 10; - width += *format - '0'; - } - if( *format == 's' ) { - register char *s = (char *)va_arg( args, int ); - pc += prints (out, s?s:"(null)", width, pad); - continue; - } - if( *format == 'd' ) { - pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a'); - continue; - } - if( *format == 'x' ) { - pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); - continue; - } - if( *format == 'X' ) { - pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A'); - continue; - } - if( *format == 'u' ) { - pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a'); - continue; - } - if( *format == 'c' ) { - /* char are converted to int then pushed on the stack */ - scr[0] = (char)va_arg( args, int ); - scr[1] = '\0'; - pc += prints (out, scr, width, pad); - continue; - } - } - else { - out: - printchar (out, *format); - ++pc; - } - } - if (out) **out = '\0'; - va_end( args ); - return pc; -} - -int printf(const char *format, ...) -{ - va_list args; - - va_start( args, format ); - return print( 0, format, args ); -} - -int sprintf(char *out, const char *format, ...) -{ - va_list args; - - va_start( args, format ); - return print( &out, format, args ); -} - -#ifdef TEST_PRINTF -int main(void) -{ - char *ptr = "Hello world!"; - char *np = 0; - int i = 5; - unsigned int bs = sizeof(int)*8; - int mi; - char buf[80]; - - mi = (1 << (bs-1)) + 1; - printf("%s\n", ptr); - printf("printf test\n"); - printf("%s is null pointer\n", np); - printf("%d = 5\n", i); - printf("%d = - max int\n", mi); - printf("char %c = 'a'\n", 'a'); - printf("hex %x = ff\n", 0xff); - printf("hex %02x = 00\n", 0); - printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3); - printf("%d %s(s)%", 0, "message"); - printf("\n"); - printf("%d %s(s) with %%\n", 0, "message"); - sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf); - sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf); - sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf); - sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf); - sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf); - sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf); - sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf); - sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf); - - return 0; -} - -/* - * if you compile this file with - * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c - * you will get a normal warning: - * printf.c:214: warning: spurious trailing `%' in format - * this line is testing an invalid % at the end of the format string. - * - * this should display (on 32bit int machine) : - * - * Hello world! - * printf test - * (null) is null pointer - * 5 = 5 - * -2147483647 = - max int - * char a = 'a' - * hex ff = ff - * hex 00 = 00 - * signed -3 = unsigned 4294967293 = hex fffffffd - * 0 message(s) - * 0 message(s) with % - * justif: "left " - * justif: " right" - * 3: 0003 zero padded - * 3: 3 left justif. - * 3: 3 right justif. - * -3: -003 zero padded - * -3: -3 left justif. - * -3: -3 right justif. - */ - -#endif