123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*
- * Copyright (c) 2018, Synopsys, Inc.
- *
- * SPDX-License-Identifier: Apache-2.0
- */
- #include "inc/arc/arc.h"
- #include "inc/arc/arc_builtin.h"
- #include "inc/embARC_toolchain.h"
- #include "inc/embARC_error.h"
- #include "inc/arc/arc_exception.h"
- #include "device/designware/uart/dw_uart.h"
- #include "dw_uart_obj.h"
- #include "emsk_hardware.h"
- #define DW_UART_FIFO_LEN 32
- /**
- * \name EMSK DesignWare UART 0 Object Instantiation
- * @{
- */
- #if (USE_DW_UART_0)
- static void dw_uart_0_isr(void *ptr);
- #define DW_UART_0_RELBASE (REL_REGBASE_UART0) /*!< designware uart 0 relative baseaddr */
- #define DW_UART_0_INTNO (INTNO_UART0) /*!< designware uart 0 interrupt number */
- DEV_UART dw_uart_0; /*!< designware uart object */
- DW_UART_CTRL dw_uart_0_ctrl = { /*!< designware uart 0 ctrl */
- 0, CLK_BUS_APB, DW_UART_0_INTNO, (INT_HANDLER)dw_uart_0_isr,
- DW_UART_FIFO_LEN, DW_UART_FIFO_LEN, 0
- };
- /** designware uart 0 open */
- static int32_t dw_uart_0_open (uint32_t baud)
- {
- return dw_uart_open(&dw_uart_0, baud);
- }
- /** designware uart 0 close */
- static int32_t dw_uart_0_close (void)
- {
- return dw_uart_close(&dw_uart_0);
- }
- /** designware uart 0 control */
- static int32_t dw_uart_0_control (uint32_t ctrl_cmd, void *param)
- {
- return dw_uart_control(&dw_uart_0, ctrl_cmd, param);
- }
- /** designware uart 0 write */
- static int32_t dw_uart_0_write (const void *data, uint32_t len)
- {
- return dw_uart_write(&dw_uart_0, data, len);
- }
- /** designware uart 0 close */
- static int32_t dw_uart_0_read (void *data, uint32_t len)
- {
- return dw_uart_read(&dw_uart_0, data, len);
- }
- /** designware uart 0 interrupt rountine */
- static void dw_uart_0_isr(void *ptr)
- {
- dw_uart_isr(&dw_uart_0, ptr);
- }
- /** install designware uart 0 to system */
- static void dw_uart_0_install(void)
- {
- uint32_t uart_abs_base = 0;
- DEV_UART *dw_uart_ptr = &dw_uart_0;
- DEV_UART_INFO *dw_uart_info_ptr = &(dw_uart_0.uart_info);
- DW_UART_CTRL *dw_uart_ctrl_ptr = &dw_uart_0_ctrl;
- /**
- * get absolute designware base address
- */
- uart_abs_base = (uint32_t)PERIPHERAL_BASE + DW_UART_0_RELBASE;
- dw_uart_ctrl_ptr->dw_uart_regbase = uart_abs_base;
- /** uart info init */
- dw_uart_info_ptr->uart_ctrl = (void *)dw_uart_ctrl_ptr;
- dw_uart_info_ptr->opn_cnt = 0;
- dw_uart_info_ptr->status = 0;
- dw_uart_info_ptr->baudrate = UART_BAUDRATE_115200; /* default 115200bps */
- /** uart dev init */
- dw_uart_ptr->uart_open = dw_uart_0_open;
- dw_uart_ptr->uart_close = dw_uart_0_close;
- dw_uart_ptr->uart_control = dw_uart_0_control;
- dw_uart_ptr->uart_write = dw_uart_0_write;
- dw_uart_ptr->uart_read = dw_uart_0_read;
- }
- #endif /* USE_DW_UART_0 */
- /** @} end of name */
- /**
- * \name EMSK DesignWare UART 1 Object Instantiation
- * @{
- */
- #if (USE_DW_UART_1)
- static void dw_uart_1_isr(void *ptr);
- #define DW_UART_1_RELBASE (REL_REGBASE_UART1) /*!< designware uart 1 relative baseaddr */
- #define DW_UART_1_INTNO (INTNO_UART1) /*!< designware uart 1 interrupt number */
- DEV_UART dw_uart_1; /*!< designware uart 1 object */
- DW_UART_CTRL dw_uart_1_ctrl = { /*!< designware uart 1 ctrl */
- 0, CLK_BUS_APB, DW_UART_1_INTNO, (INT_HANDLER)dw_uart_1_isr,
- DW_UART_FIFO_LEN, DW_UART_FIFO_LEN, 0
- };
- /** designware uart 1 open */
- static int32_t dw_uart_1_open (uint32_t baud)
- {
- return dw_uart_open(&dw_uart_1, baud);
- }
- /** designware uart 1 close */
- static int32_t dw_uart_1_close (void)
- {
- return dw_uart_close(&dw_uart_1);
- }
- /** designware uart 1 control */
- static int32_t dw_uart_1_control (uint32_t ctrl_cmd, void *param)
- {
- return dw_uart_control(&dw_uart_1, ctrl_cmd, param);
- }
- /** designware uart 1 write */
- static int32_t dw_uart_1_write (const void *data, uint32_t len)
- {
- return dw_uart_write(&dw_uart_1, data, len);
- }
- /** designware uart 1 close */
- static int32_t dw_uart_1_read (void *data, uint32_t len)
- {
- return dw_uart_read(&dw_uart_1, data, len);
- }
- /** designware uart 1 interrupt routine */
- static void dw_uart_1_isr(void *ptr)
- {
- dw_uart_isr(&dw_uart_1, ptr);
- }
- /** install designware uart 1 to system */
- static void dw_uart_1_install(void)
- {
- uint32_t uart_abs_base = 0;
- DEV_UART *dw_uart_ptr = &dw_uart_1;
- DEV_UART_INFO *dw_uart_info_ptr = &(dw_uart_1.uart_info);
- DW_UART_CTRL *dw_uart_ctrl_ptr = &dw_uart_1_ctrl;
- /**
- * get absolute designware base address
- */
- uart_abs_base = (uint32_t)PERIPHERAL_BASE + DW_UART_1_RELBASE;
- dw_uart_ctrl_ptr->dw_uart_regbase = uart_abs_base;
- /** uart info init */
- dw_uart_info_ptr->uart_ctrl = (void *)dw_uart_ctrl_ptr;
- dw_uart_info_ptr->opn_cnt = 0;
- dw_uart_info_ptr->status = 0;
- dw_uart_info_ptr->baudrate = UART_BAUDRATE_115200; /* default 115200bps */
- /** uart dev init */
- dw_uart_ptr->uart_open = dw_uart_1_open;
- dw_uart_ptr->uart_close = dw_uart_1_close;
- dw_uart_ptr->uart_control = dw_uart_1_control;
- dw_uart_ptr->uart_write = dw_uart_1_write;
- dw_uart_ptr->uart_read = dw_uart_1_read;
- }
- #endif /* USE_DW_UART_1 */
- /** @} end of name */
- /** get one designware device structure */
- DEV_UART_PTR uart_get_dev(int32_t uart_id)
- {
- static uint32_t install_flag = 0;
- /* intall device objects */
- if (install_flag == 0) {
- install_flag = 1;
- dw_uart_all_install();
- }
- switch (uart_id) {
- #if (USE_DW_UART_0)
- case DW_UART_0_ID:
- return &dw_uart_0;
- break;
- #endif
- #if (USE_DW_UART_1)
- case DW_UART_1_ID:
- return &dw_uart_1;
- break;
- #endif
- default:
- break;
- }
- return NULL;
- }
- /**
- * \brief install all uart objects
- * \note \b MUST be called during system init
- */
- void dw_uart_all_install(void)
- {
- #if (USE_DW_UART_0)
- dw_uart_0_install();
- #endif
- #if (USE_DW_UART_1)
- dw_uart_1_install();
- #endif
- }
|