Bcm96xx 系列芯片 SDK介绍(一)
Bcm96xx系列SDK支持的芯片從代碼的target目錄就可以看出,有63186362 63268 6328 6368 6818 6818O 6838O 68500 等芯片。此SDK使用的Linux內(nèi)核版本算是比較高的了,為Linux3.4。
Broadcom的網(wǎng)站提供下載:bcm963xx_4.14L.04_data_src.tar.gz
1 目錄結(jié)構(gòu)
bcmdrivers/ -- broadcom 的驅(qū)動,包括開源公開的和私有不公開的
cfe/ -- broadcom 芯片的boot代碼
data-model/ -- 一些xml和txt形式的業(yè)務(wù)配置文件
docs/ -- 關(guān)于sdk的一些文檔放在這里
hostTools/ -- 版本生成和制作工具的源碼
images/-- 存放生成的版本文件
kernel/ -- linux內(nèi)核代碼
release/ -- 一些lisence copyright release 等說明及pl腳本
shared/ -- 包含cfe和bcmdrivers都需要用到的驅(qū)動代碼
targets/ -- 包含芯片目錄,文件系統(tǒng),bcm的內(nèi)核配置文件以及版本文件等
userspace/ -- 應(yīng)用層代碼都在這里
底層驅(qū)動開發(fā)者需要關(guān)注bcmdrivers目錄和kernel目錄,而上層應(yīng)用開發(fā)者需要關(guān)注userspace目錄的代碼。若要更改Boot則需要關(guān)注cfe目錄,它里面存放了boot的源代碼。版本制作則需要關(guān)注hostTools目錄及targets目錄,前者包含制作版本工具的源碼,而后者包含了文件系統(tǒng)生成的來源,當然docs目錄下的文檔是每個新手開發(fā)者一開始就要學習的。
需要說明的是以上的目錄并不包括編譯工具鏈,其編譯工具鏈是單獨發(fā)布的,我的編譯工具鏈放置在這里:
/opt/toolchains/crosstools-mips-gcc-4.6-linux-3.4-uclibc-0.9.32-binutils-2.21
2 編譯架構(gòu)
從目錄結(jié)構(gòu)可以大致的了解SDK整體的代碼組織結(jié)構(gòu),而編譯架構(gòu)則是更深入了解SDK層次的直接途徑,包括驅(qū)動和應(yīng)用層代碼的層次結(jié)構(gòu)、哪些代碼在用哪些代碼未用,Linux內(nèi)核的宏配置,文件系統(tǒng)如何制作,版本文件如何生成,應(yīng)用層的CMS如何運轉(zhuǎn),如何在現(xiàn)有SDK上新增驅(qū)動代碼和應(yīng)用層代碼,以及如何配置它們的編譯。SDK的編譯可以整編,也可以增量編譯。
整體編譯命令:
makePROFILE=xxxx
這里的xxxx就是target目錄下的子目錄,如makePROFILE=96838GWO
其中96838GWO是target目錄下的一個子目錄,上述編譯命令的結(jié)果是編譯出適合在BCM68380芯片上運行的版本。
增量編譯命令:
makePROFILE=xxxx cfe --表示編譯boot
makePROFILE=xxxx kernelbuild --表示編譯linux內(nèi)核
makePROFILE=xxxx modbuild --表示編譯內(nèi)核模塊
makePROFILE=xxxx userspace --表示編譯應(yīng)用層代碼
上面的增量編譯命令使用后,如果要生成版本則都還有使用下面的版本生產(chǎn)編譯命令
makePROFILE=xxxx buildimage --表示生成版本文件
生成的版本文件保存在targets/xxxx/目錄下,名如xxxx_nand_cferom_fs_image_128_jffs2.w。
如何利用版本文件對單板進行升級比較簡單,就不再這里講解了。下面我們進入編譯架構(gòu),即Makefile的解析。對于編譯架構(gòu)的分析,最好是一邊看Makefile,一邊看編譯log來分析,否則單單閱讀makefile太乏味了。
在解析編譯架構(gòu)之前,先概要的說明整個編譯的流程:
1首先,檢查編譯環(huán)境,檢查傳入的PROFILE變量是否與上次編譯時一致,等等檢查
2創(chuàng)建target/fs.install目錄下的子目錄,后期文件系統(tǒng)的制作與這個目錄有關(guān)。
3創(chuàng)建linux內(nèi)核include目錄的ln鏈接
4生成linux內(nèi)核配置文件defconfig,并使用此配置文件編譯linux內(nèi)核
5編譯linux內(nèi)核模塊.ko
6編譯data-model
7編譯userspace,各個應(yīng)用層的程序,busybox等。
8編譯hosttool,文件系統(tǒng)制作工具,版本生產(chǎn)工具,部分放入文件系統(tǒng)的小程序等
9最后生成文件系統(tǒng),生成版本。
接著直接開始剖析Makefile:
編譯的入口是頂層目錄下的Makefile文件,同目錄的make.common、make.deprules、version.make、make.modsw都直接或者間接的include到Makefile中,這幾個文件都非常重要,make.common定義了大堆的變量來表示編譯工具鏈,編譯目錄,編譯庫文件,編譯頭文件,編譯目標,編譯選項等,貫穿編譯的始終,其重要性不言而喻。make.deprules定義了*.c文件到*.d文件的生成規(guī)則,make.version中定義了sdk版本信息,make.modsw定義了一些編譯目標。
編譯入口:
make編譯命令會編譯Makefile內(nèi)遇到的第一個目標:
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這個目錄定義的動作較長,但最終作用就是檢查編譯環(huán)境,版本信息等,編譯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參數(shù)則使用上次編譯時的PROFIEL參數(shù),再比如如果兩次編譯給出的PROFIEL不同則會提示。
因此上述幾個**_check目標就是編譯流程所講的1
接著,create_install目標的規(guī)則
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
其目的是創(chuàng)建文件系統(tǒng)目錄,在版本制作時會間接使用此目錄制作文件系統(tǒng)。
這是介紹的編譯流程所講的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內(nèi)核默認配置文件.config,然后編譯oldconfig目標,即利用config和Kconfig生成內(nèi)核宏。
再接著kernelbuild進入到linux內(nèi)核目錄開始編譯linux內(nèi)核vmlinux。具體如何編譯內(nèi)核的過程這里就不詳細講述了,有興趣的可以查看專門講述linux內(nèi)核編譯的說明。
以上就是我們講述的編譯流程的4
modbuild:
@echo"******************** Starting modbuild ********************";
cd$(KERNEL_DIR); $(MAKE) -j $(ACTUAL_MAX_JOBS) modules &&$(MAKE) modules_install
直接解釋了我們講述的編譯流程的5,編譯生成內(nèi)核模塊.ko文件
userspace:sanity_check create_install data-model $(BCM_SWVERSION_FILE)kernellinks
@echo"MAKING USERSPACE"
$(MAKE)-j $(ACTUAL_MAX_JOBS) -C userspace
直接解釋了我們講述的編譯流程的 7,即編譯userspace目錄下的子目錄,生成各個應(yīng)用程序
hosttools:
$(MAKE)-C $(HOSTTOOLS_DIR)
直接解釋了我們講述的編譯流程的 8
buildimage:kernelbuild libcreduction gen_credits
cd$(TARGETS_DIR); $(HOSTTOOLS_DIR)/fakeroot/fakeroot ./buildFS2
...
這里一系列的動作用來生成文件系統(tǒng)和版本,解釋了我們講述的編譯流程的 9
至此整個的編譯流程就講解完了。
總結(jié)
以上是生活随笔為你收集整理的Bcm96xx 系列芯片 SDK介绍(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣交替打印FooBar
- 下一篇: 集合添加元素python_Python基