summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2018-03-13 10:07:53 +0100
committerDominik Sliwa <dominik.sliwa@toradex.com>2018-03-13 10:07:53 +0100
commit8dd029cf7fe6fc79181c40818d8880141896707a (patch)
tree8b5b8f721be98be6d7639a049938b6569b7a5a49
parent4d55f719bb2ac2875ad736e10f22a70eac7c3284 (diff)
gpio support single transaction read
Implement support for single transfer register read in GPIO mode. Signed-off-by: Dominik Sliwa <dominik.sliwa@toradex.com>
-rw-r--r--source/gpio_ext.c57
-rw-r--r--source/gpio_ext.h3
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_ */