KW41Z板卡Openthread源码学习(一)
[复制链接]
前言
本篇主要学习ot-kw41z/src中的源码,针对其中的实现和所用的API进行简单的说明。
后面再学习ot-cli-ftd的应用源码,openthread协议栈部分代码视情况而定。
最后根据ot-cli-ftd搭建应用工程,然后开发一个led和按键的控制demo。
目录说明
.
├── CMakeLists.txt
├── LICENSE
├── README.md
├── build
├── openthread
├── script
├── src
└── third_party
build:编译输出文件夹
openthread:ot源码
script:脚本工具,用于编译,环境搭建等
src:kw41z芯片ot驱动代码
third_party:kw41z的bsp库源码
源码学习
src/system.c:
// 硬件初始化,在main函数中会调用此接口,接口申明位于openthread/examples/platforms/openthread-system.h中
// 内部开启了引脚、DMA时钟,外部晶振使能,系统时钟初始化,闹钟、随机数、射频初始化以及开启终端串口
void otSysInit(int argc, char *argv[]);
// 处理串口收发、射频事件上报(中断下文)、闹钟信号上报
void otSysProcessDrivers(otInstance *aInstance);
// 将NMI脚重定向到Alt2,手册上未说明Alt2是什么功能
void NMI_Handler(void);
src/uart.c:
// 接口申明位于openthread/examples/platforms/utils/uart.h
// 用于协议栈来开启/关闭串口
otError otPlatUartEnable(void);
otError otPlatUartDisable(void);
// 串口发送接口
otError otPlatUartSend(const uint8_t *aBuf, uint16_t aBufLength);
// 串口收发处理函数, 被otSysProcessDrivers调用
void kw41zUartProcess(void)
{
processReceive();
processTransmit();
}
static void processTransmit(void)
{
// 通知OpenThread完成发送
otPlatUartSendDone();
}
static void processReceive(void)
{
// 通知OpenThread有数据到达
otPlatUartReceived(sReceive.mBuffer + sReceive.mHead, kReceiveBufferSize - sReceive.mHead);
}
// 串口中断函数
void LPUART0_IRQHandler(void);
src/radio.c:
// otPlatRadio开头的接口声明在openthread/include/openthread/platform/radio.h中
// 列出部分接口,主要用于参数设置,可通过字面意思直到具体的功能,不展开介绍了
void otPlatRadioSetPanId(otInstance *aInstance, uint16_t aPanId);
void otPlatRadioSetExtendedAddress(otInstance *aInstance, const otExtAddress *aExtAddress);
void otPlatRadioSetShortAddress(otInstance *aInstance, uint16_t aShortAddress);
// 用于射频的开启和关闭
otError otPlatRadioEnable(otInstance *aInstance);
otError otPlatRadioDisable(otInstance *aInstance);
// 用于设置发送参数及启动数据发送
otError otPlatRadioTransmit(otInstance *aInstance, otRadioFrame *aFrame);
// 中断函数
void Radio_1_IRQHandler(void)
{
// 数据接收处理,主要用于接收数据到sRxData
rf_process_rx_frame();
}
static bool rf_process_rx_frame(void);
// 用于处理射频的下文,包括:
// 通过otPlatRadioTxDone上报发送完成事件到OpenThread
// 通过otPlatRadioReceiveDone上报接收事件到OpenThread
// 在otSysProcessDrivers中被调用
void kw41zRadioProcess(otInstance *aInstance);
src/alarm.c:
// otPlatAlarm的接口在openthread/include/openthread/platform/alarm-milli.h中声明
// 使用周期中断定时器作为闹钟为OpenThread提供心跳
void kw41zAlarmInit(void);
// 通知OpenThread发生超时
void kw41zAlarmProcess(otInstance *aInstance);
// 设置下一个超时的时间
void otPlatAlarmMilliStartAt(otInstance *aInstance, uint32_t aT0, uint32_t aDt);
// 停止上报超时事件
void otPlatAlarmMilliStop(otInstance *aInstance);
// 获取当前时间
uint32_t otPlatAlarmMilliGetNow(void);
// 定时器中断函数
void PIT_IRQHandler(void);
src/misc.c:
提供复位接口(otPlatReset)和复位原因(otPlatGetResetReason)等接口。
src/flash.c:
提供flash相关接口,用于非易失参数存储等。
src/entropy.c:
提供随机数接口。
总结
src目录中的这些源码主要是对openthread进行接口适配,为openthread运行提供板级支持。整体的实现还是比较清晰的,内容也不是很多。对自己移植其他芯片有一定的参考意义。
|