您的位置:首页 > 其它

Bcm96xx 系列芯片 SDK介绍(一)

2014-09-24 21:09 465 查看
http://blog.csdn.net/tianming5202/article/details/38900747

Bcm96xx系列SDK支持的芯片从代码的target目录就可以看出,有63186362
63268 6328 6368 6818 6818O 6838O 68500 等芯片。此SDK使用的Linux内核版本算是比较高的了,为Linux3.4。

Broadcom的网站提供下载:bcm963xx_4.14L.04_data_src.tar.gz

1 目录结构

bcmdrivers/ -- broadcom 的驱动,包括开源公开的和私有不公开的

cfe/ -- broadcom 芯片的boot代码

data-model/ -- 一些xml和txt形式的业务配置文件

docs/ -- 关于sdk的一些文档放在这里

hostTools/ -- 版本生成和制作工具的源码

images/-- 存放生成的版本文件

kernel/ -- linux内核代码

release/ -- 一些lisence
copyright release 等说明及pl脚本

shared/ -- 包含cfe和bcmdrivers都需要用到的驱动代码

targets/ -- 包含芯片目录,文件系统,bcm的内核配置文件以及版本文件等

userspace/ -- 应用层代码都在这里

底层驱动开发者需要关注bcmdrivers目录和kernel目录,而上层应用开发者需要关注userspace目录的代码。若要更改Boot则需要关注cfe目录,它里面存放了boot的源代码。版本制作则需要关注hostTools目录及targets目录,前者包含制作版本工具的源码,而后者包含了文件系统生成的来源,当然docs目录下的文档是每个新手开发者一开始就要学习的。

需要说明的是以上的目录并不包括编译工具链,其编译工具链是单独发布的,我的编译工具链放置在这里:

/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21

2 编译架构

从目录结构可以大致的了解SDK整体的代码组织结构,而编译架构则是更深入了解SDK层次的直接途径,包括驱动和应用层代码的层次结构、哪些代码在用哪些代码未用,Linux内核的宏配置,文件系统如何制作,版本文件如何生成,应用层的CMS如何运转,如何在现有SDK上新增驱动代码和应用层代码,以及如何配置它们的编译。SDK的编译可以整编,也可以增量编译。

整体编译命令:

makePROFILE=xxxx

这里的xxxx就是target目录下的子目录,如makePROFILE=96838GWO

其中96838GWO是target目录下的一个子目录,上述编译命令的结果是编译出适合在BCM68380芯片上运行的版本。

增量编译命令:

makePROFILE=xxxx cfe --表示编译boot

makePROFILE=xxxx kernelbuild --表示编译linux内核

makePROFILE=xxxx modbuild --表示编译内核模块

makePROFILE=xxxx userspace --表示编译应用层代码

上面的增量编译命令使用后,如果要生成版本则都还有使用下面的版本生产编译命令

makePROFILE=xxxx buildimage --表示生成版本文件

生成的版本文件保存在targets/xxxx/目录下,名如xxxx_nand_cferom_fs_image_128_jffs2.w。

如何利用版本文件对单板进行升级比较简单,就不再这里讲解了。下面我们进入编译架构,即Makefile的解析。对于编译架构的分析,最好是一边看Makefile,一边看编译log来分析,否则单单阅读makefile太乏味了。

在解析编译架构之前,先概要的说明整个编译的流程:

1首先,检查编译环境,检查传入的PROFILE变量是否与上次编译时一致,等等检查

2创建target/fs.install目录下的子目录,后期文件系统的制作与这个目录有关。

3创建linux内核include目录的ln链接

4生成linux内核配置文件defconfig,并使用此配置文件编译linux内核

5编译linux内核模块.ko

6编译data-model

7编译userspace,各个应用层的程序,busybox等。

8编译hosttool,文件系统制作工具,版本生产工具,部分放入文件系统的小程序等

9最后生成文件系统,生成版本。

接着直接开始剖析Makefile:

编译的入口是顶层目录下的Makefile文件,同目录的make.common、make.deprules、version.make、make.modsw都直接或者间接的include到Makefile中,这几个文件都非常重要,make.common定义了大堆的变量来表示编译工具链,编译目录,编译库文件,编译头文件,编译目标,编译选项等,贯穿编译的始终,其重要性不言而喻。make.deprules定义了*.c文件到*.d文件的生成规则,make.version中定义了sdk版本信息,make.modsw定义了一些编译目标。

编译入口:

make编译命令会编译Makefile内遇到的第一个目标:

all:prebuild_checks all_postcheck1

明显all目标依赖于其它两个目标prebuild_checks和all_postcheck1

而all_postcheck1目标又依赖于一大堆的其他目标:

all_postcheck1:profile_saved_check sanity_check \

create_installkernelbuild modbuild kernelbuildlite \

userspace gdbserver vodsl dectd hosttools buildimage

我们先将其放在一边,来看看prebuild_checks目标,这个目标在Makefile中并不存在,而是在make.common中,但别忘了Makefile包含了make.common

BUILD_DIR= $(shell pwd)

include$(BUILD_DIR)/make.common

这样Makefile也就包含make.common中定义的prebuild_checks目标

prebuild_checks:

@echo"shell is $(SHELL). Bash version is $(shell echo$$BASH_VERSION)"

@if[ -z "$(shell echo $$BASH_VERSION)" ]; then \

echo"***************************************************"; \

echo"ERROR: $(SHELL) does not invoke bash shell"; \

echo"***************************************************"; \

exit1; \

fi

....

prebuild_checks这个目录定义的动作较长,但最终作用就是检查编译环境,版本信息等,编译log上可以看出:

shellis /bin/sh. Bash version is 4.1.2(1)-release

Checkingbcm tools version

Rel1.0

Checkingmake version

3.81

Checkinghost kernel version

2.6.32-358.el6.x86_64

Checkingautomake version:

1.11.1

Checkingautoconf version:

2.63

Checkingtar version:

1.24

Checkingpatch version:

2.6

profile_saved_checksanity_check 目标都是对于PROFILE的检查,比如如果不给PROFIEL参数则使用上次编译时的PROFIEL参数,再比如如果两次编译给出的PROFIEL不同则会提示。

因此上述几个**_check目标就是编译流程所讲的1

接着,create_install目标的规则

create_install:

mkdir-p $(PROFILE_DIR)/fs.install/etc

mkdir-p $(INSTALL_DIR)/bin

mkdir-p $(INSTALL_DIR)/lib

mkdir-p $(INSTALL_DIR)/etc/snmp

mkdir-p $(INSTALL_DIR)/etc/iproute2

mkdir-p $(INSTALL_DIR)/opt/bin

mkdir-p $(INSTALL_DIR)/opt/modules

mkdir-p $(INSTALL_DIR)/opt/scripts

其目的是创建文件系统目录,在版本制作时会间接使用此目录制作文件系统。

这是介绍的编译流程所讲的2

kernelbuild:kernellinks $(BCM_SWVERSION_FILE)

$(callpre_kernelbuild)

cd$(KERNEL_DIR); $(MAKE) -j $(ACTUAL_MAX_JOBS)

definepre_kernelbuild

@echo

@echo-------------------------------------------

@echo... starting kernel build at $(KERNEL_DIR)

@echoKERNEL_CHECK_FILE is $(KERNEL_CHECK_FILE)

@echoPROFILE_KERNEL_VER is $(PROFILE_KERNEL_VER)

@cd$(INC_KERNEL_BASE); \

if[ ! -e $(KERNEL_DIR)/$(KERNEL_CHECK_FILE) ]; then \

echo "Untarring original Linux kernel source:$(LINUX_ZIP_FILE)"; \

(tar xkfpj $(LINUX_ZIP_FILE) 2> /dev/null || true); \

fi

$(GENDEFCONFIG_CMD)$(PROFILE_PATH) ${MAKEFLAGS}

cd$(KERNEL_DIR); \

cp-f $(KERNEL_DIR)/arch/mips/defconfig $(KERNEL_DIR)/.config; \

$(MAKE)oldconfig;

endef

上面的$(GENDEFCONFIG_CMD)$(PROFILE_PATH) ${MAKEFLAGS} 命令用来生成defconfig文件。

然后将defconfig拷贝为linux内核默认配置文件.config,然后编译oldconfig目标,即利用config和Kconfig生成内核宏。

再接着kernelbuild进入到linux内核目录开始编译linux内核vmlinux。具体如何编译内核的过程这里就不详细讲述了,有兴趣的可以查看专门讲述linux内核编译的说明。

以上就是我们讲述的编译流程的4

modbuild:

@echo"******************** Starting modbuild ********************";

cd$(KERNEL_DIR); $(MAKE) -j $(ACTUAL_MAX_JOBS) modules &&$(MAKE) modules_install

直接解释了我们讲述的编译流程的5,编译生成内核模块.ko文件

userspace:sanity_check create_install data-model $(BCM_SWVERSION_FILE)kernellinks

@echo"MAKING USERSPACE"

$(MAKE)-j $(ACTUAL_MAX_JOBS) -C userspace

直接解释了我们讲述的编译流程的 7,即编译userspace目录下的子目录,生成各个应用程序

hosttools:

$(MAKE)-C $(HOSTTOOLS_DIR)

直接解释了我们讲述的编译流程的 8

buildimage:kernelbuild libcreduction gen_credits

cd$(TARGETS_DIR); $(HOSTTOOLS_DIR)/fakeroot/fakeroot ./buildFS2

...

这里一系列的动作用来生成文件系统和版本,解释了我们讲述的编译流程的 9

至此整个的编译流程就讲解完了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: