123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #include "uart.h"
- #include <common/kprint.h>
- #define UART_MAX_BITS_RATE 115200
- #define serial_received(p) ((io_in8(p + 5) & 1))
- #define is_transmit_empty(p) ((io_in8(p + 5) & 0x20))
- int uart_init(uint32_t port, uint32_t bits_rate)
- {
-
- if (bits_rate > UART_MAX_BITS_RATE || UART_MAX_BITS_RATE % bits_rate != 0)
- return E_UART_BITS_RATE_ERROR;
- io_out8(port + 1, 0x00);
- io_out8(port + 3, 0x80);
- uint16_t divisor = UART_MAX_BITS_RATE / bits_rate;
-
- io_out8(port + 0, divisor & 0xff);
- io_out8(port + 1, (divisor >> 8) & 0xff);
- io_out8(port + 3, 0x03);
- io_out8(port + 2, 0xC7);
- io_out8(port + 4, 0x08);
- io_out8(port + 4, 0x1E);
- io_out8(port + 0, 0xAE);
-
- if (io_in8(port + 0) != 0xAE)
- {
- return E_UART_SERIAL_FAULT;
- }
-
-
- io_out8(port + 4, 0x08);
- char init_text2[] = "uart initialized.\n";
- for (int i = 0; i < sizeof(init_text2) - 1; ++i)
- uart_send(COM1, init_text2[i]);
- return UART_SUCCESS;
-
- }
- void uart_send(uint32_t port, char c)
- {
- while (is_transmit_empty(port) == 0)
- pause();
- io_out8(port, c);
- }
- uchar uart_read(uint32_t port)
- {
- while (serial_received(port) == 0)
- pause();
- return io_in8(port);
- }
- void uart_send_str(uint32_t port, const char *str)
- {
- if ((unlikely(str == NULL)))
- return;
- while (1)
- {
- if (unlikely(*str == '\0'))
- return;
- uart_send(port, *str);
- ++str;
- }
- }
|