• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/arch/mips/gt64120/momenco_ocelot/
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