[k32w] rtos uart fixes (#5451)

This commit adds fixes which are needed for running Project CHIP on
K32W.

Fixes are related to UART handling, radio interrupts and Free RTOS
support.
This commit is contained in:
doru91
2020-08-25 07:49:56 -07:00
committed by GitHub
parent 2911018ad8
commit ce0f6b420e
13 changed files with 1145 additions and 31 deletions
+2 -1
View File
@@ -46,7 +46,6 @@ LIB_FLAGS
-DCPU_JN518X_REV=2 \
-DJENNIC_CHIP_FAMILY_JN518x \
-DJENNIC_CHIP_FAMILY_NAME=_JN518x \
-DUSE_RTOS=0 \
-DgPWR_LDOMEM_0_9V_PD=0 \
-DNO_SYSCORECLK_UPD=0 \
-I$(top_srcdir)/include \
@@ -67,6 +66,8 @@ LIB_FLAGS
-I$(top_srcdir)/third_party/nxp/JN5189DK6/middleware/wireless/framework/XCVR/DK6/Build/Include \
-I$(top_srcdir)/third_party/nxp/JN5189DK6/middleware/wireless/framework/XCVR/DK6 \
-I$(top_srcdir)/third_party/nxp/JN5189DK6/middleware/wireless/framework/Common \
-I$(top_srcdir)/third_party/nxp/JN5189DK6/middleware/wireless/framework/SerialManager/Source \
-I$(top_srcdir)/third_party/nxp/JN5189DK6/middleware/wireless/framework/TimersManager/Source \
-Wno-unknown-pragmas \
-Wno-sign-compare \
-Wno-unused-function \
+2 -1
View File
@@ -48,7 +48,6 @@ LIB_FLAGS
-DCPU_JN518X_REV=2 \
-DJENNIC_CHIP_FAMILY_JN518x \
-DJENNIC_CHIP_FAMILY_NAME=_JN518x \
-DUSE_RTOS=0 \
-DgPWR_LDOMEM_0_9V_PD=0 \
-DNO_SYSCORECLK_UPD=0 \
-I$(top_srcdir)/include \
@@ -68,6 +67,8 @@ LIB_FLAGS
-I$(top_srcdir)/third_party/nxp/K32W061DK6/middleware/wireless/framework/XCVR/DK6/Build/Include \
-I$(top_srcdir)/third_party/nxp/K32W061DK6/middleware/wireless/framework/XCVR/DK6 \
-I$(top_srcdir)/third_party/nxp/K32W061DK6/middleware/wireless/framework/Common/ \
-I$(top_srcdir)/third_party/nxp/K32W061DK6/middleware/wireless/framework/SerialManager/Source \
-I$(top_srcdir)/third_party/nxp/K32W061DK6/middleware/wireless/framework/TimersManager/Source \
-I$(top_srcdir)/third_party/nxp/K32W061DK6/boards/k32w061dk6/wireless_examples/openthread/enablement \
-Wno-unknown-pragmas \
-Wno-sign-compare \
+17
View File
@@ -35,10 +35,12 @@
/* Openthread configuration */
#include OPENTHREAD_PROJECT_CORE_CONFIG_FILE
#include "TMR_Adapter.h"
#include "fsl_clock.h"
#include "fsl_ctimer.h"
#include "fsl_device_registers.h"
#include "fsl_wtimer.h"
#include "openthread-system.h"
#include <openthread/platform/alarm-milli.h>
#include <openthread/platform/diag.h>
@@ -96,6 +98,9 @@ void K32WAlarmInit(void)
from sleep */
WTIMER_EnableInterrupts(WTIMER_TIMER1_ID);
NVIC_SetPriority(WAKE_UP_TIMER0_IRQn, gStackTimer_IsrPrio_c >> (8 - __NVIC_PRIO_BITS));
NVIC_SetPriority(WAKE_UP_TIMER1_IRQn, gStackTimer_IsrPrio_c >> (8 - __NVIC_PRIO_BITS));
/* Start wake timer 0 counter for timestamp - the counter counts down to 0 so a simple
substracion from TIMER0_MAX_COUNT_VALUE will give us the timestamp */
WTIMER_StartTimer(WTIMER_TIMER0_ID, TIMER0_MAX_COUNT_VALUE);
@@ -211,12 +216,20 @@ void CTIMER0_IRQHandler(void)
uint32_t flags = CTIMER_GetStatusFlags(CTIMER0);
CTIMER_ClearStatusFlags(CTIMER0, flags);
sEventFired = true;
#if USE_RTOS
otSysEventSignalPending();
#endif
}
#else
void WAKE_UP_TIMER0_DriverIRQHandler()
{
WTIMER_ClearStatusFlags(WTIMER_TIMER0_ID);
WTIMER_StartTimer(WTIMER_TIMER0_ID, TIMER0_MAX_COUNT_VALUE);
#if USE_RTOS
otSysEventSignalPending();
#endif
}
void WAKE_UP_TIMER1_DriverIRQHandler()
{
@@ -230,5 +243,9 @@ void WAKE_UP_TIMER1_DriverIRQHandler()
{
sEventFired = true;
}
#if USE_RTOS
otSysEventSignalPending();
#endif
}
#endif
+8
View File
@@ -49,6 +49,10 @@
#include <openthread/platform/diag.h>
#include <openthread/platform/radio.h>
#if USE_RTOS
#include "openthread-system.h"
#endif
extern void BOARD_LedDongleToggle(void);
/* Defines */
@@ -821,6 +825,10 @@ static void K32WISR(uint32_t u32IntBitmap)
default:
break;
}
#if USE_RTOS
otSysEventSignalPending();
#endif
}
/**
* Process the MAC Header of the latest received packet
+2 -2
View File
@@ -82,7 +82,7 @@ void otSysProcessDrivers(otInstance *aInstance)
K32WAlarmProcess(aInstance);
}
void otSysEventSignalPending(void)
WEAK void otSysEventSignalPending(void)
{
/* TODO */
/* Intentionally left empty */
}
+36 -20
View File
@@ -42,6 +42,11 @@
#include <utils/code_utils.h>
#include "openthread/platform/uart.h"
#if USE_RTOS
#include "UART_Serial_Adapter.h"
#include "openthread-system.h"
#endif
/* Defines */
#define K32W_UART_RX_BUFFERS 256
#define K32W_UART_BAUD_RATE 115200
@@ -94,35 +99,42 @@ otError otPlatUartEnable(void)
usart_config_t config;
uint32_t kPlatformClock = CLOCK_GetFreq(kCLOCK_Fro32M);
/* attach clock for USART0 */
CLOCK_AttachClk(kOSC32M_to_USART_CLK);
if (!sIsUartInitialized)
{
/* attach clock for USART0 */
CLOCK_AttachClk(kOSC32M_to_USART_CLK);
/* reset FLEXCOMM0 for USART0 */
RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);
/* reset FLEXCOMM0 for USART0 */
RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);
memset(&sUartHandle, 0, sizeof(sUartHandle));
sUartHandle.txState = UART_IDLE;
memset(&sUartHandle, 0, sizeof(sUartHandle));
sUartHandle.txState = UART_IDLE;
USART_GetDefaultConfig(&config);
config.baudRate_Bps = K32W_UART_BAUD_RATE;
config.enableTx = true;
config.enableRx = true;
config.rxWatermark = kUSART_RxFifo1;
USART_GetDefaultConfig(&config);
config.baudRate_Bps = K32W_UART_BAUD_RATE;
config.enableTx = true;
config.enableRx = true;
config.rxWatermark = kUSART_RxFifo1;
uartStatus = USART_Init(USART0, &config, kPlatformClock);
otEXPECT_ACTION(uartStatus == kStatus_Success, error = OT_ERROR_INVALID_ARGS);
uartStatus = USART_Init(USART0, &config, kPlatformClock);
otEXPECT_ACTION(uartStatus == kStatus_Success, error = OT_ERROR_INVALID_ARGS);
K32WResetRxRingBuffer(&sUartRxRing);
K32WResetRxRingBuffer(&sUartRxRing);
FLEXCOMM_SetIRQHandler(USART0, (flexcomm_irq_handler_t)USART0_IRQHandler, &sUartHandle);
FLEXCOMM_SetIRQHandler(USART0, (flexcomm_irq_handler_t)USART0_IRQHandler, &sUartHandle);
/* Enable interrupt in NVIC. */
EnableIRQ(USART0_IRQn);
/* Enable interrupt in NVIC. */
#if USE_RTOS
NVIC_SetPriority(USART0_IRQn, gUartIsrPrio_c >> (8 - __NVIC_PRIO_BITS));
NVIC_ClearPendingIRQ(USART0_IRQn);
#endif
EnableIRQ(USART0_IRQn);
/* Enable RX interrupt. */
USART_EnableInterrupts(USART0, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
/* Enable RX interrupt. */
USART_EnableInterrupts(USART0, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
sIsUartInitialized = true;
sIsUartInitialized = true;
}
exit:
return error;
@@ -257,6 +269,10 @@ static void USART0_IRQHandler(USART_Type *base, usart_handle_t *handle)
sIsTransmitDone = true;
}
}
#if USE_RTOS
otSysEventSignalPending();
#endif
}
}