Silicon Lab zigbee芯片HOST端程序移植

Silicon lab的EFR32MG系列芯片可以同时支持BLE,zigbee,thread等2.4GHZ的无线通信协议。但是网上关于这款芯片的资料却不多。前段时间将该芯片的zigbee功能移植到了openwrt系统上,现在将其中的一些需要注意的细节记录下来,方便自己查阅也方便跟大家一起讨论。

这里采用的是NCP(Network Coprocessor)即协处理器的模式,silicon lab的芯片作为一个独立工作的单独模块实现zigbee的功能,HOST端程序运行与主机上,通过串口或者SPI的方式来与芯片通信。主机和模块的通信被封装成EZSP的一个通信协议,用户可以通过HOST端操作从网络建立,设备加入,消息发送,安全设置等等功能,这些操作及参数指令被封装成特定的帧通过串口或者SPI发送给模块。NCP模块上的firmware通过silicon lab的开发sdk生成出来,注意选择好对应的芯片以及通信方式即可。这里需要注意的一点是不同的通信方式要选好对应的bootloader。 这里当使用串口通信的时候选择"UART XMODE Bootloader", 当使用SPI通信的时候选择"EZSP SPI Bootloader"。在模块的Applacation固件里要确认好相关的配置参数,如串口的默认针脚,波特率,流控方式等等。

HOST端的程序其实也是在SDK里生成出来的,但是该HOST程序只能在Linux下编译运行,在其他的操作系统下会编译出错。我们的任务就是排查出这些错误,然后让这个HOST端在openwrt系统下也能正确的编译运行。

首先第一步是在SDK下生成出HOST端程序,选择ZCL Application Framwork V2->EmberZNetPro GA HOST->Z3GateWay, 然后Generate出代码。下一步把整个V2.2文件夹拷贝到Linux虚拟机下,注意要拷贝整个文件目录,因为编译过程依赖这个文件夹下的目录树,破坏目录结构编译就会出错。这个文件夹看起来比较大,其实里面有很多不需要的东西,可以把蓝牙,thread的文件夹删除,然后zigbee文件夹下也有很多不需要的芯片配置表之类的东西,可以都删除掉,最后必要的源文件大概就几十MB大小。

第二步创建openwrt的package包。将V2.2的文件夹直接改名src,按照openwrt的ipk包的组织形式创建package包的目录结构。这时候HOST端的主Makefile文件是在src目录深处的,而且不能移动出来,否则破坏了相对目录结构。在src里的package主Makefile里引导到实际的HOST端Makefile上。

all:
        make -C app/builder/Z3GatewayHost

clean:
        make -C app/builder/Z3GatewayHost clean

  在package的Makefile里要添加依赖库“+libncurses +libreadline”。 app/builder/Z3GatewayHost下的Makefile不需要做太多改动,只要将链接语句里的$(LD)改成$(CC),这里与openwrt的编译方式有关,openwrt会将这里的CC替换成他的编译工具,比如ARM或者MIPS的编译工具。如果这里的LD没有被替换,结果就会在链接的时候使用X86平台的GCC链接器,导致链接错误。

如果编译的时候出现CSTOP和CSTART未定义的错误,去staging_dir目录下,找到使用的交叉编译工具链,然后在include/termios.h里加一句“#include<sys/ttydefaults.h>”。这个错误的原因是tty端口初始化的时候在Linux下有一个默认配置表,但是在openwrt下没有包含这个表,在端口初始化头文件“termios.h”里包含上这个表即可。

另一个需要改动的地方是在源代码里,在HOST端源码protocol/zigbee/app/ezsp-host/ezsp-host-io.c里,这是串口初始化的一段代码,这里找到这两句代码:

tcsetattr(*serialPortFdReturn, TCSAFLUSH, &tios);  // set EZSP serial port options
tcgetattr(*serialPortFdReturn, &checkTios);      // and read back the result

  在这两段代码前面加上一句"memset(checkTios.c_cc, _POSIX_VDISABLE, NCCS); " 这里是一个奇怪的问题,代码在设置TTY端口参数之后会读取设置后的参数,与原来要设置的参数对比,确认端口已经被正确的设置。但这里的一个问题是,用来读取设置后参数的结构体checkTios.c_cc,本身在声明之后未被清零处理。本来也没什么问题,因为在读取TTY端口参数的过程中会被填充上读取到的数值,但是这个结构体里有32BIT,从17开始后面都是保留位,读取过程中保留位不会被设置,所以若申明之后未清零,保留位上随机的数值可能会保留下来,下一步检查是否设置正确的时候就会出错。这里应该是源码里的一个小bug,在Linux下可能不会出错,但是移植到其他平台的时候这个错误就会显现出来。最简单的方法就是在检查之前先做清零处理。

最后编译出来的程序会包含一个Z3GateWay的ipk包,以及libreadline,libncureses,terminfo的ipk包,这三个包是依赖库,如果openwrt上原本没安装这三个库,那就需要先装上这三个库。安装上Z3GateWay的IPK之后,连接好模块的串口线,找到该目录下运行./Z3GateWay就可以运行zigbee HOST端的程序了。

SPI的设置跟这个大同小异,只有一些小地方需要修改一下,下回再接着写。

猜你喜欢

转载自www.cnblogs.com/Yaosir/p/9314164.html