PageRenderTime 18ms CodeModel.GetById 8ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/mips/ddb5xxx/ddb5477/kgdb_io.c

https://bitbucket.org/evzijst/gittest
C | 136 lines | 78 code | 27 blank | 31 comment | 6 complexity | fb10b8d1d1fc53275685876e7ce35ea0 MD5 | raw file
  1/*
  2 * kgdb io functions for DDB5477.  We use the second serial port (upper one).
  3 *
  4 * Copyright (C) 2001 MontaVista Software Inc.
  5 * Author: jsun@mvista.com or jsun@junsun.net
  6 *
  7 * This program is free software; you can redistribute  it and/or modify it
  8 * under  the terms of  the GNU General  Public License as published by the
  9 * Free Software Foundation;  either version 2 of the  License, or (at your
 10 * option) any later version.
 11 *
 12 */
 13
 14/* ======================= CONFIG ======================== */
 15
 16/* [jsun] we use the second serial port for kdb */
 17#define         BASE                    0xbfa04240
 18#define         MAX_BAUD                115200
 19
 20/* distance in bytes between two serial registers */
 21#define         REG_OFFSET              8
 22
 23/*
 24 * 0 - kgdb does serial init
 25 * 1 - kgdb skip serial init
 26 */
 27static int remoteDebugInitialized = 0;
 28
 29/*
 30 * the default baud rate *if* kgdb does serial init
 31 */
 32#define		BAUD_DEFAULT		UART16550_BAUD_38400
 33
 34/* ======================= END OF CONFIG ======================== */
 35
 36typedef unsigned char uint8;
 37typedef unsigned int uint32;
 38
 39#define         UART16550_BAUD_2400             2400
 40#define         UART16550_BAUD_4800             4800
 41#define         UART16550_BAUD_9600             9600
 42#define         UART16550_BAUD_19200            19200
 43#define         UART16550_BAUD_38400            38400
 44#define         UART16550_BAUD_57600            57600
 45#define         UART16550_BAUD_115200           115200
 46
 47#define         UART16550_PARITY_NONE           0
 48#define         UART16550_PARITY_ODD            0x08
 49#define         UART16550_PARITY_EVEN           0x18
 50#define         UART16550_PARITY_MARK           0x28
 51#define         UART16550_PARITY_SPACE          0x38
 52
 53#define         UART16550_DATA_5BIT             0x0
 54#define         UART16550_DATA_6BIT             0x1
 55#define         UART16550_DATA_7BIT             0x2
 56#define         UART16550_DATA_8BIT             0x3
 57
 58#define         UART16550_STOP_1BIT             0x0
 59#define         UART16550_STOP_2BIT             0x4
 60
 61/* register offset */
 62#define         OFS_RCV_BUFFER          0
 63#define         OFS_TRANS_HOLD          0
 64#define         OFS_SEND_BUFFER         0
 65#define         OFS_INTR_ENABLE         (1*REG_OFFSET)
 66#define         OFS_INTR_ID             (2*REG_OFFSET)
 67#define         OFS_DATA_FORMAT         (3*REG_OFFSET)
 68#define         OFS_LINE_CONTROL        (3*REG_OFFSET)
 69#define         OFS_MODEM_CONTROL       (4*REG_OFFSET)
 70#define         OFS_RS232_OUTPUT        (4*REG_OFFSET)
 71#define         OFS_LINE_STATUS         (5*REG_OFFSET)
 72#define         OFS_MODEM_STATUS        (6*REG_OFFSET)
 73#define         OFS_RS232_INPUT         (6*REG_OFFSET)
 74#define         OFS_SCRATCH_PAD         (7*REG_OFFSET)
 75
 76#define         OFS_DIVISOR_LSB         (0*REG_OFFSET)
 77#define         OFS_DIVISOR_MSB         (1*REG_OFFSET)
 78
 79
 80/* memory-mapped read/write of the port */
 81#define         UART16550_READ(y)    (*((volatile uint8*)(BASE + y)))
 82#define         UART16550_WRITE(y, z)  ((*((volatile uint8*)(BASE + y))) = z)
 83
 84void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
 85{
 86        /* disable interrupts */
 87        UART16550_WRITE(OFS_INTR_ENABLE, 0);
 88
 89        /* set up buad rate */
 90        {
 91                uint32 divisor;
 92
 93                /* set DIAB bit */
 94                UART16550_WRITE(OFS_LINE_CONTROL, 0x80);
 95
 96                /* set divisor */
 97                divisor = MAX_BAUD / baud;
 98                UART16550_WRITE(OFS_DIVISOR_LSB, divisor & 0xff);
 99                UART16550_WRITE(OFS_DIVISOR_MSB, (divisor & 0xff00) >> 8);
100
101                /* clear DIAB bit */
102                UART16550_WRITE(OFS_LINE_CONTROL, 0x0);
103        }
104
105        /* set data format */
106        UART16550_WRITE(OFS_DATA_FORMAT, data | parity | stop);
107}
108
109
110uint8 getDebugChar(void)
111{
112        if (!remoteDebugInitialized) {
113                remoteDebugInitialized = 1;
114                debugInit(BAUD_DEFAULT,
115                          UART16550_DATA_8BIT,
116                          UART16550_PARITY_NONE, UART16550_STOP_1BIT);
117        }
118
119        while ((UART16550_READ(OFS_LINE_STATUS) & 0x1) == 0);
120        return UART16550_READ(OFS_RCV_BUFFER);
121}
122
123
124int putDebugChar(uint8 byte)
125{
126        if (!remoteDebugInitialized) {
127                remoteDebugInitialized = 1;
128                debugInit(BAUD_DEFAULT,
129                          UART16550_DATA_8BIT,
130                          UART16550_PARITY_NONE, UART16550_STOP_1BIT);
131        }
132
133        while ((UART16550_READ(OFS_LINE_STATUS) & 0x20) == 0);
134        UART16550_WRITE(OFS_SEND_BUFFER, byte);
135        return 1;
136}