diff -Nru linux-2.4.9/kernel/printk.c.orig linux-2.4.9/kernel/printk.c --- linux-2.4.9/kernel/printk.c.orig Tue Sep 4 04:25:25 2001 +++ linux-2.4.9/kernel/printk.c Tue Sep 25 12:40:07 2001 @@ -251,6 +251,7 @@ return do_syslog(type, buf, len); } +extern void debug_out(char * msg, int len); asmlinkage int printk(const char *fmt, ...) { va_list args; @@ -296,6 +297,11 @@ break; } } + + /* jsun */ + debug_out(msg, p - msg + line_feed); + + /* if (msg_level < console_loglevel && console_drivers) { struct console *c = console_drivers; while(c) { @@ -304,6 +310,7 @@ c = c->next; } } + */ if (line_feed) msg_level = -1; } @@ -494,4 +501,134 @@ if (tty && tty->driver.write) tty->driver.write(tty, 0, msg, strlen(msg)); return; +} + + +/* -------------------------- early-printk hack ---------------------- */ + +/* === CONFIG === */ + +#define BASE 0xac000010 +#define MAX_BAUD 1152000 +#define REG_OFFSET 1 + +#define INIT_SERIAL_PORT 1 + +#define DEFAULT_BAUD UART16550_BAUD_9600 +#define DEFAULT_PARITY UART16550_PARITY_NONE +#define DEFAULT_DATA UART16550_DATA_8BIT +#define DEFAULT_STOP UART16550_STOP_1BIT + +/* === END OF CONFIG === */ + +/* we need uint32 uint8 */ +typedef unsigned char uint8; +typedef unsigned int uint32; + +#define UART16550_BAUD_2400 2400 +#define UART16550_BAUD_4800 4800 +#define UART16550_BAUD_9600 9600 +#define UART16550_BAUD_19200 19200 +#define UART16550_BAUD_38400 38400 +#define UART16550_BAUD_57600 57600 +#define UART16550_BAUD_115200 115200 + +#define UART16550_PARITY_NONE 0 +#define UART16550_PARITY_ODD 0x08 +#define UART16550_PARITY_EVEN 0x18 +#define UART16550_PARITY_MARK 0x28 +#define UART16550_PARITY_SPACE 0x38 + +#define UART16550_DATA_5BIT 0x0 +#define UART16550_DATA_6BIT 0x1 +#define UART16550_DATA_7BIT 0x2 +#define UART16550_DATA_8BIT 0x3 + +#define UART16550_STOP_1BIT 0x0 +#define UART16550_STOP_2BIT 0x4 + +/* register offset */ +#define OFS_RCV_BUFFER (0*REG_OFFSET) +#define OFS_TRANS_HOLD (0*REG_OFFSET) +#define OFS_SEND_BUFFER (0*REG_OFFSET) +#define OFS_INTR_ENABLE (1*REG_OFFSET) +#define OFS_INTR_ID (2*REG_OFFSET) +#define OFS_DATA_FORMAT (3*REG_OFFSET) +#define OFS_LINE_CONTROL (3*REG_OFFSET) +#define OFS_MODEM_CONTROL (4*REG_OFFSET) +#define OFS_RS232_OUTPUT (4*REG_OFFSET) +#define OFS_LINE_STATUS (5*REG_OFFSET) +#define OFS_MODEM_STATUS (6*REG_OFFSET) +#define OFS_RS232_INPUT (6*REG_OFFSET) +#define OFS_SCRATCH_PAD (7*REG_OFFSET) + +#define OFS_DIVISOR_LSB (0*REG_OFFSET) +#define OFS_DIVISOR_MSB (1*REG_OFFSET) + + +/* memory-mapped read/write of the port */ +#define UART16550_READ(y) (*((volatile uint8*)(BASE + y))) +#define UART16550_WRITE(y, z) ((*((volatile uint8*)(BASE + y))) = z) + +void Uart16550Init(uint32 baud, uint8 data, uint8 parity, uint8 stop) +{ + /* disable interrupts */ + UART16550_WRITE(OFS_LINE_CONTROL, 0x0); + UART16550_WRITE(OFS_INTR_ENABLE, 0); + + /* set up buad rate */ + { + uint32 divisor; + + /* set DIAB bit */ + UART16550_WRITE(OFS_LINE_CONTROL, 0x80); + + /* set divisor */ + divisor = MAX_BAUD / baud; + UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff); + UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00)>>8); + + /* clear DIAB bit */ + UART16550_WRITE(OFS_LINE_CONTROL, 0x0); + } + + /* set data format */ + UART16550_WRITE(OFS_DATA_FORMAT, data | parity | stop); +} + +uint8 Uart16550GetPoll(void) +{ + while((UART16550_READ(OFS_LINE_STATUS) & 0x1) == 0); + return UART16550_READ(OFS_RCV_BUFFER); +} + + +void Uart16550Put(uint8 byte) +{ + while ((UART16550_READ(OFS_LINE_STATUS) &0x20) == 0); + UART16550_WRITE(OFS_SEND_BUFFER, byte); +} + +/* ---------------------------------------------------------- */ + +void debug_out(char * msg, int len) +{ + int i; + +#if (INIT_SERIAL_PORT == 1) + static int serial_port_initialized=0; + if (!serial_port_initialized) { + serial_port_initialized = 1; + Uart16550Init(DEFAULT_BAUD, DEFAULT_DATA, DEFAULT_PARITY, DEFAULT_STOP); + } +#endif + + for (i=0; i< len; i++) { + if (msg[i] == '\n') { + Uart16550Put('\r'); + Uart16550Put('\n'); + } else { + Uart16550Put(msg[i]); + } + } }