| /* ------------------------------------------ |
| * 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 */ |