From 8dd029cf7fe6fc79181c40818d8880141896707a Mon Sep 17 00:00:00 2001 From: Dominik Sliwa Date: Tue, 13 Mar 2018 10:07:53 +0100 Subject: gpio support single transaction read Implement support for single transfer register read in GPIO mode. Signed-off-by: Dominik Sliwa --- source/gpio_ext.c | 57 ++++++++++++++++++------------------------------------- source/gpio_ext.h | 3 --- 2 files changed, 18 insertions(+), 42 deletions(-) diff --git a/source/gpio_ext.c b/source/gpio_ext.c index 839cd58..1347796 100644 --- a/source/gpio_ext.c +++ b/source/gpio_ext.c @@ -29,7 +29,7 @@ static inline int port_type_to_int(PORT_Type *port) /* returns GPIO index in gpio_list table and -EINVAL * if there is no entry for this gpio. */ -int is_gpio_valid(uint8_t pin) +static int is_gpio_valid(uint8_t pin) { uint16_t i; int temp; @@ -49,16 +49,13 @@ int is_gpio_valid(uint8_t pin) return -EINVAL; } -int set_gpio_status(uint8_t status, uint8_t pin) +static int set_gpio_status(uint8_t status, int index) { gpio_pin_config_t gpio_config; - int index; gpio_config.pinDirection = (status & APALIS_TK1_K20_GPIO_STA_OE) ? kGPIO_DigitalOutput : kGPIO_DigitalInput; gpio_config.outputLogic = (status & APALIS_TK1_K20_GPIO_STA_VAL); - index = is_gpio_valid(pin); - if (index >= 0) GPIO_PinInit(gpio_list[index].gpio, gpio_list[index].pin, &gpio_config); else @@ -68,14 +65,12 @@ int set_gpio_status(uint8_t status, uint8_t pin) } -uint8_t get_gpio_status(uint8_t pin) +static uint8_t get_gpio_status(int index) { uint8_t status; - int index; GPIO_Type *base; uint32_t gpio_pin; - index = is_gpio_valid(pin); if (index == -EINVAL) return 0xFF; base = gpio_list[index].gpio; @@ -95,49 +90,33 @@ uint8_t get_gpio_status(uint8_t pin) int gpio_registers(dspi_transfer_t *spi_transfer) { uint8_t *rx_buf = spi_transfer->rxData; - uint8_t *tx_buf = &spi_transfer->txData[0]; + int index; - if (rx_buf[0] == APALIS_TK1_K20_READ_INST) { - /* switch (rx_buf[1]) { - case APALIS_TK1_K20_GPIOREG: - return -ENOENT; - break; - case APALIS_TK1_K20_GPIO_NO: - if (gen_regs.gpio_no != 0xFF){ - tx_buf[0] = gen_regs.gpio_no; - return 1; - } else - return -ENOENT; - break; - case APALIS_TK1_K20_GPIO_STA: - if (gen_regs.gpio_no != 0xFF){ - tx_buf[0] = get_gpio_status(gen_regs.gpio_no); - if (tx_buf[0] != 0xFF) - return 1; - else - return -ENOENT; - } else - return -ENOENT; - break; - default: - return -ENOENT; - } */ - } else if (rx_buf[0] == APALIS_TK1_K20_WRITE_INST) { + if (rx_buf[0] == APALIS_TK1_K20_WRITE_INST) { switch (rx_buf[1]) { case APALIS_TK1_K20_GPIOREG: return -ENOENT; break; case APALIS_TK1_K20_GPIO_NO: - if (is_gpio_valid(rx_buf[2]) >= 0){ - gen_regs.gpio_no = rx_buf[2]; + index = is_gpio_valid(rx_buf[2]); + if (index >= 0){ + registers[APALIS_TK1_K20_GPIO_NO]= rx_buf[2]; + registers[APALIS_TK1_K20_GPIO_STA] = get_gpio_status(index); return 1; } else { - gen_regs.gpio_no = 0xFF; + registers[APALIS_TK1_K20_GPIO_NO] = 0xFF; return -ENOENT; } break; case APALIS_TK1_K20_GPIO_STA: - return set_gpio_status(rx_buf[2], gen_regs.gpio_no); + index = is_gpio_valid(registers[APALIS_TK1_K20_GPIO_NO]); + if (index >= 0){ + set_gpio_status(rx_buf[2], index); + registers[APALIS_TK1_K20_GPIO_STA] = get_gpio_status(index); + return 1; + } else { + return -ENOENT; + } break; default: return -ENOENT; diff --git a/source/gpio_ext.h b/source/gpio_ext.h index 4df1788..df9f323 100644 --- a/source/gpio_ext.h +++ b/source/gpio_ext.h @@ -67,9 +67,6 @@ struct gpio_id gpio_list [] = { {PORTE, GPIOE, 25} }; -int is_gpio_valid(uint8_t pin); -int set_gpio_status(uint8_t status, uint8_t pin); -uint8_t get_gpio_status(uint8_t pin); int gpio_registers(dspi_transfer_t *spi_transfer); #endif /* SOURCE_GPIO_EXT_H_ */ -- cgit v1.2.3