首先TI当年出的这个linux gateway是用于智能家居的,用于适配AM335x,同时加速开发进度的,但是不是所有人都用AM335x平台,还有用MTK、展讯等其他平台,所以这里面很多代码要做移植修改。
在2016.12月之前,TI针对Z-stack for linux gateway的源代码只做部分开放,链接地址:http://www.ti.com.cn/tool/cn/z-stack-archive地址下载到的安装包名字叫做Z-Stack_Linux_Gateway_1_0_1_installer.run ,在多次和TI沟通协调下,TI刚刚决定开放全部源代码,不再需要SLA协议,所以同样的下载地址,下载到的安装包名字已经为Z-Stack_Linux_Gateway-1_0_1-src-linux-installer.run
使用非源代码安装包 Z-Stack_Linux_Gateway_1_0_1_installer.run安装后路径为/opt/Z-Stack_Linux_Gateway-1.0.1
使用源代码安装包 Z-Stack_Linux_Gateway-1_0_1-src-linux-installer.run安装后路径为/opt/Z-Stack_Linux_Gateway-1.0.1-src
1、首先在TI网站下载到的Z-Stack_Linux_Gateway-1_0_1-src-linux-installer.run
2、在ubuntu下安装以后,注意一定要安装在默认目录下,否则可能会有权限问题导致部分代码安装不上,默认目录为/opt/
3、目录结构大概如下:
4、之前TI E2E论坛上有人在问Precompiled_arm目录下的压缩包里面的那些程序是怎么编译出来的,没找到相应的源代码呢?因为当时没有开放全部源码!
5、其实Z-stack安装包里面自带的这些Precompiled_arm是编译好的arm程序是针对TI自己的Beaglebone平台的,也就是AM335x linux平台,但是如果想用在其他平台比如MTK、高通等,需要自己针对自身平台做移植编译;
6、在Source目录下,包含了所有的源代码,只要对build_all脚本和Source/script目录下的package_builder_bbb稍作修改,就可以编译出自己平台需要的二进制程序了,修改的地方还不少,比如编译器的指定,交叉工具链lib库的路径指定,等等;
7、注意所有的Makefile里面gcc编译事项,TI针对AM335x的默认都是-mcpu=cortex-a8 -march=armv7-a,你要根据你的平台CPU架构和指令集选择合适的参数,否则编译出来的程序可能在目标板上运行之后提示illegal instruction,或者提示./bin/bash... not found等等错误,比如我们平台是-mcpu=arm926ej-s -march=armv5te,所以要做相应修改,注意所有程序都是动态链接的,意味着如果你的/lib目录下没有相应的动态库,那么程序也不能成功运行,注意用arm-linux-gnueabi-readelf工具测试一下到底依赖哪些动态库;
8、安装包自带的编译好的protobuf-c库,也是针对armv7编译出来的,通过arm-linux-gnueabi-readelf libprotobuf-c.so.0查看,如果平台不是AM335x armv7,也要重新编译对应的protobufc库的,否则部分程序也是无法运行的,具体方法参考:在ubuntu14.04编译protobuf-c for arm版本(http://www.linuxdiyf.com/linux/27764.html),编译最终生成相关的libprotobuf-c动态库,也要全部拷贝到Z-Stack_Linux_Gateway-1.0.1-src/Source/protobuf-c-arm/lib目录下并重新执行./build_all,记得删除之前的老版本
9、package_builder_bbb它里面写了一堆冗余的脚本,最后部分的内容几乎没什么用,删掉就好了,只要确保前面的脚本都能执行到,最终生成可执行文件,然后把各种配置文件拷贝到指定的目录就好了,最后编译出来的文件如下:
server目录内容,都是动态链接,大小和安装包里面预编译出来的差不多:
10、关于移植工作,hal_gpio.c是针对AM335x平台,是通过User层直接读写文件的方式读写GPIO的,所以要配置NPI文件NPI_Gateway.cfg,注意源码中cfg名字和实际文件有出入,请统一命名,否则找不到配置文件的,还有根据硬件使用的是SPI还是UART,还是I2C,要做相应的修改的
11、另外AM335x很可能使用了level shifter,也就是电平转换,因为AM335x的GPIO电压是1.8V,CC253x的GPIO电压是3.3V,明显不能直接连接,中间一定加了自家的带方向控制的电平转换芯片,因为分析了hal_gpio.c源码,里面很多操作还有level_shifter的东西,很多平台直接就是3.3V的,没必要进行电平转换,所以这部分代码没用,注释掉即可。