dbg_io.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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