kgdb_io.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. /* ======================= CONFIG ======================== */
  14. /* [jsun] we use the second serial port for kdb */
  15. #define BASE 0xbfa04240
  16. #define MAX_BAUD 115200
  17. /* distance in bytes between two serial registers */
  18. #define REG_OFFSET 8
  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 baud 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. }