ns16550.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * NS16550 Serial Port
  3. * originally from linux source (arch/ppc/boot/ns16550.h)
  4. * modified slightly to
  5. * have addresses as offsets from CONFIG_SYS_ISA_BASE
  6. * added a few more definitions
  7. * added prototypes for ns16550.c
  8. * reduced no of com ports to 2
  9. * modifications (c) Rob Taylor, Flying Pig Systems. 2000.
  10. *
  11. * added support for port on 64-bit bus
  12. * by Richard Danter (richard.danter@windriver.com), (C) 2005 Wind River Systems
  13. */
  14. #if (CONFIG_SYS_NS16550_REG_SIZE == 1)
  15. struct NS16550 {
  16. unsigned char rbr; /* 0 */
  17. unsigned char ier; /* 1 */
  18. unsigned char fcr; /* 2 */
  19. unsigned char lcr; /* 3 */
  20. unsigned char mcr; /* 4 */
  21. unsigned char lsr; /* 5 */
  22. unsigned char msr; /* 6 */
  23. unsigned char scr; /* 7 */
  24. #if defined(CONFIG_OMAP730)
  25. unsigned char mdr1; /* 8 */
  26. unsigned char reg9; /* 9 */
  27. unsigned char regA; /* A */
  28. unsigned char regB; /* B */
  29. unsigned char regC; /* C */
  30. unsigned char regD; /* D */
  31. unsigned char regE; /* E */
  32. unsigned char regF; /* F */
  33. unsigned char reg10; /* 10 */
  34. unsigned char ssr; /* 11*/
  35. #endif
  36. } __attribute__ ((packed));
  37. #elif (CONFIG_SYS_NS16550_REG_SIZE == 2)
  38. struct NS16550 {
  39. unsigned short rbr; /* 0 */
  40. unsigned short ier; /* 1 */
  41. unsigned short fcr; /* 2 */
  42. unsigned short lcr; /* 3 */
  43. unsigned short mcr; /* 4 */
  44. unsigned short lsr; /* 5 */
  45. unsigned short msr; /* 6 */
  46. unsigned short scr; /* 7 */
  47. } __attribute__ ((packed));
  48. #elif (CONFIG_SYS_NS16550_REG_SIZE == 4)
  49. struct NS16550 {
  50. unsigned long rbr; /* 0 r */
  51. unsigned long ier; /* 1 rw */
  52. unsigned long fcr; /* 2 w */
  53. unsigned long lcr; /* 3 rw */
  54. unsigned long mcr; /* 4 rw */
  55. unsigned long lsr; /* 5 r */
  56. unsigned long msr; /* 6 r */
  57. unsigned long scr; /* 7 rw */
  58. }; /* No need to pack an already aligned struct */
  59. #elif (CONFIG_SYS_NS16550_REG_SIZE == -4)
  60. struct NS16550 {
  61. unsigned char rbr; /* 0 */
  62. int pad1:24;
  63. unsigned char ier; /* 1 */
  64. int pad2:24;
  65. unsigned char fcr; /* 2 */
  66. int pad3:24;
  67. unsigned char lcr; /* 3 */
  68. int pad4:24;
  69. unsigned char mcr; /* 4 */
  70. int pad5:24;
  71. unsigned char lsr; /* 5 */
  72. int pad6:24;
  73. unsigned char msr; /* 6 */
  74. int pad7:24;
  75. unsigned char scr; /* 7 */
  76. int pad8:24;
  77. #if defined(CONFIG_OMAP)
  78. unsigned char mdr1; /* mode select reset TL16C750*/
  79. #endif
  80. #ifdef CONFIG_OMAP1510
  81. int pad9:24;
  82. unsigned long pad[10];
  83. unsigned char osc_12m_sel;
  84. int pad10:24;
  85. #endif
  86. } __attribute__ ((packed));
  87. #elif (CONFIG_SYS_NS16550_REG_SIZE == -8)
  88. struct NS16550 {
  89. unsigned char rbr; /* 0 */
  90. unsigned char pad0[7];
  91. unsigned char ier; /* 1 */
  92. unsigned char pad1[7];
  93. unsigned char fcr; /* 2 */
  94. unsigned char pad2[7];
  95. unsigned char lcr; /* 3 */
  96. unsigned char pad3[7];
  97. unsigned char mcr; /* 4 */
  98. unsigned char pad4[7];
  99. unsigned char lsr; /* 5 */
  100. unsigned char pad5[7];
  101. unsigned char msr; /* 6 */
  102. unsigned char pad6[7];
  103. unsigned char scr; /* 7 */
  104. unsigned char pad7[7];
  105. } __attribute__ ((packed));
  106. #else
  107. #error "Please define NS16550 registers size."
  108. #endif
  109. #define thr rbr
  110. #define iir fcr
  111. #define dll rbr
  112. #define dlm ier
  113. typedef volatile struct NS16550 *NS16550_t;
  114. #define FCR_FIFO_EN 0x01 /* Fifo enable */
  115. #define FCR_RXSR 0x02 /* Receiver soft reset */
  116. #define FCR_TXSR 0x04 /* Transmitter soft reset */
  117. #define MCR_DTR 0x01
  118. #define MCR_RTS 0x02
  119. #define MCR_DMA_EN 0x04
  120. #define MCR_TX_DFR 0x08
  121. #define LCR_WLS_MSK 0x03 /* character length select mask */
  122. #define LCR_WLS_5 0x00 /* 5 bit character length */
  123. #define LCR_WLS_6 0x01 /* 6 bit character length */
  124. #define LCR_WLS_7 0x02 /* 7 bit character length */
  125. #define LCR_WLS_8 0x03 /* 8 bit character length */
  126. #define LCR_STB 0x04 /* Number of stop Bits, off = 1, on = 1.5 or 2) */
  127. #define LCR_PEN 0x08 /* Parity eneble */
  128. #define LCR_EPS 0x10 /* Even Parity Select */
  129. #define LCR_STKP 0x20 /* Stick Parity */
  130. #define LCR_SBRK 0x40 /* Set Break */
  131. #define LCR_BKSE 0x80 /* Bank select enable */
  132. #define LSR_DR 0x01 /* Data ready */
  133. #define LSR_OE 0x02 /* Overrun */
  134. #define LSR_PE 0x04 /* Parity error */
  135. #define LSR_FE 0x08 /* Framing error */
  136. #define LSR_BI 0x10 /* Break */
  137. #define LSR_THRE 0x20 /* Xmit holding register empty */
  138. #define LSR_TEMT 0x40 /* Xmitter empty */
  139. #define LSR_ERR 0x80 /* Error */
  140. #ifdef CONFIG_OMAP1510
  141. #define OSC_12M_SEL 0x01 /* selects 6.5 * current clk div */
  142. #endif
  143. /* useful defaults for LCR */
  144. #define LCR_8N1 0x03
  145. void NS16550_init (NS16550_t com_port, int baud_divisor);
  146. void NS16550_putc (NS16550_t com_port, char c);
  147. char NS16550_getc (NS16550_t com_port);
  148. int NS16550_tstc (NS16550_t com_port);
  149. void NS16550_reinit (NS16550_t com_port, int baud_divisor);