/* ------------------------------------------ | |
* Copyright (c) 2016, Synopsys, Inc. All rights reserved. | |
* Redistribution and use in source and binary forms, with or without modification, | |
* are permitted provided that the following conditions are met: | |
* 1) Redistributions of source code must retain the above copyright notice, this | |
* list of conditions and the following disclaimer. | |
* 2) Redistributions in binary form must reproduce the above copyright notice, | |
* this list of conditions and the following disclaimer in the documentation and/or | |
* other materials provided with the distribution. | |
* 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may | |
* be used to endorse or promote products derived from this software without | |
* specific prior written permission. | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR | |
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
* | |
* \version 2016.05 | |
* \date 2014-07-03 | |
* \author Huaqi Fang(Huaqi.Fang@synopsys.com) | |
--------------------------------------------- */ | |
/** | |
* \defgroup BOARD_EMSK_DRV_DW_UART_OBJ EMSK DW UART Object | |
* \ingroup BOARD_EMSK_DRIVER | |
* \brief EMSK Designware UART Objects | |
* \details | |
* Realize the EMSK board uart object using Designware uart device driver, | |
* only need to realize some Designware uart structures combine with EMSK uart | |
* hardware resource. just like cpp class instantiation. | |
*/ | |
/** | |
* \file | |
* \ingroup BOARD_EMSK_DRV_DW_UART_OBJ | |
* \brief designware uart object instantiation on emsk | |
*/ | |
/** | |
* \addtogroup BOARD_EMSK_DRV_DW_UART_OBJ | |
* @{ | |
*/ | |
#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 "board/emsk/uart/dw_uart_obj.h" | |
#include "board/emsk/emsk.h" | |
#ifdef ARC_FEATURE_DMP_PERIPHERAL | |
#define PERIPHERAL_BASE ARC_FEATURE_DMP_PERIPHERAL | |
#else | |
#define PERIPHERAL_BASE _arc_aux_read(AUX_DMP_PERIPHERAL) | |
#endif | |
#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 | |
} | |
/** @} end of group BOARD_EMSK_DRV_DW_UART_OBJ */ |