1 2#include <asm/serial.h> /* For the serial port location and base baud */ 3 4/* --- CONFIG --- */ 5 6typedef unsigned char uint8; 7typedef unsigned int uint32; 8 9/* --- END OF CONFIG --- */ 10 11#define UART16550_BAUD_2400 2400 12#define UART16550_BAUD_4800 4800 13#define UART16550_BAUD_9600 9600 14#define UART16550_BAUD_19200 19200 15#define UART16550_BAUD_38400 38400 16#define UART16550_BAUD_57600 57600 17#define UART16550_BAUD_115200 115200 18 19#define UART16550_PARITY_NONE 0 20#define UART16550_PARITY_ODD 0x08 21#define UART16550_PARITY_EVEN 0x18 22#define UART16550_PARITY_MARK 0x28 23#define UART16550_PARITY_SPACE 0x38 24 25#define UART16550_DATA_5BIT 0x0 26#define UART16550_DATA_6BIT 0x1 27#define UART16550_DATA_7BIT 0x2 28#define UART16550_DATA_8BIT 0x3 29 30#define UART16550_STOP_1BIT 0x0 31#define UART16550_STOP_2BIT 0x4 32 33/* ----------------------------------------------------- */ 34 35/* === CONFIG === */ 36 37/* [jsun] we use the second serial port for kdb */ 38#define BASE OCELOT_SERIAL1_BASE 39#define MAX_BAUD OCELOT_BASE_BAUD 40 41/* === END OF CONFIG === */ 42 43#define REG_OFFSET 4 44 45/* register offset */ 46#define OFS_RCV_BUFFER 0 47#define OFS_TRANS_HOLD 0 48#define OFS_SEND_BUFFER 0 49#define OFS_INTR_ENABLE (1*REG_OFFSET) 50#define OFS_INTR_ID (2*REG_OFFSET) 51#define OFS_DATA_FORMAT (3*REG_OFFSET) 52#define OFS_LINE_CONTROL (3*REG_OFFSET) 53#define OFS_MODEM_CONTROL (4*REG_OFFSET) 54#define OFS_RS232_OUTPUT (4*REG_OFFSET) 55#define OFS_LINE_STATUS (5*REG_OFFSET) 56#define OFS_MODEM_STATUS (6*REG_OFFSET) 57#define OFS_RS232_INPUT (6*REG_OFFSET) 58#define OFS_SCRATCH_PAD (7*REG_OFFSET) 59 60#define OFS_DIVISOR_LSB (0*REG_OFFSET) 61#define OFS_DIVISOR_MSB (1*REG_OFFSET) 62 63 64/* memory-mapped read/write of the port */ 65#define UART16550_READ(y) (*((volatile uint8*)(BASE + y))) 66#define UART16550_WRITE(y, z) ((*((volatile uint8*)(BASE + y))) = z) 67 68void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop) 69{ 70 /* disable interrupts */ 71 UART16550_WRITE(OFS_INTR_ENABLE, 0); 72 73 /* set up baud rate */ 74 { 75 uint32 divisor; 76 77 /* set DIAB bit */ 78 UART16550_WRITE(OFS_LINE_CONTROL, 0x80); 79 80 /* set divisor */ 81 divisor = MAX_BAUD / baud; 82 UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff); 83 UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00) >> 8); 84 85 /* clear DIAB bit */ 86 UART16550_WRITE(OFS_LINE_CONTROL, 0x0); 87 } 88 89 /* set data format */ 90 UART16550_WRITE(OFS_DATA_FORMAT, data | parity | stop); 91} 92 93static int remoteDebugInitialized = 0; 94 95uint8 getDebugChar(void) 96{ 97 if (!remoteDebugInitialized) { 98 remoteDebugInitialized = 1; 99 debugInit(UART16550_BAUD_38400, 100 UART16550_DATA_8BIT, 101 UART16550_PARITY_NONE, UART16550_STOP_1BIT); 102 } 103 104 while ((UART16550_READ(OFS_LINE_STATUS) & 0x1) == 0); 105 return UART16550_READ(OFS_RCV_BUFFER); 106} 107 108 109int putDebugChar(uint8 byte) 110{ 111 if (!remoteDebugInitialized) { 112 remoteDebugInitialized = 1; 113 debugInit(UART16550_BAUD_38400, 114 UART16550_DATA_8BIT, 115 UART16550_PARITY_NONE, UART16550_STOP_1BIT); 116 } 117 118 while ((UART16550_READ(OFS_LINE_STATUS) & 0x20) == 0); 119 UART16550_WRITE(OFS_SEND_BUFFER, byte); 120 return 1; 121} 122