1d6aed566Sopenharmony_ci/*
2d6aed566Sopenharmony_ci * Copyright (c) 2022-2022 Huawei Device Co., Ltd.
3d6aed566Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d6aed566Sopenharmony_ci * you may not use this file except in compliance with the License.
5d6aed566Sopenharmony_ci * You may obtain a copy of the License at
6d6aed566Sopenharmony_ci *
7d6aed566Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d6aed566Sopenharmony_ci *
9d6aed566Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d6aed566Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d6aed566Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d6aed566Sopenharmony_ci * See the License for the specific language governing permissions and
13d6aed566Sopenharmony_ci * limitations under the License.
14d6aed566Sopenharmony_ci */
15d6aed566Sopenharmony_ci
16d6aed566Sopenharmony_ci#include "uart.h"
17d6aed566Sopenharmony_ci#include "arm_uart_drv.h"
18d6aed566Sopenharmony_ci#include "stdio.h"
19d6aed566Sopenharmony_ci#include "los_config.h"
20d6aed566Sopenharmony_ci#include "los_reg.h"
21d6aed566Sopenharmony_ci#include "los_interrupt.h"
22d6aed566Sopenharmony_ci#include "los_event.h"
23d6aed566Sopenharmony_ci
24d6aed566Sopenharmony_ci#ifdef __cplusplus
25d6aed566Sopenharmony_ci#if __cplusplus
26d6aed566Sopenharmony_ciextern "C" {
27d6aed566Sopenharmony_ci#endif
28d6aed566Sopenharmony_ci#endif
29d6aed566Sopenharmony_ci
30d6aed566Sopenharmony_cistatic const struct arm_uart_dev_cfg_t g_uartCfg = {UART0_BASE, 115200};
31d6aed566Sopenharmony_cistatic struct arm_uart_dev_data_t g_uartData = {0};
32d6aed566Sopenharmony_cistruct arm_uart_dev_t g_uartDev;
33d6aed566Sopenharmony_ci
34d6aed566Sopenharmony_ciINT32 UartGetc(VOID)
35d6aed566Sopenharmony_ci{
36d6aed566Sopenharmony_ci    UINT8 c;
37d6aed566Sopenharmony_ci    if (arm_uart_read(&g_uartDev, &c) == ARM_UART_ERR_NOT_READY) {
38d6aed566Sopenharmony_ci        return 0;
39d6aed566Sopenharmony_ci    }
40d6aed566Sopenharmony_ci
41d6aed566Sopenharmony_ci    return c;
42d6aed566Sopenharmony_ci}
43d6aed566Sopenharmony_ci
44d6aed566Sopenharmony_ciINT32 UartPutc(INT32 c, VOID *file)
45d6aed566Sopenharmony_ci{
46d6aed566Sopenharmony_ci    return arm_uart_write(&g_uartDev, (UINT8)c);
47d6aed566Sopenharmony_ci}
48d6aed566Sopenharmony_ci
49d6aed566Sopenharmony_ciVOID UartReceiveHandler(VOID)
50d6aed566Sopenharmony_ci{
51d6aed566Sopenharmony_ci    if (arm_uart_get_interrupt_status(&g_uartDev) == ARM_UART_IRQ_RX) {
52d6aed566Sopenharmony_ci        (void)LOS_EventWrite(&g_shellInputEvent, 0x1);
53d6aed566Sopenharmony_ci        (void)arm_uart_clear_interrupt(&g_uartDev, ARM_UART_IRQ_RX);
54d6aed566Sopenharmony_ci    }
55d6aed566Sopenharmony_ci    return;
56d6aed566Sopenharmony_ci}
57d6aed566Sopenharmony_ci
58d6aed566Sopenharmony_ciVOID UartInit(VOID)
59d6aed566Sopenharmony_ci{
60d6aed566Sopenharmony_ci    g_uartDev.cfg = &g_uartCfg;
61d6aed566Sopenharmony_ci    g_uartDev.data = &g_uartData;
62d6aed566Sopenharmony_ci    (void)arm_uart_init(&g_uartDev, UART0_CLK_FREQ);
63d6aed566Sopenharmony_ci    return;
64d6aed566Sopenharmony_ci}
65d6aed566Sopenharmony_ci
66d6aed566Sopenharmony_ciVOID Uart0RxIrqRegister(VOID)
67d6aed566Sopenharmony_ci{
68d6aed566Sopenharmony_ci    (void)arm_uart_irq_rx_enable(&g_uartDev);
69d6aed566Sopenharmony_ci    (void)LOS_HwiCreate(UART0_RX_IRQn, 0, 0, (HWI_PROC_FUNC)UartReceiveHandler, 0);
70d6aed566Sopenharmony_ci    return;
71d6aed566Sopenharmony_ci}
72d6aed566Sopenharmony_ci#ifdef __cplusplus
73d6aed566Sopenharmony_ci#if __cplusplus
74d6aed566Sopenharmony_ci}
75d6aed566Sopenharmony_ci#endif /* __cplusplus */
76d6aed566Sopenharmony_ci#endif /* __cplusplus */
77