ea550cbb995f57e664b190d64d001a4851e4ab84
[lunaix-os.git] / lunaix-os / hal / char / uart / 16x50_pmio.c
1 /**
2  * @file 16550_pmio.c
3  * @author Lunaixsky (lunaxisky@qq.com)
4  * @brief 16550 UART with port mapped IO
5  * @version 0.1
6  * @date 2023-08-30
7  *
8  * @copyright Copyright (c) 2023
9  *
10  */
11 #include <lunaix/device.h>
12 #include <asm-generic/isrm.h>
13
14 #include <asm/x86_pmio.h>
15
16 #include "16x50.h"
17
18 #define DELAY 50
19
20 static u32_t
21 com_regread(struct uart16550* uart, ptr_t regoff)
22 {
23     u8_t val = port_rdbyte(uart->base_addr + regoff);
24     port_delay(DELAY);
25
26     return (u32_t)val;
27 }
28
29 static void
30 com_regwrite(struct uart16550* uart, ptr_t regoff, u32_t val)
31 {
32     port_wrbyte(uart->base_addr + regoff, (u8_t)val);
33     port_delay(DELAY);
34 }
35
36
37 struct uart16550*
38 uart16x50_pmio_create(ptr_t base)
39 {
40     struct uart16550* uart;
41
42     uart = uart_alloc(base);
43     uart->read_reg = com_regread;
44     uart->write_reg = com_regwrite;
45
46     if (!uart_testport(uart, 0xe3)) {
47         uart_free(uart);
48         return NULL;
49     }
50
51     uart_enable_fifo(uart, UART_FIFO8);
52
53     return uart;
54 }