mirror of
https://github.com/espressif/openthread.git
synced 2026-09-03 15:50:06 +00:00
[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:
@@ -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 \
|
||||
|
||||
@@ -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 \
|
||||
|
||||
Executable → Regular
+17
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -82,7 +82,7 @@ void otSysProcessDrivers(otInstance *aInstance)
|
||||
K32WAlarmProcess(aInstance);
|
||||
}
|
||||
|
||||
void otSysEventSignalPending(void)
|
||||
WEAK void otSysEventSignalPending(void)
|
||||
{
|
||||
/* TODO */
|
||||
/* Intentionally left empty */
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user