123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- #include <common.h>
- #include <ns16550.h>
- #include "short_types.h"
- #include "memio.h"
- #include "articiaS.h"
- DECLARE_GLOBAL_DATA_PTR;
- #ifndef CONFIG_SYS_NS16550
- static uint32 ComPort1;
- uint16 SerialEcho = 1;
- #define RECEIVER_HOLDING 0
- #define TRANSMITTER_HOLDING 0
- #define INTERRUPT_ENABLE 1
- #define INTERRUPT_STATUS 2
- #define FIFO_CONTROL 2
- #define LINE_CONTROL 3
- #define MODEM_CONTROL 4
- #define LINE_STATUS 5
- #define MODEM_STATUS 6
- #define SCRATCH_PAD 7
- #define DIVISOR_LATCH_LSB 0
- #define DIVISOR_LATCH_MSB 1
- #define PRESCALER_DIVISION 5
- #define COM_WRITE_BYTE(reg, byte) out_byte((ComPort1+reg), byte)
- #define COM_READ_BYTE(reg) in_byte((ComPort1+reg))
- static int serial_init_done = 0;
- void serial_init (void)
- {
- #if 0
- uint32 clock_divisor = 115200 / baudrate;
- uint8 cfg;
- uint8 a;
- uint16 devfn = 7 << 3;
- if (serial_init_done)
- return;
- /* Enter configuration mode */
- cfg = pci_read_cfg_byte (0, devfn, 0x85);
- pci_write_cfg_byte (0, devfn, 0x85, cfg | 0x02);
- /* Set serial port COM1 as 3F8 */
- out_byte (0x3F0, 0xE7);
- out_byte (0x3f1, 0xfe);
- /* Set serial port COM2 as 2F8 */
- out_byte (0x3f0, 0xe8);
- out_byte (0x3f1, 0xeb);
- /* Enable */
- out_byte (0x3f0, 0xe2);
- a = in_byte (0x3f1);
- a |= 0xc;
- out_byte (0x3f0, 0xe2);
- out_byte (0x3f1, a);
- /* Reset the configuration mode */
- pci_write_cfg_byte (0, devfn, 0x85, cfg);
- #endif
- ComPort1 = 0x3F8;
- /* Disable interrupts */
- COM_WRITE_BYTE (INTERRUPT_ENABLE, 0x00);
- /* Set baud rate */
- /* COM_WRITE_BYTE(LINE_CONTROL, 0x83); */
- /* COM_WRITE_BYTE(DIVISOR_LATCH_LSB, (uint8)(clock_divisor & 0xFF)); */
- /* COM_WRITE_BYTE(DIVISOR_LATCH_MSB, (uint8)(clock_divisor >> 8)); */
- /* __asm("eieio"); */
- /* Set 8-N-1 */
- COM_WRITE_BYTE (LINE_CONTROL, 0x03);
- __asm ("eieio");
- /* Disable FIFO */
- COM_WRITE_BYTE (MODEM_CONTROL, 0x03);
- COM_WRITE_BYTE (FIFO_CONTROL, 0x07);
- __asm ("eieio");
- serial_init_done = 1;
- }
- extern int console_changed;
- void serial_putc (const char sendme)
- {
- if (sendme == '\n') {
- while ((in_byte (0x3FD) & 0x40) == 0);
- out_byte (0x3f8, 0x0D);
- }
- while ((in_byte (0x3FD) & 0x40) == 0);
- out_byte (0x3f8, sendme);
- }
- int serial_getc (void)
- {
- #if 0
- uint8 c;
- for (;;) {
- uint8 x = in_byte (0x3FD);
- if (x & 0x01)
- break;
- if (x & 0x0C)
- out_byte (0x3fd, 0x0c);
- }
- c = in_byte (0x3F8);
- return c;
- #else
- while ((in_byte (0x3FD) & 0x01) == 0) {
- if (console_changed != 0) {
- printf ("Console changed\n");
- console_changed = 0;
- return 0;
- }
- }
- return in_byte (0x3F8);
- #endif
- }
- int serial_tstc (void)
- {
- return (in_byte (0x03FD) & 0x01) != 0;
- }
- void serial_debug_putc (int c)
- {
- serial_puts ("DBG");
- serial_putc (c);
- serial_putc (0x0d);
- serial_putc (0x0A);
- }
- #else
- const NS16550_t Com0 = (NS16550_t) CONFIG_SYS_NS16550_COM1;
- const NS16550_t Com1 = (NS16550_t) CONFIG_SYS_NS16550_COM2;
- int serial_init (void)
- {
- uint32 clock_divisor = 115200 / gd->baudrate;
- NS16550_init (Com0, clock_divisor);
- /* NS16550_reinit(Com1, clock_divisor); */
- /* serial_puts("COM1: 3F8h initalized"); */
- return (0);
- }
- #if 0
- void serial_putc (const char c)
- {
- NS16550_putc (Com0, c);
- if (c == '\n')
- NS16550_putc (Com0, 0x0D);
- }
- int serial_getc (void)
- {
- return (int) NS16550_getc (Com0);
- }
- int serial_tstc (void)
- {
- return NS16550_tstc (Com0);
- }
- #else
- void serial_putc (const char sendme)
- {
- if (sendme == '\n') {
- while ((in_byte (0x3FD) & 0x40) == 0);
- out_byte (0x3f8, 0x0D);
- }
- while ((in_byte (0x3FD) & 0x40) == 0);
- out_byte (0x3f8, sendme);
- }
- extern int console_changed;
- int serial_getc (void)
- {
- #if 0
- uint8 c;
- for (;;) {
- uint8 x = in_byte (0x3FD);
- if (x & 0x01)
- break;
- if (x & 0x0C)
- out_byte (0x3fd, 0x0c);
- }
- c = in_byte (0x3F8);
- return c;
- #else
- while ((in_byte (0x3FD) & 0x01) == 0) {
- if (console_changed != 0) {
- console_changed = 0;
- return 0;
- }
- }
- return in_byte (0x3F8);
- #endif
- }
- int serial_tstc (void)
- {
- return (in_byte (0x03FD) & 0x01) != 0;
- }
- #endif
- #endif
- void serial_puts (const char *string)
- {
- while (*string)
- serial_putc (*string++);
- }
- void serial_setbrg (void)
- {
- uint32 clock_divisor = 115200 / gd->baudrate;
- NS16550_init (Com0, clock_divisor);
- }
|