/* ------------------------------------------ | |
* 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-24 | |
* \author Wayne Ren(Wei.Ren@synopsys.com) | |
--------------------------------------------- */ | |
/** | |
* \defgroup BOARD_EMSK_DRV_DW_GPIO_OBJ EMSK DW GPIO Object | |
* \ingroup BOARD_EMSK_DRIVER | |
* \brief EMSK Designware GPIO Objects | |
* \details | |
* Implement the EMSK board GPIO object using the DesignWare GPIO device driver. | |
* Only need to implement some DesignWare GPIO structures and combine with EMSK GPIO | |
* hardware resources, like in C++ class instantiation. | |
* For example, in C++, define a class called gpio | |
* class gpio { | |
* | |
* }; | |
* then instantiate the gpio class: | |
* gpio emsk_gpio_a; | |
*/ | |
/** | |
* \file | |
* \ingroup BOARD_EMSK_DRV_DW_GPIO_OBJ | |
* \brief DesignWare GPIO object instantiation on EMSK | |
*/ | |
/** | |
* \addtogroup BOARD_EMSK_DRV_DW_GPIO_OBJ | |
* @{ | |
*/ | |
#include "inc/arc/arc.h" | |
#include "inc/arc/arc_builtin.h" | |
#include "board/emsk/gpio/dw_gpio_obj.h" | |
#include "board/emsk/emsk.h" | |
/* | |
* Uncomment this to enable default | |
* gpio bit handler output message | |
* by uart | |
*/ | |
#ifdef ARC_FEATURE_DMP_PERIPHERAL | |
#define PERIPHERAL_BASE ARC_FEATURE_DMP_PERIPHERAL | |
#else | |
#define PERIPHERAL_BASE _arc_aux_read(AUX_DMP_PERIPHERAL) | |
#endif | |
#if (USE_DW_GPIO_PORT_A) | |
static DEV_GPIO port_a; | |
static DW_GPIO_PORT dw_gpio_port_a; | |
static DEV_GPIO_HANDLER dw_gpio_bit_handler_a[EMSK_GPIO_A_INT_MAX_COUNT]; | |
static DW_GPIO_BIT_ISR dw_gpio_bit_isr_a = | |
{ | |
EMSK_GPIO_A_INT_MAX_COUNT, dw_gpio_bit_handler_a | |
}; | |
static int32_t porta_open(uint32_t dir) | |
{ | |
return dw_gpio_open(&port_a, dir); | |
} | |
static int32_t porta_close(void) | |
{ | |
return dw_gpio_close(&port_a); | |
} | |
static int32_t porta_control(uint32_t ctrl_cmd, void *param) | |
{ | |
return dw_gpio_control(&port_a, ctrl_cmd, param); | |
} | |
static int32_t porta_write(uint32_t val, uint32_t mask) | |
{ | |
return dw_gpio_write(&port_a, val, mask); | |
} | |
static int32_t porta_read(uint32_t *val, uint32_t mask) | |
{ | |
return dw_gpio_read(&port_a, val, mask); | |
} | |
static void porta_isr(void *ptr) | |
{ | |
dw_gpio_isr_handler(&port_a, ptr); | |
} | |
static void porta_install(void) | |
{ | |
uint32_t i; | |
DEV_GPIO_PTR port_ptr = &port_a; | |
DEV_GPIO_INFO_PTR info_ptr = &(port_a.gpio_info); | |
DW_GPIO_PORT_PTR dw_port_ptr = &(dw_gpio_port_a); | |
info_ptr->gpio_ctrl = (void *)dw_port_ptr; | |
info_ptr->opn_cnt = 0; | |
info_ptr->method = 0; | |
info_ptr->direction = 0; | |
info_ptr->extra = 0; | |
dw_port_ptr->no = DW_GPIO_PORT_A; | |
dw_port_ptr->regs = (DW_GPIO_REG_PTR)(PERIPHERAL_BASE | REL_REGBASE_GPIO0); | |
dw_port_ptr->valid_bit_mask = EMSK_GPIO_A_VALID_MASK; | |
dw_port_ptr->intno = INTNO_GPIO; | |
dw_port_ptr->int_handler = porta_isr; | |
for (i = 0; i < dw_gpio_bit_isr_a.int_bit_max_cnt; i++) | |
{ | |
dw_gpio_bit_isr_a.int_bit_handler_ptr[i] = NULL; | |
} | |
dw_port_ptr->gpio_bit_isr = &dw_gpio_bit_isr_a; | |
port_ptr->gpio_open = porta_open; | |
port_ptr->gpio_close = porta_close; | |
port_ptr->gpio_control = porta_control; | |
port_ptr->gpio_write = porta_write; | |
port_ptr->gpio_read = porta_read; | |
} | |
#endif | |
#if (USE_DW_GPIO_PORT_B) | |
static DEV_GPIO port_b; | |
static DW_GPIO_PORT dw_gpio_port_b; | |
static int32_t portb_open(uint32_t dir) | |
{ | |
return dw_gpio_open(&port_b, dir); | |
} | |
static int32_t portb_close(void) | |
{ | |
return dw_gpio_close(&port_b); | |
} | |
static int32_t portb_control(uint32_t ctrl_cmd, void *param) | |
{ | |
return dw_gpio_control(&port_b, ctrl_cmd, param); | |
} | |
static int32_t portb_write(uint32_t val, uint32_t mask) | |
{ | |
return dw_gpio_write(&port_b, val, mask); | |
} | |
static int32_t portb_read(uint32_t *val, uint32_t mask) | |
{ | |
return dw_gpio_read(&port_b, val, mask); | |
} | |
static void portb_isr(void *ptr) | |
{ | |
dw_gpio_isr_handler(&port_b, ptr); | |
} | |
static void portb_install(void) | |
{ | |
DEV_GPIO_PTR port_ptr = &port_b; | |
DEV_GPIO_INFO_PTR info_ptr = &(port_b.gpio_info); | |
DW_GPIO_PORT_PTR dw_port_ptr = &(dw_gpio_port_b); | |
info_ptr->gpio_ctrl = (void *)dw_port_ptr; | |
info_ptr->opn_cnt = 0; | |
info_ptr->method = 0; | |
info_ptr->direction = 0; | |
info_ptr->extra = 0; | |
dw_port_ptr->no = DW_GPIO_PORT_B; | |
dw_port_ptr->regs = (DW_GPIO_REG_PTR)(PERIPHERAL_BASE | REL_REGBASE_GPIO0); | |
dw_port_ptr->valid_bit_mask = EMSK_GPIO_B_VALID_MASK; | |
dw_port_ptr->intno = INTNO_GPIO; | |
dw_port_ptr->int_handler = portb_isr; | |
dw_port_ptr->gpio_bit_isr = NULL; | |
port_ptr->gpio_open = portb_open; | |
port_ptr->gpio_close = portb_close; | |
port_ptr->gpio_control = portb_control; | |
port_ptr->gpio_write = portb_write; | |
port_ptr->gpio_read = portb_read; | |
} | |
#endif | |
#if (USE_DW_GPIO_PORT_C) | |
static DEV_GPIO port_c; | |
static DW_GPIO_PORT dw_gpio_port_c; | |
static int32_t portc_open(uint32_t dir) | |
{ | |
return dw_gpio_open(&port_c, dir); | |
} | |
static int32_t portc_close(void) | |
{ | |
return dw_gpio_close(&port_c); | |
} | |
static int32_t portc_control(uint32_t ctrl_cmd, void *param) | |
{ | |
return dw_gpio_control(&port_c, ctrl_cmd, param); | |
} | |
static int32_t portc_write(uint32_t val, uint32_t mask) | |
{ | |
return dw_gpio_write(&port_c, val, mask); | |
} | |
static int32_t portc_read(uint32_t *val, uint32_t mask) | |
{ | |
return dw_gpio_read(&port_c, val, mask); | |
} | |
static void portc_isr(void *ptr) | |
{ | |
dw_gpio_isr_handler(&port_c, ptr); | |
} | |
static void portc_install(void) | |
{ | |
DEV_GPIO_PTR port_ptr = &port_c; | |
DEV_GPIO_INFO_PTR info_ptr = &(port_c.gpio_info); | |
DW_GPIO_PORT_PTR dw_port_ptr = &(dw_gpio_port_c); | |
info_ptr->gpio_ctrl = (void *)dw_port_ptr; | |
info_ptr->opn_cnt = 0; | |
info_ptr->method = 0; | |
info_ptr->direction = 0; | |
info_ptr->extra = 0; | |
dw_port_ptr->no = DW_GPIO_PORT_C; | |
dw_port_ptr->regs = (DW_GPIO_REG_PTR)(PERIPHERAL_BASE | REL_REGBASE_GPIO0); | |
dw_port_ptr->valid_bit_mask = EMSK_GPIO_C_VALID_MASK; | |
dw_port_ptr->intno = INTNO_GPIO; | |
dw_port_ptr->int_handler = portc_isr; | |
dw_port_ptr->gpio_bit_isr = NULL; | |
port_ptr->gpio_open = portc_open; | |
port_ptr->gpio_close = portc_close; | |
port_ptr->gpio_control = portc_control; | |
port_ptr->gpio_write = portc_write; | |
port_ptr->gpio_read = portc_read; | |
} | |
#endif | |
#if (USE_DW_GPIO_PORT_D) | |
static DEV_GPIO port_d; | |
static DW_GPIO_PORT dw_gpio_port_d; | |
static int32_t portd_open(uint32_t dir) | |
{ | |
return dw_gpio_open(&port_d, dir); | |
} | |
static int32_t portd_close(void) | |
{ | |
return dw_gpio_close(&port_d); | |
} | |
static int32_t portd_control(uint32_t ctrl_cmd, void *param) | |
{ | |
return dw_gpio_control(&port_d, ctrl_cmd, param); | |
} | |
static int32_t portd_write(uint32_t val, uint32_t mask) | |
{ | |
return dw_gpio_write(&port_d, val, mask); | |
} | |
static int32_t portd_read(uint32_t *val, uint32_t mask) | |
{ | |
return dw_gpio_read(&port_d, val, mask); | |
} | |
static void portd_isr(void *ptr) | |
{ | |
dw_gpio_isr_handler(&port_d, ptr); | |
} | |
static void portd_install(void) | |
{ | |
DEV_GPIO_PTR port_ptr = &port_d; | |
DEV_GPIO_INFO_PTR info_ptr = &(port_d.gpio_info); | |
DW_GPIO_PORT_PTR dw_port_ptr = &(dw_gpio_port_d); | |
info_ptr->gpio_ctrl = (void *)dw_port_ptr; | |
info_ptr->opn_cnt = 0; | |
info_ptr->method = 0; | |
info_ptr->direction = 0; | |
info_ptr->extra = 0; | |
dw_port_ptr->no = DW_GPIO_PORT_D; | |
dw_port_ptr->regs = (DW_GPIO_REG_PTR)(PERIPHERAL_BASE | REL_REGBASE_GPIO0); | |
dw_port_ptr->valid_bit_mask = EMSK_GPIO_D_VALID_MASK; | |
dw_port_ptr->intno = INTNO_GPIO; | |
dw_port_ptr->int_handler = portd_isr; | |
dw_port_ptr->gpio_bit_isr = NULL; | |
port_ptr->gpio_open = portd_open; | |
port_ptr->gpio_close = portd_close; | |
port_ptr->gpio_control = portd_control; | |
port_ptr->gpio_write = portd_write; | |
port_ptr->gpio_read = portd_read; | |
} | |
#endif | |
DEV_GPIO_PTR gpio_get_dev(int32_t gpio_id) | |
{ | |
static uint32_t install_flag = 0; | |
/* intall device objects */ | |
if (install_flag == 0) | |
{ | |
install_flag = 1; | |
dw_gpio_all_install(); | |
} | |
switch (gpio_id) | |
{ | |
#if (USE_DW_GPIO_PORT_A) | |
case DW_GPIO_PORT_A: | |
return &port_a; | |
#endif | |
#if (USE_DW_GPIO_PORT_B) | |
case DW_GPIO_PORT_B: | |
return &port_b; | |
#endif | |
#if (USE_DW_GPIO_PORT_C) | |
case DW_GPIO_PORT_C: | |
return &port_c; | |
#endif | |
#if (USE_DW_GPIO_PORT_D) | |
case DW_GPIO_PORT_D: | |
return &port_d; | |
#endif | |
default: | |
break; | |
} | |
return NULL; | |
} | |
void dw_gpio_all_install(void) | |
{ | |
#if (USE_DW_GPIO_PORT_A) | |
porta_install(); | |
#endif | |
#if (USE_DW_GPIO_PORT_B) | |
portb_install(); | |
#endif | |
#if (USE_DW_GPIO_PORT_C) | |
portc_install(); | |
#endif | |
#if (USE_DW_GPIO_PORT_D) | |
portd_install(); | |
#endif | |
} | |
/** @} end of group BOARD_EMSK_DRV_DW_GPIO_OBJ */ |