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

声明:原创作品,严禁用于商业目的。 本系列文章将全面剖析以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/
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
博通SDK 6.5 EA6是一款适用于博通芯片的软件开发工具包,用于开发和定制嵌入式系统。在使用该SDK时,有时会需要修改Flash分区来满足特定的需求。 修改Flash分区是指重新划分Flash存储器的空间,将存储空间划分为不同的分区,以满足系统对存储空间的不同需求。通常在系统开发过程中,可能会需要将存储器划分为固件分区、配置分区、资源分区等,以便有效管理和存储不同类型的数据。 在博通SDK 6.5 EA6中,修改Flash分区可以通过以下步骤完成: 1. 打开SDK中的Flash分区配置文件,该文件通常被称为partition_table.csv或partition_table.txt。该文件记录了当前Flash分区的信息。 2. 根据需要修改文件中的分区信息。可以调整分区的起始地址、大小和属性等。注意,更改分区信息可能会影响系统的正常运行,因此在修改前,需要仔细了解系统的存储需求和约束,确保修改是安全和正确的。 3. 保存并关闭分区配置文件。 4. 在SDK开发环境中重新编译和构建系统。根据SDK的具体使用方式和指导文档,进行相应的构建操作。在构建过程中,系统会按照新的分区配置生成相应的固件映像。 5. 将生成的固件映像烧录到目标硬件上的Flash存储器。通常可以使用专门的烧录工具或者开发板上的Bootloader来完成这一步骤。 通过以上步骤,就可以完成对博通SDK 6.5 EA6中Flash分区的修改。注意,在修改Flash分区时,一定要非常谨慎,确保对系统的影响和风险可控。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kcyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值