Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #ifndef _IPXE_UART_H
  2. #define _IPXE_UART_H
  3. /** @file
  4. *
  5. * 16550-compatible UART
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stdint.h>
  10. /** Transmitter holding register */
  11. #define UART_THR 0x00
  12. /** Receiver buffer register */
  13. #define UART_RBR 0x00
  14. /** Interrupt enable register */
  15. #define UART_IER 0x01
  16. /** FIFO control register */
  17. #define UART_FCR 0x02
  18. #define UART_FCR_FE 0x01 /**< FIFO enable */
  19. /** Line control register */
  20. #define UART_LCR 0x03
  21. #define UART_LCR_WLS0 0x01 /**< Word length select bit 0 */
  22. #define UART_LCR_WLS1 0x02 /**< Word length select bit 1 */
  23. #define UART_LCR_STB 0x04 /**< Number of stop bits */
  24. #define UART_LCR_PEN 0x08 /**< Parity enable */
  25. #define UART_LCR_EPS 0x10 /**< Even parity select */
  26. #define UART_LCR_DLAB 0x80 /**< Divisor latch access bit */
  27. #define UART_LCR_WORD_LEN(x) ( ( (x) - 5 ) << 0 ) /**< Word length */
  28. #define UART_LCR_STOP_BITS(x) ( ( (x) - 1 ) << 2 ) /**< Stop bits */
  29. #define UART_LCR_PARITY(x) ( ( (x) - 0 ) << 3 ) /**< Parity */
  30. /**
  31. * Calculate line control register value
  32. *
  33. * @v word_len Word length (5-8)
  34. * @v parity Parity (0=none, 1=odd, 3=even)
  35. * @v stop_bits Stop bits (1-2)
  36. * @ret lcr Line control register value
  37. */
  38. #define UART_LCR_WPS( word_len, parity, stop_bits ) \
  39. ( UART_LCR_WORD_LEN ( (word_len) ) | \
  40. UART_LCR_PARITY ( (parity) ) | \
  41. UART_LCR_STOP_BITS ( (stop_bits) ) )
  42. /** Default LCR value: 8 data bits, no parity, one stop bit */
  43. #define UART_LCR_8N1 UART_LCR_WPS ( 8, 0, 1 )
  44. /** Modem control register */
  45. #define UART_MCR 0x04
  46. #define UART_MCR_DTR 0x01 /**< Data terminal ready */
  47. #define UART_MCR_RTS 0x02 /**< Request to send */
  48. /** Line status register */
  49. #define UART_LSR 0x05
  50. #define UART_LSR_DR 0x01 /**< Data ready */
  51. #define UART_LSR_THRE 0x20 /**< Transmitter holding register empty */
  52. #define UART_LSR_TEMT 0x40 /**< Transmitter empty */
  53. /** Scratch register */
  54. #define UART_SCR 0x07
  55. /** Divisor latch (least significant byte) */
  56. #define UART_DLL 0x00
  57. /** Divisor latch (most significant byte) */
  58. #define UART_DLM 0x01
  59. /** Maximum baud rate */
  60. #define UART_MAX_BAUD 115200
  61. /** A 16550-compatible UART */
  62. struct uart {
  63. /** I/O port base address */
  64. void *base;
  65. /** Baud rate divisor */
  66. uint16_t divisor;
  67. /** Line control register */
  68. uint8_t lcr;
  69. };
  70. /** Symbolic names for port indexes */
  71. enum uart_port {
  72. COM1 = 1,
  73. COM2 = 2,
  74. COM3 = 3,
  75. COM4 = 4,
  76. };
  77. #include <bits/uart.h>
  78. void uart_write ( struct uart *uart, unsigned int addr, uint8_t data );
  79. uint8_t uart_read ( struct uart *uart, unsigned int addr );
  80. int uart_select ( struct uart *uart, unsigned int port );
  81. /**
  82. * Check if received data is ready
  83. *
  84. * @v uart UART
  85. * @ret ready Data is ready
  86. */
  87. static inline int uart_data_ready ( struct uart *uart ) {
  88. uint8_t lsr;
  89. lsr = uart_read ( uart, UART_LSR );
  90. return ( lsr & UART_LSR_DR );
  91. }
  92. /**
  93. * Receive data
  94. *
  95. * @v uart UART
  96. * @ret data Data
  97. */
  98. static inline uint8_t uart_receive ( struct uart *uart ) {
  99. return uart_read ( uart, UART_RBR );
  100. }
  101. extern void uart_transmit ( struct uart *uart, uint8_t data );
  102. extern void uart_flush ( struct uart *uart );
  103. extern int uart_exists ( struct uart *uart );
  104. extern int uart_init ( struct uart *uart, unsigned int baud, uint8_t lcr );
  105. #endif /* _IPXE_UART_H */