声明:原创作品,严禁用于商业目的。 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨。
文章目录
0.写在前篇
本系列文章来自于博通公司相关项目开发中的学习资料和开发总结,是企业或者公司项目开发过程中必备的网络相关知识,主要涉及到ecos和linux系统编译、内存管理、接口管理、HAL抽象层、以及IPV6、DHCP、TR069等网络相关协议。为维护版权和相关知识产权,请购买官方SDK和相关服务,此系列文章仅为个人学习使用,如有不妥之处和技术相关知识,请私信留言!
博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译
博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程
博通Broadcom SDK源码学习与开发3——Cable Modem Docsis3.0
博通Broadcom SDK源码学习与开发4——ECOS系统数据流
博通Broadcom SDK源码学习与开发5——ECOS系统层剖析
博通Broadcom SDK源码学习与开发6——支持Linux系统
博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析
博通Broadcom SDK源码学习与开发8——内存与参数管理
博通Broadcom SDK源码学习与开发9——Interface接口管理
博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址
博通Broadcom SDK源码学习与开发11——Cable Modem DHCP管理
博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议
1. 博通相关知识简介
Connect Everything.Broadcom发布了类型众多的芯片,它们应用广泛。有终端的、局端的、有线的、无线的、dsl的、pon的、cable的。就我接触到的就有:应用于终端产品的Bcm96xx 系列的xdsl、xpon芯片;应用于局端产品中的Bcm56xx 系列的交换芯片;应用于cable modem产品的Bcm33xx芯片,应用于 CMC产品的Bcm321x芯片,应用于可穿戴产品的Bcm2073x蓝牙芯片。Broadcom 对于每类芯片几乎都有一套SDK,并持续升级和维护。Bcm963xx系列芯片对应的是bcm963xx_4.xxL.xx_data_src的SDK;Bcm56xx系列的交换芯片采用的是sdk5.x.x;Bcm33xx的cablemodem芯片对应的是BFC4.x.x/BFC5.x.x的SDK;而Cable局端的CMC芯片采用的是4.x.xrelSDK(其实差不多是Bcm963xxDSK + cmts);Bcm20732x的蓝牙芯片对应的SDK是WICED1.0/2.0,是一个ble的蓝牙协议栈。除CMC的芯片外,以上的各系列芯片都只有一块主芯片。CMC芯片的特殊是因为它是一个套片,由3218,3219,3141组成。3218是它的核心,它是一块FPGA,处理docsis协议,它由3219管理和控制。3219有两个核一个运行ecos系统,一个运行linux系统。ecos系统上跑的类似于BFC的平台(但是是局端的,不开放源码),linux系统上运行cmts的应用来控制和管理套片。
以Bcm3309/Bcm3349芯片开发Cablemodem产品为例,需从Broadcom网站下载以下压缩包来搭建软件系统。
编译工具链:eCos_Toolchain_BFC_and_CablexChange.zip
BOOT代码:Bootloader_2_2_0.zip
BFC4.xx平台:ProdD20_BFC4.4.10.zip
理解和掌握每套SDK的难度不一样,如WICED1.1.0就比较简单,它是一个ble的蓝牙协议栈,并且是基于Eclipse二次开发的集成开发环境,使用的开发语言的c,底层blestack不开放源码,只提供api接口供调用。Bcm96xx的SDK就较为复杂,它包含Linux内核代码,开放的和Broadcom私有的驱动代码,以及应用层代码和一些脚本,学习和掌握需要肯花时间和精力。BFCx.x.x则是一个用C++写成的平台,系统的基本架构比较清晰,但对于稍微底层一点的HAL类理解起来会有一定的难度。
就我个人的经验,要全面掌握和学习复杂一点的SDK可以按照下面的步骤来:
– 了解目录结构,这能帮助理解SDK的大体组成。
–了解其编译架构,这能帮助更深入的理解SDK的组织结构。
– 跟踪启动过程,了解整个系统的启动过程是必须的。
– 了解其软件架构,需要整体上的掌控。
– 然后各个击破,各个模块部分详细阅读。
–最后再次整体分析,各个模块之间的交互,如何构成了一个完整的系统。
接下来,文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品为例,从编译系统到各个模块源码分析与探讨。
1. 总体框架
对于cable modem的代码,从编译的脚本:build_procedure.sh可看出,主要分为两块,一部分是source code,一部分是tool chains 解压后分别存在于文件夹:REV和zOEMtools_eCos中 编译从REV目录开始
(1) 首先在make后一路读取makefile,确定一个默认的目标
(2) 然后根据依赖条件会编译几个.a库,mta.a, common.a等
(3) 根据设置选择编译相应的功能模块(目标文件会集中放置在某文件夹下)
(4) 最后生成img文件
流程图:
2. 编译过程
2.1 顶层makefile
编译时候,可以在REV目录下添加makefile,然后进行编译。以编译bcm93383芯片为例,build.sh脚本内容如下:
#!/bin/bash
PACK_DIR=`pwd`
export CXC_COMPILER_ROOT_DIR=${
PACK_DIR}/zOEMtools_eCos/eCos20/gnutools/mipsisa32-elf-i386-linux
cd ${
PACK_DIR}/cxc/REV/cablex
source setenv_eCos.bash
cd apps/bcm93383wvg
make euro=1 pktc_ver=15 bfc_opts="ipv6 noslim erouter eu nobattery wombo1 WIFI_43227"
运行build.sh后,就进入bcm93383wvg目录进行编译。
2.2 编译入口
(1) 首先会include其他的makefile:
makefile
bcm93383wvg_app.mk
../rules/cxcCablexChangeRules.mk
../rules/cxcAppEnv.mk
~/cm/cxc/REV/cablex/apps/rules/cxcXchgCommonRules.mk
~/cm/cxc/REV/xchg_common/rules/xChgEnv.mk
~/cm/cxc/REV/xchg_common/rules/xChgEnv_eCos.mk
~/cm/cxc/REV/xchg_common/rules/xChgRules.mk
~/cm/cxc/REV/xchg_common/rules/xChgRules_eCos.mk
~/cm/cxc/REV/cablex/apps/rules/cxcLdxRules.mk
~/cm/cxc/REV/cablex/obj/eCos/bcm93383wvg_euro_pktc15_ipv6_secModePSM/ldxAppCfg.mk
~/cm/cxc/REV/cablex/obj/eCos/bcm93383wvg_euro_pktc15_ipv6_secModePSM/ldxAppDspLoadAddrCfg.mk
~/cm/cxc/REV/cablex/apps/rules/cxcVoiceResGwRules.mk
~/cm/cxc/REV/cablex/apps/rules/cxcXchgDriversRules.mk
~/cm/cxc/REV/cablex/apps/rules/cxcMtaRules.mk
~/cm/cxc/REV/cablex/src/mta/mtaTargets.mk
~/cm/cxc/REV/cablex/apps/rules/cxcBfcWrapperRules.mk
~/cm/cxc/REV/cablex/apps/rules/cxcCommonRules.mk
(2)加载完makefile后,确定编译的目标:
首先,确定最终的目标为default:
~/cm/cxc/REV/cablex/apps/rules/cxcCablexChangeRules.mk:
# Default application targets.
.PHONY: default pre_build clean
default: cxc_app
pre_build: pre_build_config
clean: clean_cxc_app
然后,根据makefile,确定其依赖关系:
~/cm/cxc/REV/cablex/apps/rules/cxcBfcWrapperRules.mk:
define bfc_make_rule_commands
$(call zip_libs_commands,$(CXC_BASE_LIB_DIR)/common.a,$(CXC_COMMON_BUILD_LIBS),$(CXC_BASE_OBJ_DIR)/tmp)
$(call zip_libs_commands,$(CXC_BASE_LIB_DIR)/mta.a,$(CXC_MTA_BUILD_LIBS),$(CXC_BASE_OBJ_DIR)/tmp)
$(MAKE) -f $(CXC_RULES_DIR)/cxcBfcRules.mk bfc MAKEFLAGS=
endef
...
.PHONY: cxc_app clean_cxc_app
cxc_app: cxc_libs
ifneq ($(CXC_OS_TYPE),Win32)
$(bfc_make_rule_commands)
endif
由此得知,之后的编译会分为两个部分,首先编译依赖的库文件,然后进行bfc的make。同时库文件的依赖有mta,xchg_common, xrg, stubs:
~/cm/cxc/REV/cablex/apps/rules/cxcCommonRules.mk:
.PHONY: cxc_libs nobfc
cxc_libs nobfc: mta xchg_common vrg xdrv stubs
~/cm/cxc/REV/cablex/apps/rules/cxcMtaRules.mk:
.PHONY: mta
mta: pre_build
$(MAKE) -C $(CXC_MTA_DIR) -f mtaRules.mk \
XCHG_LIB_DIR=$(CXC_BASE_LIB_DIR)/$(CXC_MTA_OUTPUT_DIR) XCHG_OBJ_DIR=$(CXC_BASE_OBJ_DIR)/$(CXC_MTA_OUTPUT_DIR)
~/cm/cxc/REV/cablex/apps/rules/cxcCablexChangeRules.mk:
.PHONY: default pre_build clean
default: cxc_app
pre_build: pre_build_config
...
.PHONY: pre_build_config
pre_build_config: pre_build_announcement
$(ECHO) -e 'Generating dynamic configuration files\n'
...
.PHONY: pre_build_announcement
pre_build_announcement:
$(ECHO) -e 'Building CablexChange\n'
3. 根据关联编译库文件
根据上述已经得知,编译时候首先会编译生成库文件,下面以mta库文件的生成为例,说明其过程:
(1)进入mta的目录,include必要的makefile:
mtaRules.mk
~/cm/cxc/REV/xchg_common/rules/xChgEnv.mk
~/cm/cxc/REV/xchg_common/rules/xChgEnv_eCos.mk
mtaTargets.mk
~/cm/cxc/REV/xchg_common/xchg_common_env.mk
~/cm/cxc/REV/xchg_common/xchg_common_targets.mk
~/cm/cxc/REV/xchg_common/rules/xChgEnv.mk
~/cm/cxc/