753|0

81

帖子

3

TA的资源

一粒金砂(中级)

楼主
 

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运行提供板级支持。整体的实现还是比较清晰的,内容也不是很多。对自己移植其他芯片有一定的参考意义。

此帖出自NXP MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表