X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=cpu%2Fmcf52x2%2Fserial.c;h=8be09e34fefdcf9f19718b3c1b44d4bf0e89d1bd;hb=32922cdc470fdfd39bea0c1c4f582d3fb340421e;hp=1cde1b6883de26eac60f26a28983ecc030b12c4b;hpb=1cfefe8cb6e1bb43f6509c0aee254e2908d42f21;p=oweals%2Fu-boot.git diff --git a/cpu/mcf52x2/serial.c b/cpu/mcf52x2/serial.c index 1cde1b6883..8be09e34fe 100644 --- a/cpu/mcf52x2/serial.c +++ b/cpu/mcf52x2/serial.c @@ -23,6 +23,7 @@ #include #include +#include #include @@ -54,45 +55,75 @@ void rs_serial_setbaudrate(int port,int baudrate) { #if defined(CONFIG_M5272) || defined(CONFIG_M5249) || defined(CONFIG_M5271) volatile unsigned char *uartp; -#ifndef CONFIG_M5271 +# ifndef CONFIG_M5271 double fraction; -#endif +# endif double clock; if (port == 0) - uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE1); + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE1); else - uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE2); + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE2); - clock = DoubleClock(baudrate); /* Set baud above */ + clock = DoubleClock(baudrate); /* Set baud above */ - uartp[MCFUART_UBG1] = (((int)clock >> 8) & 0xff); /* set msb baud */ - uartp[MCFUART_UBG2] = ((int)clock & 0xff); /* set lsb baud */ + uartp[MCFUART_UBG1] = (((int)clock >> 8) & 0xff); /* set msb baud */ + uartp[MCFUART_UBG2] = ((int)clock & 0xff); /* set lsb baud */ -#ifndef CONFIG_M5271 +# ifndef CONFIG_M5271 fraction = ((clock - (int)clock) * 16.0) + 0.5; - uartp[MCFUART_UFPD] = ((int)fraction & 0xf); /* set baud fraction adjust */ + uartp[MCFUART_UFPD] = ((int)fraction & 0xf); /* set baud fraction adjust */ +# endif #endif + +#if defined(CONFIG_M5282) + volatile unsigned char *uartp; + long clock; + + switch (port) { + case 1: + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE2); + break; + case 2: + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE3); + break; + default: + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE1); + } + + clock = (long) CFG_CLK / ((long) 32 * baudrate); /* Set baud above */ + + uartp[MCFUART_UBG1] = (((int)clock >> 8) & 0xff); /* set msb baud */ + uartp[MCFUART_UBG2] = ((int) clock & 0xff); /* set lsb baud */ + #endif }; -void rs_serial_init(int port,int baudrate) +void rs_serial_init (int port, int baudrate) { - volatile unsigned char *uartp; + volatile unsigned char *uartp; /* - * Reset UART, get it into known state... + * Reset UART, get it into known state... */ - if (port == 0) - uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE1); - else + switch (port) { + case 1: uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE2); + break; +#if defined(CONFIG_M5282) + case 2: + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE3); + break; +#endif + default: + uartp = (volatile unsigned char *) (CFG_MBAR + MCFUART_BASE1); + } - uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ - uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ + uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX; /* reset TX */ + uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX; /* reset RX */ - uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETMRPTR; /* reset MR pointer */ - uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETERR; /* reset Error pointer */ + uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETMRPTR; /* reset MR pointer */ + uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETERR; /* reset Error pointer */ /* * Set port for CONSOLE_BAUD_RATE, 8 data bits, 1 stop bit, no parity. @@ -105,8 +136,8 @@ void rs_serial_init(int port,int baudrate) /* Set clock Select Register: Tx/Rx clock is timer */ uartp[MCFUART_UCSR] = MCFUART_UCSR_RXCLKTIMER | MCFUART_UCSR_TXCLKTIMER; - - rs_serial_setbaudrate(port,baudrate); + + rs_serial_setbaudrate (port, baudrate); /* Enable Tx/Rx */ uartp[MCFUART_UCR] = MCFUART_UCR_RXENABLE | MCFUART_UCR_TXENABLE; @@ -168,13 +199,14 @@ void serial_putc(const char c) { } void serial_puts (const char *s) { - while (*s) { + while (*s) serial_putc(*s++); - } } int serial_getc(void) { - while(!rs_is_char()); + while(!rs_is_char()) + WATCHDOG_RESET(); + return rs_get_char(); }