From dcdaa6c7ad7a59628b87c134ba8c3c3792deb9a2 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 16 Mar 2017 11:26:14 -0400 Subject: [PATCH 1/2] IO: handle NONE (NULL) io pin --- src/main/drivers/io.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/drivers/io.c b/src/main/drivers/io.c index 0390a0add..219d97ddf 100644 --- a/src/main/drivers/io.c +++ b/src/main/drivers/io.c @@ -238,6 +238,8 @@ void IOToggle(IO_t io) // claim IO pin, set owner and resources void IOInit(IO_t io, resourceOwner_e owner, uint8_t index) { + if (!io) + return; ioRec_t *ioRec = IO_Rec(io); ioRec->owner = owner; ioRec->index = index; @@ -245,12 +247,16 @@ void IOInit(IO_t io, resourceOwner_e owner, uint8_t index) void IORelease(IO_t io) { + if (!io) + return; ioRec_t *ioRec = IO_Rec(io); ioRec->owner = OWNER_FREE; } resourceOwner_e IOGetOwner(IO_t io) { + if (!io) + return OWNER_FREE; ioRec_t *ioRec = IO_Rec(io); return ioRec->owner; } From 473826760d1adca15578605e78ba90e2eb7c0d1e Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 17 Mar 2017 11:10:48 -0400 Subject: [PATCH 2/2] serialUARTInit: allow missing rx/tx pin --- src/main/drivers/serial_uart_stm32f30x.c | 6 +++--- src/main/drivers/serial_uart_stm32f4xx.c | 4 ++-- src/main/drivers/serial_uart_stm32f7xx.c | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/drivers/serial_uart_stm32f30x.c b/src/main/drivers/serial_uart_stm32f30x.c index a65d28aa8..d99f4d15c 100644 --- a/src/main/drivers/serial_uart_stm32f30x.c +++ b/src/main/drivers/serial_uart_stm32f30x.c @@ -115,7 +115,7 @@ static void handleUsartTxDma(dmaChannelDescriptor_t* descriptor) void serialUARTInit(IO_t tx, IO_t rx, portMode_t mode, portOptions_t options, uint8_t af, uint8_t index) { - if (options & SERIAL_BIDIR) { + if ((options & SERIAL_BIDIR) && tx) { ioConfig_t ioCfg = IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, ((options & SERIAL_INVERTED) || (options & SERIAL_BIDIR_PP)) ? GPIO_OType_PP : GPIO_OType_OD, ((options & SERIAL_INVERTED) || (options & SERIAL_BIDIR_PP)) ? GPIO_PuPd_DOWN : GPIO_PuPd_UP @@ -128,12 +128,12 @@ void serialUARTInit(IO_t tx, IO_t rx, portMode_t mode, portOptions_t options, ui IOLo(tx); // OpenDrain output should be inactive } else { ioConfig_t ioCfg = IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, (options & SERIAL_INVERTED) ? GPIO_PuPd_DOWN : GPIO_PuPd_UP); - if (mode & MODE_TX) { + if ((mode & MODE_TX) && tx) { IOInit(tx, OWNER_SERIAL_TX, index); IOConfigGPIOAF(tx, ioCfg, af); } - if (mode & MODE_RX) { + if ((mode & MODE_RX) && rx) { IOInit(rx, OWNER_SERIAL_RX, index); IOConfigGPIOAF(rx, ioCfg, af); } diff --git a/src/main/drivers/serial_uart_stm32f4xx.c b/src/main/drivers/serial_uart_stm32f4xx.c index 103b016f2..4968b9fca 100644 --- a/src/main/drivers/serial_uart_stm32f4xx.c +++ b/src/main/drivers/serial_uart_stm32f4xx.c @@ -329,12 +329,12 @@ uartPort_t *serialUART(UARTDevice device, uint32_t baudRate, portMode_t mode, po IOConfigGPIOAF(tx, IOCFG_AF_OD, uart->af); } else { - if (mode & MODE_TX) { + if ((mode & MODE_TX) && tx) { IOInit(tx, OWNER_SERIAL_TX, RESOURCE_INDEX(device)); IOConfigGPIOAF(tx, IOCFG_AF_PP_UP, uart->af); } - if (mode & MODE_RX) { + if ((mode & MODE_RX) && rx) { IOInit(rx, OWNER_SERIAL_RX, RESOURCE_INDEX(device)); IOConfigGPIOAF(rx, IOCFG_AF_PP_UP, uart->af); } diff --git a/src/main/drivers/serial_uart_stm32f7xx.c b/src/main/drivers/serial_uart_stm32f7xx.c index 5b44afd20..2bd0f1b65 100644 --- a/src/main/drivers/serial_uart_stm32f7xx.c +++ b/src/main/drivers/serial_uart_stm32f7xx.c @@ -405,17 +405,17 @@ uartPort_t *serialUART(UARTDevice device, uint32_t baudRate, portMode_t mode, po IO_t tx = IOGetByTag(uart->tx); IO_t rx = IOGetByTag(uart->rx); - if (options & SERIAL_BIDIR) { + if ((options & SERIAL_BIDIR) && tx) { IOInit(tx, OWNER_SERIAL_TX, RESOURCE_INDEX(device)); IOConfigGPIOAF(tx, IOCFG_AF_PP, uart->af); } else { - if (mode & MODE_TX) { + if ((mode & MODE_TX) && tx) { IOInit(tx, OWNER_SERIAL_TX, RESOURCE_INDEX(device)); IOConfigGPIOAF(tx, IOCFG_AF_PP, uart->af); } - if (mode & MODE_RX) { + if ((mode & MODE_RX) && rx) { IOInit(rx, OWNER_SERIAL_RX, RESOURCE_INDEX(device)); IOConfigGPIOAF(rx, IOCFG_AF_PP, uart->af); }