KW41Z板卡Openthread源码学习(一)
<p><strong><span style="font-size:18px;">前言</span></strong></p><p>本篇主要学习ot-kw41z/src中的源码,针对其中的实现和所用的API进行简单的说明。</p>
<p>后面再学习ot-cli-ftd的应用源码,openthread协议栈部分代码视情况而定。</p>
<p>最后根据ot-cli-ftd搭建应用工程,然后开发一个led和按键的控制demo。</p>
<p> </p>
<p><strong><span style="font-size:18px;">目录说明</span></strong></p>
<pre>
<code>.
├── CMakeLists.txt
├── LICENSE
├── README.md
├── build
├── openthread
├── script
├── src
└── third_party</code></pre>
<p>build:编译输出文件夹</p>
<p>openthread:ot源码</p>
<p>script:脚本工具,用于编译,环境搭建等</p>
<p>src:kw41z芯片ot驱动代码</p>
<p>third_party:kw41z的bsp库源码</p>
<p> </p>
<p><span style="font-size:18px;"><strong>源码学习</strong></span></p>
<p>src/system.c:</p>
<pre>
<code class="language-cpp">// 硬件初始化,在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);</code></pre>
<p>src/uart.c:</p>
<pre>
<code>// 接口申明位于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);</code></pre>
<p>src/radio.c:</p>
<pre>
<code>// 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);</code></pre>
<p>src/alarm.c:</p>
<pre>
<code>// 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);</code></pre>
<p>src/misc.c:</p>
<p>提供复位接口(otPlatReset)和复位原因(otPlatGetResetReason)等接口。</p>
<p>src/flash.c:</p>
<p>提供flash相关接口,用于非易失参数存储等。</p>
<p>src/entropy.c:</p>
<p>提供随机数接口。</p>
<p> </p>
<p><span style="font-size:18px;"><strong>总结</strong></span></p>
<p>src目录中的这些源码主要是对openthread进行接口适配,为openthread运行提供板级支持。整体的实现还是比较清晰的,内容也不是很多。对自己移植其他芯片有一定的参考意义。</p>
页:
[1]