声明:原创作品,严禁用于商业目的。 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨。

文章目录

  • 0.写在前篇
  • 1. 博通相关知识简介
  • 1. 总体框架
  • 2. 编译过程
    • 2.1 顶层makefile
    • 2.2 编译入口
  • 3. 根据关联编译库文件
  • 4. 选择编译功能模块
    • 4.1 执行命令
    • 4.2 启动脚本
  • 5. 模块编译
  • 6. 生成镜像img
  • 7. 总结

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-linuxcd ${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/REV/xchg_common/rules/xChgEnv_eCos.mk
~/cm/cxc/REV/voice_res_gw/voice_res_gw_env.mk
~/cm/cxc/REV/voice_res_gw/voice_res_gw_targets.mk
~/cm/cxc/REV/cablex/src/mta/app/app.mk
~/cm/cxc/REV/cablex/src/mta/callclient/callclient.mk
~/cm/cxc/REV/cablex/src/mta/cmmtaint/cmmtaint.mk
~/cm/cxc/REV/cablex/src/mta/common/mtaCommon.mk
~/cm/cxc/REV/cablex/src/mta/net/net.mk
~/cm/cxc/REV/cablex/src/mta/provlib/provlib.mk
~/cm/cxc/REV/cablex/src/mta/rtp/rtp.mk
~/cm/cxc/REV/cablex/src/mta/sec/SecLib/SecLib.mk
~/cm/cxc/REV/cablex/src/mta/util/util.mk
~/cm/cxc/REV/cablex/src/mta/sec/krb5client/krb5client.mk
~/cm/cxc/REV/cablex/src/mta/hgcp/hgcp.mk
~/cm/cxc/REV/cablex/src/mta/sec/SigSec/SigSec.mk
~/cm/cxc/REV/cablex/src/mta/sec/RTPsec/RTPsec.mk
~/cm/cxc/REV/cablex/src/mta/snmplib/snmplib.mk
~/cm/cxc/REV/cablex/src/mta/snmpmlib/snmpmlib.mk
~/cm/cxc/REV/xchg_common/rules/xChgRules.mk
~/cm/cxc/REV/xchg_common/rules/xChgRules_eCos.mk

(2) 确定默认的目标和依赖文件:

/cm/cxc/REV/cablex/src/mta/mtaRules.mk:
.PHONY: all
all:
...
.PHONY: target $(MTA_ALL_TARGETS)
target: $(MTA_ALL_TARGETS) ~/cm/cxc/REV/xchg_common/rules/xChgRules.mk:
all: target~/cm/cxc/REV/cablex/src/mta/mtaTargets.mk:
MTA_ALL_TARGETS :=   \                                                                                                                            app               \   callclient        \   cmmtaint          \   hgcp              \   krb5client        \   mtaCommon         \   net               \   provlib           \   rtp               \   RTPsec            \   SecLib            \   SigSec            \   sip               \   snmplib           \   snmpmlib          \   util

(3)根据以下设定的隐含规则,生成依赖文件:

~/cm/cxc/REV/cablex/src/mta/mtaRules.mk:
libTargets := $(MTA_MAKE_TARGETS) ...
$(foreach target,$(libTargets),$(eval $(call XCHG_ARCHIVE_TEMPLATE,$(target)))) ~/cm/cxc/REV/xchg_common/rules/xChgRules.mk:
define XCHG_ARCHIVE_TEMPLATE
XCHG_OBJ_FILES_$(1) := $(addprefix $(XCHG_OBJ_DIR)/, $(addsuffix $(XCHG_OBJ_EXT),$(basename $(XCHG_SRC_FILES_$(1)))))
XCHG_DEP_FILES_$(1) := $$(XCHG_OBJ_FILES_$(1):$(XCHG_OBJ_EXT)=.d)
XCHG_PREPROCESSED_FILES_$(1) := $(addsuffix .pp,$(basename $(XCHG_SRC_FILES_$(1))))
XCHG_LIB_NAME_$(1) := $(call XCHG_MAKE_LIB_NAME,$(1))
XCHG_AUDIT_FILES_$(1) := $$(XCHG_OBJ_FILES_$(1):$(XCHG_OBJ_EXT)=.audit) $(1) : XCHG_TARGET_NAME := $(1)
$(1) : XCHG_C_LOCAL_INCLUDE := $$(XCHG_C_LOCAL_INCLUDE_$(1)) ${$(1)_cinc}
$(1) : XCHG_C_LOCAL_DEFS    := $$(XCHG_C_LOCAL_DEFS_$(1))
$(1) : XCHG_C_LOCAL_COMPILER_OPTS := $$(XCHG_C_LOCAL_COMPILER_OPTS_$(1)) $$(XCHG_DEP_FILES_$(1)) : XCHG_TARGET_NAME := $(1)
$$(XCHG_DEP_FILES_$(1)) : XCHG_C_LOCAL_INCLUDE := $$(XCHG_C_LOCAL_INCLUDE_$(1)) ${$(1)_cinc}
$$(XCHG_DEP_FILES_$(1)) : XCHG_C_LOCAL_DEFS := $$(XCHG_C_LOCAL_DEFS_$(1))
$$(XCHG_DEP_FILES_$(1)) : XCHG_C_LOCAL_COMPILER_OPTS := $$(XCHG_C_LOCAL_COMPILER_OPTS_$(1)) $$(XCHG_PREPROCESSED_FILES_$(1)) : XCHG_TARGET_NAME := $(1)
$$(XCHG_PREPROCESSED_FILES_$(1)) : XCHG_C_LOCAL_INCLUDE := $$(XCHG_C_LOCAL_INCLUDE_$(1)) ${$(1)_cinc}
$$(XCHG_PREPROCESSED_FILES_$(1)) : XCHG_C_LOCAL_DEFS := $$(XCHG_C_LOCAL_DEFS_$(1))
$$(XCHG_PREPROCESSED_FILES_$(1)) : XCHG_C_LOCAL_COMPILER_OPTS := $$(XCHG_C_LOCAL_COMPILER_OPTS_$(1)) $(1) : $$(XCHG_LIB_NAME_$(1))
$$(XCHG_LIB_NAME_$(1)) : $$(XCHG_OBJ_FILES_$(1)) $(ECHO) 'Creating Archive $$@' $(MKDIR) -p $$(@D) $(RM) -f $$@ $(XCHG_ARCHIVE) $(XCHG_ARCHIVE_OPTS)$$@ $$(XCHG_OBJ_FILES_$(1)) $(ECHO) # The audit_xxxx target will first build the real library and then got through
# the phony audit target to cause all the dependencies to be dumped.
#
audit_$(1) : $(1)
audit_$(1) : $$(XCHG_AUDIT_FILES_$(1))
audit_$(1) :
#   $(ECHO)  'Done Audit of $(1): $$(XCHG_AUDIT_FILES_$(1))' endef

4. 选择编译功能模块

4.1 执行命令

库文件的编译完成以后,cxc_app的依赖cxc_libs已经存在,执行命令语句:

$(MAKE) -f $(CXC_RULES_DIR)/cxcBfcRules.mk bfc MAKEFLAGS=

根据命令开始编译bfc目标:

~/cm/cxc/REV/cablex/apps/rules/cxcBfcRules.mk:
.PHONY: bfc
bfc: cd $(CXC_BFC_APP_BUILD_DIR);$(CXC_BFC_BUILD_CMD) $(CXC_BFC_APP_BUILD_OPTIONS)

然后,调用makeapp脚本:

~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/makeapp
bash ../../Bfc/ecos/makeapp $*

4.2 启动脚本

启动makeapp脚本的目的:进行必要的参数分析和环境设置工作。
(1) 首先在makefile中对最开始make时候带入的参数进行分析,来获取传给makeapp的参数选项:

make euro=1 pktc_ver=15 bfc_opts="ipv6 noslim erouter eu nobattery wombo1 WIFI_43227"~/cm/cxc/REV/cablex/apps/rules/cxcCablexChangeRules.mk:
ifneq ($(euro),)                                                                                                                             ifeq ($(euro),1) export CXC_PKTC_MODE_EURO := 1 else ifeq ($(euro),0)    export CXC_PKTC_MODE_EURO := 0 else $(error "euro option invalid - use 0 or 1")    endif endif
else export CXC_PKTC_MODE_EURO := 0
endif...
ifeq ($(CXC_SIGPROTO_SIP),1) export CXC_PKTC_VERSION := 15
else ifeq ($(pktc_ver),15)                                                                                                                     export CXC_PKTC_VERSION := 15 else export CXC_PKTC_VERSION := 10 endif
endif ~/cm/cxc/REV/cablex/apps/bcm93383wvg/bcm93383wvg_app.mk
CXC_BFC_APP_BUILD_OPTIONS := bcm93383wvg~/cm/cxc/REV/cablex/apps/rules/cxcBfcWrapperRules.mk:
ifeq ($(CXC_PKTC_MODE_EURO),1)
CXC_BFC_APP_BUILD_OPTIONS += eu
endif
...
ifeq ($(CXC_LDX_CFG_DSP_LOAD_ADDR_SUPPORT),1) CXC_BFC_APP_BUILD_OPTIONS += dspaddr
endif
...
CXC_BFC_APP_BUILD_OPTIONS += j 4~/cm/cxc/REV/cablex/apps/rules/cxcBfcWrapperRules.mk:
ifneq ($(bfc_opts),)
CXC_BFC_APP_BUILD_OPTIONS += $(bfc_opts)
endif

根据上述脚本,可以获取传入的选项参数为:
bcm93383wvg eu dspaddr j 4 ipv6 noslim erouter eu nobattery wombo1 WIFI_43227
(2) makeapp对传入的参数进行解析后,调用build.bash编译product

解析后的参数列表:
products     = 'bcm93383wvg'
processors   = ''
yesnoOptions = 'eu dspaddr ipv6 noslim erouter eu nobattery'
paramOptions = 'j 4 wombo1 WIFI_43227'
buildTargets = '' ~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/makeapp:
ParseParameters $* ~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/makeapp:
for p in $products ; do bash $scriptDir/build.bash product $p BfcBuildResult=$? # If the build failed, exit the script (skipping other builds). if [[ $BfcBuildResult != 0 ]] ; then exit $BfcBuildResult fi
done ~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/build.bash:"product") shift BuildProduct $*                                                                                                                      BfcBuildResult=$?

(3) BuildProduct根据传入的product型号,source相应的makefile来获取app_options参数。然后再次进行解析后调用BuildIt:

~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/functions.bash:
function BuildProduct {
...FindScripts $1 productScript=$foundProductScript VendorCustomDir=${foundProductScript%/*}
...source $productScript
...ParseParameters $app_options
...# Now do the build thing.BuildItreturn $?}source的对应型号product的makefile文件~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/Custom/bcm93383wvg_settings.bash
source ${SystemCustomDir}/bcm93383_settings.bash
echo "Setting build options from CmDocsisSystem/ecos/Custom/bcm93383wvg_settings.bash"
app_options="${app_options} cmvendor emta power battery vin12v sled rgipv6 ipv6 spiflash eps novlan bcm80211n managedswitch usb20 telnet c 45 fap_assist nat_hwaccel linux_partitions dualflash monolith" ~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/Custom/bcm93383_settings.bash
source ${BfcOsCustomDir}/bcm93383_settings.bash
echo "Setting build options from CmDocsisSystem/ecos/Custom/bcm93383_settings.bash"
app_options="${app_options} pid 3383 num_sids 16 newleds cacheopt docsis 20 ipv6 spiflash avs power" ~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/Custom/bcm93383_settings.bash
source ${BfcOsCustomDir}/bcm_refdesign_common_settings.bash
echo "Setting build options from Bfc/ecos/Custom/bcm93383_settings.bash"
app_options="${app_options} 3383 d30 spiflash noejtag smisb spectrum_analyzer" ~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/Custom/bcm_refdesign_common_settings.bash
echo "Setting common build options/environment from Bfc/ecos/Custom/bcm_refdesign_common_settings.bash"再次解析后获取的参数列表:
products     = ''
processors   = '3383'
yesnoOptions = 'd30 spiflash noejtag smisb spectrum_analyzer newleds cacheopt ipv6 spiflash avs power cmvendor emta power battery vin12v sled rgipv6 ipv6 spiflash eps novlan bcm80211n managedswitch usb20 telnet fap_assist nat_hwaccel linux_partitions dualflash monolith eu dspaddr ipv6 noslim erouter eu nobattery'
paramOptions = 'pid 3383 num_sids 16 docsis 20 c 45 j 4 wombo1 WIFI_43227'
buildTargets = 'eCos'

(4)BuildIt利用参数进行环境变量的设置,同时调用makefile进行模块的make:

~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/functions.bash:
function BuildIt {
...ConfigureEnvironment
...# Build the app.echo make $dualbuild -f ../Makefile.mak $buildTargetsmake $dualbuild -f ../Makefile.mak $buildTargetsBfcBuildResult=$?
...# Now calculate and display the elapsed time for the build.DisplayElapsedBuildTimereturn $BfcBuildResult
}
...
function ConfigureEnvironment {...ProcessBuildProcessor $buildProcessorProcessYesNoOptions $defaultYesnoOptions $yesnoOptionsProcessParamOptions pid $buildProcessor $defaultParamOptions $paramOptionsProcessBuildTargets $buildTargets
...ConfigureOutputDirSuffixExt
...
}

5. 模块编译

(1) 读取必要的控制型makefile,确定目标和依赖关系:

~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/Makefile.mak
include $(BFC_ROOT_DIR)/Bfc/make/BfcEcos.mak~/cm/cxc/REV/rbb_cm_src/Bfc/make/BfcEcos.mak
# Get the BFC system configuration file.  This is specific to each
# application/system, and comes from the app's portable directory.
include $(APP_PORTABLE_DIR)/BfcSystemConfig.mak# UNFINISHED - the eCos kernel has callouts to our code that, unfortunately,
# forces the HeapManager to be included.  Until we change the kernel to remove
# this dependency, we need to force the HeapManager to be included for eCos.
BFC_INCLUDE_HEAP_MANAGER_SUPPORT = 1# BFC global makefile.  This has all the BFC component makefiles together.
include $(BFC_MAKE_DIR)/Bfc.mak
# If the top level makefile set things up properly, let's include the target-
# specific makefile to get drivers and other components.
ifeq ($(IncludeTargetSpecificMakefile), 1)include $(BFC_MAKE_DIR)/$(TargetSpecificMakefile)
endif# Finally, include the application/system specific makefile.
include $(APP_PORTABLE_DIR)/BfcSystem.mak
...
ALL_OBJS = $(sort $(filter-out VersionBanner.o, $(BFC_OBJECTS))) VersionBanner.o
...
eCos : $(APP_PORTABLE_DIR)/BfcSystemConfig.mak $(ALL_OBJS) linkobjs.txt@ echo "==== Linking the application ($@)..."
ifeq ($(BCM_OPTIMIZE_CACHE), 1)@ echo "==== Using Cache-optimized linker script."
endif$(CXX) $(LDFLAGS_BASIC) -T$(LINKER_SCRIPT) -o eCos.elf -Xlinker linkobjs.txt \-Wl,--start-group $(LIBS) -Wl,--end-group@ echo ==== Post-processing...@ $(RM) -f $(BFC_IMAGE_NAME).map $(BFC_IMAGE_NAME).map.d $(BFC_IMAGE_NAME).shortmap $(BFC_IMAGE_NAME).dasm
...

(2) 在具体模块总的makefile中,根据环境变量和模块控制开关的设置,include需要的子模块和需要编译的具体文件:

~/cm/cxc/REV/rbb_cm_src/Bfc/make/BfcNetworking.mak
include $(BFC_MAKE_DIR)/BfcEthernetNetworking.mak
include $(BFC_MAKE_DIR)/BfcUsbNetworking.mak
include $(BFC_MAKE_DIR)/BfcIpStackNetworking.mak
include $(BFC_MAKE_DIR)/BfcWifi80211Networking.mak
include $(BFC_MAKE_DIR)/BfcPciNetworking.mak
include $(BFC_MAKE_DIR)/BfcScbNetworking.mak
include $(BFC_MAKE_DIR)/BfcMocaNetworking.mak
ifeq ($(BFC_INCLUDE_ITC_SUPPORT), 1)include $(BFC_MAKE_DIR)/BfcItcNetworking.mak
endif
ifeq ($(BFC_INCLUDE_INTER_OS_COMM_SUPPORT),1)include $(BFC_MAKE_DIR)/BfcItcNetworking.mak
endififeq ($(BFC_APROUTER_SUPPORT), 1)include $(BFC_MAKE_DIR)/BfcAprNetworking.mak
endififeq ($(BFC_INCLUDE_NETWORKING_SUPPORT), 1)include $(BFC_MAKE_DIR)/BfcIpHelpers.makinclude $(BFC_MAKE_DIR)/BfcDhcp.makinclude $(BFC_MAKE_DIR)/BfcPing.makinclude $(BFC_MAKE_DIR)/BfcTftp.makinclude $(BFC_MAKE_DIR)/BfcHttpServer.makinclude $(BFC_MAKE_DIR)/BfcDnsResolver.makinclude $(BFC_MAKE_DIR)/BfcIpV6.makinclude $(BFC_MAKE_DIR)/BfcDhcpV6.makinclude $(BFC_MAKE_DIR)/BfcFtpLite.makinclude $(BFC_MAKE_DIR)/BfcRfc3484DftAddrSel.makinclude $(BFC_MAKE_DIR)/BfcTR69.mak
endififeq ($(BFC_INCLUDE_NETWORKING_SUPPORT), 1)# Core networking modulesBFC_OBJECTS += $(BFC_NETWORKING_OBJECTS)
endif

(3) 在子模块的makfile中根据配置,具体控制需要编译的源文件:

~/cm/cxc/REV/rbb_cm_src/Bfc/make/BfcEthernetNetworking.mak
BFC_ETHERNET_NETWORKING_OBJECTS = EthernetNiHalIf.o
...
ifeq ($(BFC_INCLUDE_NETWORKING_SUPPORT), 1)# Core networking modulesBFC_OBJECTS += $(BFC_NETWORKING_OBJECTS)
endif~/cm/cxc/REV/rbb_cm_src/Bfc/make/BfcIpHelpers.mak
...
# IP helper support files.
BFC_IPHELPERS_OBJECTS = IpHelperFactory.o IpServiceAppIf.o MiniUsfsSnoop.o \                                                                 BcmSocket.o SocketSet.o SocketFactory.o UsfsTable.o
# SNMP files for IP helpers
BFC_IPHELPERS_SNMP_OBJECTS = ipMib.o ipBridge.o udpMib.o udpBridge.o \                                                                       MibFactory.o NetToMediaSnoop.o NetToMediaThread.o
...
ifeq ($(BFC_INCLUDE_IPHELPERS_SUPPORT), 1)BFC_OBJECTS += $(BFC_IPHELPERS_OBJECTS) $(BFC_$(BFC_TARGET_OS)_IPHELPERS_OBJECTS)                                                        ifeq ($(BFC_INCLUDE_SNMP_SUPPORT), 1)BFC_OBJECTS += $(BFC_IPHELPERS_SNMP_OBJECTS)endif
endif

最后在include所有需要的makefile后,也就确定了所需要编译的目标文件:
(4) 按照设置的默认规则,编译目标文件:

~/cm/cxc/REV/rbb_cm_src/Bfc/make/BfcEcos.mak
...
COMPILING_STRING  = "==== Compiling $(<F)  (in $(subst ../,,$(<D)))"
ASSEMBLING_STRING = "==== Assembling $(<F)  (in $(subst ../,,$(<D)))"
...
%.o : %.s@ echo $(ASSEMBLING_STRING)$(ECHO) $(CC) $(CFLAGS_AS) -c -o $@ $<
%.d %.o : %.c@ echo $(COMPILING_STRING)$(ECHO) $(CC) $(CFLAGS) -c $<
%.s : %.c@ echo $(COMPILING_STRING)$(ECHO) $(CC) $(CFLAGS) -S $<
%.i : %.c@ echo $(COMPILING_STRING)$(ECHO) $(CC) $(CFLAGS) -E $< -o $@
...
%.o : %.s@ echo $(ASSEMBLING_STRING)$(ECHO) $(CC) $(CFLAGS_AS) -c -o $@ $<
%.d %.o : %.c@ echo $(COMPILING_STRING)$(ECHO) $(CC) $(CFLAGS) -c $<
%.s : %.c@ echo $(COMPILING_STRING)$(ECHO) $(CC) $(CFLAGS) -S $<
%.i : %.c@ echo $(COMPILING_STRING)$(ECHO) $(CC) $(CFLAGS) -E $< -o $@
...

6. 生成镜像img

最后链接所有的目标文件和库文件,生成img。放置位置:~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/bcm93383wvg_eu_ipv6

mipsisa32-elf-g++ -EB -static -nostdlib -L~/cm/cxc/REV/rbb_cm_src/Bfc/LibSupport/eCos/bcm33xx_ipv6_install/lib -Wl,--gc-sections -Wl,-defsym -Wl,BFC_START_ADDRESS=0x80004000 -Ttarget.cacheopt.ld -o eCos.elf -Xlinker linkobjs.txt \-Wl,--start-group ../../../CableModemBsp/bsp_common/Hal80211/eCosPcie_lib80211.a ../../../CableModemBsp/bsp_common/Hal80211/eCosPcie_lib80211_app.a ../../../Bfc/LibSupport/NetSnmp/NetSnmp/libnetsnmp_ecos_openssl098.a ../../../Bfc/LibSupport/NetSnmp/NetSnmp/libnetsnmpagent_ecos.a ../../../Bfc/LibSupport/NetSnmp/NetSnmp/libnetsnmphelpers_ecos.a ../../../Bfc/LibSupport/NetSnmp/NetSnmp/libnetsnmpmibs_ecos.a ../../../CableModemBsp/ioproc/IopLib3383.a ../../../CableModemBsp/ioproc/IopLib3383Bx.a ../../../Bfc/LibSupport/Vpn/libXpressIpsecEcos_3380_098.a ../../../Bfc/LibSupport/OpenSSL098/libOpenSSLecos.a ../../../Bfc/LibSupport/AckCel/AckCel.eCos.a ../../../Bfc/LibSupport/Propane/eCos/Propane05eCos.a ../../../Bfc/LibSupport/Avs/avs_tracker.o ../../../Bfc/LibSupport/Vpn/libXpressIpsecEcos_3380_098.a ../../../Bfc/LibSupport/OpenSSL098/libOpenSSLtlsecos.a ~/cm/cxc/REV/cablex/lib/eCos/bcm93383wvg_euro_pktc15_ipv6_secModePSM/mta.a ~/cm/cxc/REV/cablex/lib/eCos/bcm93383wvg_euro_pktc15_ipv6_secModePSM/common.a ~/cm/cxc/REV/cablex/lib/eCos/bcm93383wvg_euro_pktc15_ipv6_secModePSM/libhausware.a -Wl,--end-group
==== Post-processing...
mipsisa32-elf-nm --demangle --numeric-sort  eCos.elf >ecram.shortmap
mipsisa32-elf-objcopy --output-target=binary  eCos.elf ecram.bin
ProgramStore -c 45 -f ecram.bin -o ecram_sto.bin \-v 003.000 -a 0x80004000 -s 0x3383
Using LZMA Compression.
before compression: 18587676  after compression: 3896107
^MPercent Compression = 79.04
^M*
* Success!
*
~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/bcm93383wvg_eu_ipv6
-rwxrwxr-x 1 martin martin 18587676 Nov 29 15:06 ecram.bin
-rw-rw-r-- 1 martin martin  3147526 Nov 29 15:06 ecram.shortmap
-rw-rw-r-- 1 martin martin  3896199 Nov 29 15:07 ecram_sto.bin
make[3]: Leaving directory `~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/ecos/bcm93383wvg_eu_ipv6'

7. 总结

在编译时候,在上层设置的命令中携带的参数会控制系统编译时候的选择。在这过程中,其控制在以下几点产生作用:
在以下几个makefile文件中对make传入的参数进行分析,传入makeapp中:
~/cm/cxc/REV/cablex/apps/rules/cxcCablexChangeRules.mk
~/cm/cxc/REV/cablex/apps/bcm93383wvg/bcm93383wvg_app.mk
~/cm/cxc/REV/cablex/apps/rules/cxcBfcWrapperRules.mk

在以下两个shell文件中,对传入makeapp的参数进行分析设置:
~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/makeapp
~/cm/cxc/REV/rbb_cm_src/Bfc/ecos/functions.bash

最后在以下几个makefile文件中,对设置的环境变量进行解析后,设置开关来控制具体编译的模块以及相应的目标文件列表:
~/cm/cxc/REV/rbb_cm_src/Bfc/make/BfcEcos.mak
~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/BfcSystemConfig.mak
~/cm/cxc/REV/rbb_cm_src/Bfc/make/Bfc.mak
~/cm/cxc/REV/rbb_cm_src/CmDocsisSystem/BfcSystem.mak

下一篇继续分析和探讨 BootLoader的启动过程,敬请期待…

博通Broadcom SDK源码学习与开发1——SDK源码探究与Cable Modem 系统编译相关推荐

  1. 博通Broadcom SDK源码学习与开发3——Cable Modem Docsis3.0

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. Ch ...

  2. 博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 0.写在前 ...

  3. 博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. 相关 ...

  4. 博通Broadcom SDK源码学习与开发4——ECOS系统数据流

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. SD ...

  5. 博通Broadcom SDK源码学习与开发5——ECOS系统层剖析

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. Op ...

  6. 博通Broadcom SDK源码学习与开发12终结篇——TR069网管协议

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. TR ...

  7. 博通Broadcom SDK源码学习与开发11——Cable Modem DHCP管理

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 1. DH ...

  8. 博通(Broadcom)收购赛门铁克(Symantec)将一波三折,这是第一折

    外媒报道美国网络安全公司赛门铁克(Symantec)终止了有关博通(Broadcom)的收购谈判,主要原因在于赛门铁克认为博通的收购出价太低,赛门铁克不接受低于每股28美元的出价. 有这个消息导致了, ...

  9. 通过weui-1.1.3源码学习前端开发(三)从example看起-src/index.html文件

    通过weui-1.1.3源码学习前端开发(三)从example看起 前面已经看过了gulp的构建文件gulpfile.js,下面我们就从weui提供的一个example开始看看吧 先看看src/exa ...

最新文章

  1. fastjson又被发现漏洞,这次危害可导致服务瘫痪!
  2. java字符匹配,Java:匹配字符串中的短语
  3. Linux kernel 3.10内核源码分析--进程退出exit_code
  4. python3学哪个版本好玩_python2和python3到底应该学哪个好?
  5. 函数式编程filter函数,list()表示列表显示值
  6. BP: Useful report to list assigned employees
  7. 直接内存与元空间_深入浅出 JVM 内存管理
  8. matlab 读取照片imread,利用matlab读取图像
  9. java控制台输入汉字_给我一个JAVA控制台输入中文的实例
  10. ubuntu学习日记--Lesson6:shell,bash,dash
  11. java PDF转jpg
  12. 地下城与勇士(DNF)安图恩副本(黑雾之源、震颤的大地、舰炮防御战、擎天之柱、能量阻截战、黑色火山、安徒恩的心脏)(童年的回忆)
  13. HTTP代理模式学习
  14. linux目录复制 cp: omitting directory
  15. 《苏菲的世界》读书笔记
  16. 2020-10-18Go语言接口
  17. C 递归 详解(通俗易懂)
  18. cadence原理图复用_详细了解一下Allegro原理图设计工具SDA 的十大主要功能和改变...
  19. 30行Python代码,抓取全网实时热点,获取最新资讯
  20. SAP调研问卷(草稿)

热门文章

  1. 怎样才能使呼叫中心创新变得更有价值
  2. 测试用例设计—场景分析法
  3. Python爬虫与信息提取(五)爬虫实例:爬取新浪微博热搜排名
  4. java的graphics2d_Java Graphics2D类的绘图方法
  5. 为什么要使用dubbo
  6. [异能程序员]第六章 遛狗(第二更)
  7. 部署scrapy爬虫到AWS Ubuntu 18.04,用crontab定时执行
  8. Oracle Acs资深顾问罗敏 老罗技术核心感悟:11g的数据压缩技术
  9. http服务(nginx、apache)停用不安全的SSL协议、TLS1.0和TLS1.1协议/启用TLS1.3
  10. 程序linux培训,马哥-51CTO-Linux培训-0910-程序包管理