BCM SDK 移植与编译学习笔记.docx
- 文档编号:5245195
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:36
- 大小:721.78KB
BCM SDK 移植与编译学习笔记.docx
《BCM SDK 移植与编译学习笔记.docx》由会员分享,可在线阅读,更多相关《BCM SDK 移植与编译学习笔记.docx(36页珍藏版)》请在冰豆网上搜索。
BCMSDK移植与编译学习笔记
BCMSDK移植与编译学习笔记
一、BCMSDK编译概述:
1、BCMSDKMakefile相关文件概览
BCMSDK中有一个专门的make文件夹,里面包含编译SDK所需的Makefile文件,如下图所示:
编译SDK是从$SDK\systems\vxworks\product-xxx目录下的Makefile文件开始的($SDK指的是放置SDK代码的根目录,如上图所示,$SDK就代表:
“Z:
\sdk-xgs-robo-5.9.0”目录),这里的“product-xxx”指的是待编译产品对应的目录,比如本文档中该“product-xxx”指的就是rc551es。
2、Makefile文件修改的一般步骤
为了能让SDK在不同的平台下均可编译,SDK的Make目录下有许多文件,这其中有一些对我们是没有用的,以下是删除了所有无用Makefile文件后的目录情况。
对于修改Makefile所需的工作,在make目录的README文件中,有详细的说明,所以下面只简要描述一下修改所需进行的工作,详细内容请参考README中的说明。
●把Make.local.template复制一份,并改名为Make.local文件,可通过修改该文件实现对BCM指定芯片的支持,比如:
只想在编译出的SDK库文件中支持BCM56334芯片,那么可以在该文件中加入如下语句:
●新创建一个名为:
Makefile.vxworks-xxx(xxx产品对于板卡名称)的文件,如果产品是全新的,可以从已有的Makefile.vxworks-bmw/gto/jag/jagle/keystone/nsx/raptor/raptorle/robo-4704等文件中找一个最相似的,然后进行修改,如果产品已经有移植好的SDK,当前只是为了升级一下SDK版本,可以直接从已经移植好的SDK目录中将Makefile.vxworks-xxx拷贝过来。
●在$SDK/systems/vxworks目录下,为目标产品创建一个新的目录,从其他相似目录中把socdiag.c、Makefile文件拷贝过来,并把Makefile文件修改正确。
●$SDK/make目录下,绝大部分文件不需要修改,但有时遇到编译不过的时候,也需要对其做一定的处理,具体情况可参考下面有关SDK具体编译相关说明。
二、以RC551ES设备为例的SDK编译及移植:
(注:
以下步骤记录了以RC551ES为目标设备,将一套新的BCMSDK编译并移植上去所需进行的操作,希望能借此流水记录的方式让阅读本文档的人对BCMSDK的编译和移植有一个感性的认识。
整个过程以Workbench为开发环境,移植之前的RC551ES目标设备上已有一套u-boot启动环境,并且BSP也是现成可用的,如您阅读本文档的目的是希望参照本文档中的记录,将SDK编译并移植到其他目标设备中,那么这些前期工作需要自行处理好。
)
1编译SDK过程中的一些重要变量
下面对编译SDK需要用到的变量做简要说明:
1.1WIND平台相关:
ØWIND_BASE:
(必须定义)
定义方式:
直接在外部环境变量中设置好;(该变量在workbenchhostshell中有默认的定义,但分隔符方向与需要的相反,可使用“SETWIND_BASE=%WIND_BASE:
\=/%”方式,直接将对应的变量的分隔符方向修改一下)
说明:
●该变量指向workbench中vxworks对应版本的目录,比如要使用的是vxworks6.7,那么该变量的定义就是:
E:
\WindRiver\vxworks-6.7,如果使用的是vxworks5.5,那么该变量的定义就是E:
\WindRiver\vxworks-5.5;
●该变量可以直接从workbench的HostShell默认环境变量中得到,但由于默认路径使用的是“\”分隔符,无法识别,所以在编译SDK的时候,还需要手动将“\”分隔符替换为“/”分隔符;
●该变量决定了SDK编译过程中需要用到的的两个重要目录位置:
1、操作系统相关编译工具的目录位置(如:
cc.exe、make.exe等);2、系统头文件的目录位置(参加:
Makefile相关文件中INCS变量的定义);
值:
WIND_BASE=E:
/WindRiver/vxworks-6.7
ØWIND_GNU_PATH:
(必须定义)
定义方式:
直接在外部环境变量中设置好;(该变量在workbenchhostshell中有默认的定义,但分隔符方向与需要的相反,可使用“SETWIND_GNU_PATH=%WIND_GNU_PATH:
\=/%”方式,直接将对应的变量的分隔符方向修改一下)
说明:
●该变量指向workbench中gnu工具对应的目录;
●该变量可以直接从workbench的HostShell默认环境变量中得到,但由于默认路径使用的是“\”分隔符,无法识别,所以在编译SDK的时候,还需要手动将“\”分隔符替换为“/”分隔符;
●该变量对SDK编译的影响与WIND_BASE变量一样;
值:
WIND_GNU_PATH=E:
/WindRiver/gnu/4.1.2-vxworks-6.7
ØWIND_HOST_TYPE:
(必须定义)
定义方式:
直接在外部环境变量中设置好;(可直接使用windriverShell中对应的定义)
说明:
●该变量定义了编译工具相关的主机类型,可以直接从windriverShell中获得;
●该变量对SDK编译的影响与上面两个变量一样;
值:
WIND_HOST_TYPE=x86-win32
1.2系统相关:
ØHOSTTYPE:
(必须定义)
定义方式:
直接在外部环境变量中设置好;
说明:
●该变量定义了系统的主机类型,在编译过程中,决定了一些内部变量的定义方式,如果该变量不定义,编译的时候会提示无法解析系统类型的编译错误(错误提示:
Make.tools:
147:
***Cannotfigureoutsystemtype.);
值:
HOSTTYPE=Windows2000PC
1.3SDK相关:
ØSDK:
(必须定义)
定义方式:
由外部环境变量传入;
说明:
●指向SDK目录的最顶层
●$SDK\systems\vxworks\product_xxx\Makefile文件会对SDK变量的定义与否进行判断,如果该变量未定义,会直接提示错误(错误提示如下:
The$$SDKenvironmentvariableisnotset);
值:
该变量的值为SDK最顶层的目录路径;
比如:
要编译Z:
盘下的sdk-xgs-robo-5.8.0,那么该变量的值就是:
Z:
\sdk-xgs-robo-5.8.0
ØPERL_BASE:
(必须定义)
定义方式:
由外部环境变量传入;
说明:
●该变量在SDK编译过程中决定了Make.tools文件中对PERL编译工具变量的定义,该变量指向主机系统中PERL工具的bin目录,比如:
C:
\Perl\bin,但定义时,需注意分隔符方向。
值:
PERLBASE=c:
/Perl/bin
ØSDK_NO_DRIVE_NAME:
定义方式:
由外部环境变量传入;
说明:
●该变量决定了在SDK编译过程中生成的二进制文件存放路径的前一部分,具体存放路径由BLDROOT变量决定,该变量的定义为:
BLDROOT=${SDK_NO_DRIVE_NAME}/build/${target}${all_suffix}${bldroot_suffix}
值:
SDK_NO_DRIVE_NAME=Z:
/lib/bcm-sdk/sdk_lib
ØQUIET:
定义方式:
由外部环境变量传入;
说明:
●该变量可以控制SDK在编译时不再打印一大堆编译信息,让整个编译过程看起来更简洁;
值:
ØLIBDIR:
定义方式:
在SDK内部定义,与BLDROOT值一样
说明:
●该变量定义了生成的*.lib和*.a文件的存放路径,该值正常与BLDROOT值一致。
值:
LIBDIR=${BLDROOT}
ØCPU:
定义方式:
定义了SDK编译时的CPU类型
说明:
●该值影响了编译选项MFLAGS的值定义,MFLAGS=$(OPTFLAGS)-DCPU=$(CPU)
值:
CPU=PPC603
Øoverride-target:
(必须定义)
定义方式:
该变量是在:
$SDK\systems\vxworks\product-xxx\Makefile文件中定义的,其中“product-xxx”是产品对应的目录,比如在本文档中就是rc551es
说明:
●该变量决定了SDK编译过程中另一个重要变量“target”的定义值;
●target变量决定了产品对应Makefile文件的正确导入(位置为:
Make.config文件中的include${SDK}/make/Makefile.${target});
●另外,target变量还决定了二进制文件存放目标路径的一部分(如:
BLDROOT=${SDK_NO_DRIVE_NAME}/build/${target}${all_suffix}${bldroot_suffix});
值:
override-target=vxworks-rc551es
ØOPTFLAGS_DEFAULT(非必须,但强烈推荐):
定义方式:
在Makefile.vxworks-product文件中定义,该定义决定了编译时的优化选项
说明:
●SDK的默认优化方式是-O2,但如果使用了默认的优化选项,会出现无法调试驱动的问题,表现为可以对驱动函数进行调试,但由于符号表对不上,所以单步执行的时候每一步与实际代码行根本对不上,调试人员无法知道当前代码实际运行情况,所以强烈推荐将该宏修改为-O0优化选项,这样就不会出现无法调试驱动的问题了;
值:
OPTFLAGS_DEFAULT=-O0
ØVX_SRC/VX_SRC_ALL:
定义方式:
这个宏定义了BSP目录的位置
说明:
●在SDK中,有一些非常靠底层的文件(如:
pci.h等文件),会包含BSP相关的头文件(其实只需要两个BSP相关头文件,就是config.h和configAll.h),所以在编译SDK的时候,就需要知道BSP的目录路径,VX_SRC宏值定义的就是BSP目录路径,VX_SRC_ALL宏值定义的就是BSP相关config/all目录的路径;
值:
VX_SRC=Z:
/rc551es_dev/bsp/mpc8315
VX_SRC_ALL=E:
/WindRiver/vxworks-6.7/target/config/all
ØSOC_CM_MEMORY_BASE/SOC_CM_MEMORY_OFFSET:
定义方式:
这两个宏定义的值决定了PCI寄存器的基地址和偏移,这两个宏可以不定义,这样SDK会默认使用BDE注册的基地址
说明:
●在BCMSDK的代码中,有两个地方可以将PCI基地址注册给驱动代码(PCI的偏移只能通过这个宏定义传给SDK代码,但对于单芯片这个偏移没有什么作用,所以关系不大),一个途径是通过BDE注册,另一个途径就是用这里的宏定义;
●通过BDE注册PCI基地址是必须的,因为在SDK初始化的早期,需要用到BDE注册进去的基地址访问芯片寄存器,而SOC_CM_MEMORY_BASE/SOC_CM_MEMORY_OFFSET两个宏定义更多的是在CM层才使用到,所以在SDK代码中,即使不定义这两个宏,代码仍然可以正常工作,而使用的就是BDE注册的基地址;
值:
-DSOC_CM_MEMORY_BASE=0xa4000000
-DSOC_CM_MEMORY_OFFSET=0x10000000
ØSAL_THREAD_NAME_PRINT_DISABLE(非必须,但强烈推荐):
定义方式:
该宏是通过CFGFLAGS加入到编译选项中的,默认情况下,CFGFLAGS不会加入该宏定义,但用户可在$SDK\make\Make.local文件中对其进行定制
说明:
●该宏决定了在使用BCMDiagShell的时候,是否要打印Shell线程的名称,建议不要打印,否则会让Shell输出的信息变得很乱
值:
CFGFLAGS+=-DSAL_THREAD_NAME_PRINT_DISABLE
2BCMSDK编译工具
编译SDK最好使用Windriver的HostShell工具,因为相比Windows的Cmd,该工具本身包含一些WIND相关的变量配置,省去了需要对它们进行一一设置的工作量,用起来比较方便,调出Windriver自带Shell工具的方法如下:
该HostShell工具中已经包含了一些重要的编译环境变量,执行set操作可看到这些变量设置情况如下:
在编译SDK的时候需注意,有些目录变量的路径默认使用的是:
“\”分隔符,在编译时会由于无法识别导致出错,需要人为把“\”改为“/”才可正确编译,比如WIND_BASE变量的默认路径使用的就是“\”分隔符,需要人为修改一下分隔符方向才能正确地进行编译。
3SDK驱动编译实例
(注:
以下各小节描述了以sdk-xgs-robo-5.9.0为例进行编译的操作过程,其他版本的BCMSDK驱动编译与此类似,但在细节处会有略微的不同,需要读者根据具体问题具体分析)
3.1在$SDK\systems\vxworks目录下建立产品相关目录和文件
如上面内容所述,BCMSDK的编译是从$SDK\systems\vxworks\product-xxx目录下的Makefile文件开始的,所以对于新拿到的SDK,修改的第一步就是在$SDK\systems\vxworks目录下添加产品相关的内容,这些内容主要由三个文件组成,分别是:
hal.c、Makefile、socdiag.c,如下图所示:
对于已经开发过的产品,如果仅仅是想升级BCMSDK的版本,那么这个目录的最好创建方式就是直接黏贴原SDK中对应的目录,不需要对文件做任何修改,简单省事。
对于新开发的产品,该目录的创建方式是在一个与新产品相像的已有产品基础上进行相应修改。
===============================================
(注:
为了让读者对新产品中该目录的修改方式有一个感性的认识,下面以RC551ES为例进行描述和说明,这三个文件的修改原型来自bmw目录中对应的文件,该目录是随便选取的,意在为大家提供修改参考)
3.1.1Makefile文件的修改
●修改VX_VERSIONS变量,加入当前vxWorks版本:
#VX_VERSIONS:
=5562
VX_VERSIONS:
=556267
●修改LOCALDIR变量为当前产品对应的目录如下:
#LOCALDIR=systems/vxworks/bmw
LOCALDIR=systems/vxworks/rc551es
●修改override-target变量为当前产品
#override-target=vxworks-bmw
override-target=vxworks-rc551es
●注释掉SRC_DIR变量的定义
#SRC_DIR=${SDK}/systems/vxworks/bmw/mpc824x
●修改${VX_BINARY}vxWorks.stvxWorks.st.ppc的生成规则(因为不需要在这里编译出vxWorks.st文件,这里只要编译出SDK的库文件*.a就可以了),具体修改如下:
${VX_BINARY}vxWorks.stvxWorks.st.ppc:
\
bdebcm_librariesdriver_libraries\
${BLDDIR}/.tree${BLDDIR}/socdiag.o${BLDDIR}/version.o\
${BLDDIR}/platform_defines.o${BLDDIR}/hal.o${BLDDIR}/ftpXfer2.o
#$(MAKE)-C${SRC_DIR}WIND_BASE="${WIND_BASE}"\
#MAKEFLAGS="${MAKEFLAGS}"${KERNFLAGS}${VX_TARGET}
#${CP}${SRC_DIR}/${VX_TARGET}${VX_BINARY}.sym
#${CP}${SRC_DIR}/${VX_TARGET}${VX_BINARY}
#ifneq($(OS),Windows_Cygnus)
##stripppc.exeisbroken
#${STRIP}${VX_BINARY}
#${STRIPFIX}${SRC_DIR}/${VX_TARGET}${VX_BINARY}565
#endif
#${MKBEEP}
3.1.2socdiag.c文件的修改
该文件中其实只要修改bde_create()一个函数就可以了,其他函数基本不会使用,所以只要能编译过就OK。
修改bde_create()函数主要有以下几个地方要注意:
●修改PCI设备基地址为产品对应基地址
bus.base_addr_start=0xa4000000;
●修改中断引脚配置(详见INTERRUPT,MAXLATENCY,MINGRANT寄存器的INTERRUPT_LINE说明)
bus.int_line=1;
●修改交换芯片的大小端设置(详见CMIC_ENDIANESS_SEL寄存器说明)
bus.be_pio=1;
bus.be_packet=0;
bus.be_other=1;
3.1.3hal.c文件的修改
该文件中主要是一些与平台相关的函数注册,包括flash、watchdog等一些东西,这里除了name和caps两个成员之外,其他基本都不需要,所以都注册成0和NULL就可以。
name和caps两个成员的修改:
●name随便取一个可标识产品的名称即可,用处不大;
●caps标识的是与平台相关的能力,会影响到SDK驱动内部一些与平台相关的处理方法,这里给出的能力有如下几种:
/*PlatformCapablities*/
#definePLATFORM_CAP_MULTICORE0x000001
#definePLATFORM_CAP_ENDIAN_FUNNY0x000002
#definePLATFORM_CAP_DMA_MEM_UNCACHABLE0x000004
#definePLATFORM_CAP_FLASH_FS0x000100
#definePLATFORM_CAP_WATCHDOG0x000200
#definePLATFORM_CAP_PCI0x010000
这里对代码作用比较大的只有PLATFORM_CAP_DMA_MEM_UNCACHABLE选项,它影响了DMA内存开启时是否进行cache,所以只要注意这个选项就可以了,最终修改后的样子如下:
staticplatform_hal_trc551es_hal_info={
"RC551ES",/*name*/
0,/*flags*/
(PLATFORM_CAP_DMA_MEM_UNCACHABLE),/*caps*/
0,/*bus_caps*/
NULL,/*f_dump_info*/
NULL,/*f_upgrade_image*/
NULL,/*f_flash_device_name*/
NULL,/*f_format_fs*/
NULL,/*f_fs_sync*/
NULL,/*f_fs_check*/
NULL,/*f_tod_set*/
NULL,/*f_tod_get*/
NULL,/*f_start_wdog*/
NULL,/*f_reboot*/
NULL,/*f_led_write_string*/
NULL/*f_timestamp_get*/
};
3.2修改$SDK\make目录下的Makefile文件
3.2.1创建并修改Makefile.vxworks-xxx文件
●修改VX_VERSION变量定义
这里定义了VX_VERSION的默认值,该值会影响SDK编译时其他一些非常重要变量的定义,这里修改为“67”后,Makefile会认不出来此版本号,这种情况下Makefile会使用默认的编译规则,此时只要保证默认的编译规则正确即可。
(注:
即使使用的vxWorks版本号在Makefile中可识别,也要逐一确认指定的编译规则是否正确,因为有些指定的规则是有问题的,所以,为了避免对Makefile中每一个版本号对应规则的确认,最方便的途径就是在这里将vxWorks版本号定义为一个Makefile不可识别的版本,然后只要保证默认规则正确就可以了)
#VX_VERSION=55
VX_VERSION=67
●修改CFGFLAGS编译选项中SOC_CM_MEMORY_BASE和SOC_CM_MEMORY_OFFSET两个变量的设置,为了方便,我们直接将这里的定义注释掉,使用BDE注册进去的基地址,如下:
#CFGFLAGS+=-DSOC_CM_MEMORY_BASE=bcm_bde_soc_cm_memory_base\
#-DEXTERN_SOC_CM_MEMORY_BASE=bcm_bde_soc_cm_memory_base\
#-DSOC_CM_MEMORY_OFFSET=0x00010000
●修改OPTFLAGS_DEFAULT默认优化选项
SDK的默认优化选项是-O2,这样虽然可以正常编译,但生产系统核文件后却无法对SDK的代码进行调试(符号表对不上),所以这里将优化选项改为-O0,另外,改为-O0之后还会大大加快SDK的编译速度,具体修改如下:
#OPTFLAGS_DEFAULT=-O2
OPTFLAGS_DEFAULT=-O0
●修改TARGETTYPE定义
修改如下:
#TARGETTYPE=BMW
TARGETTYPE=rc551es
●修改默认终极目标all
BCMSDKMakefile编译的默认终极就是all,所以一定要确保all目标的正确,才能保证编译的正确,这里5.9.0默认的编译目标all有些问题,改为如下定义:
#all:
$(DEST_DIR)/${VX_BINARY}$(if$(NO_LOCAL_TARGETS),,$(VX_BINARY))
all:
${VX_BINARY}
●修改toolbase,以及NM、SIZE、STRIP的定义
toolbase决定了cc.exe等SDK编译工具的存在路径,如果toolbase设置错误会导致编译时出现工具无法找到的错误提示(如下:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BCM SDK 移植与编译学习笔记 移植 编译 学习 笔记