Qualcomm平台编译之我见jinjing.zhao@ 一、平台简介高通平台的应用层的开发是在brew上进行的,brew提供了很多接口供应用层调用相关的api。
高通平台的思想是用c语言实现面向对象的功能,具体通过结构体以及虚表来实现。
在oem层中实现具体的api函数,用来填虚表。
通过oem层以及service代码的修改,来实现上层应用具体需要的功能。
为了开发界面的方便,高通又在brew的基础上推出了buit,包括widget(控件),form (窗体),decorator(修饰),container(容器)以及model(模型)。
bar文件:资源文件,用高通自带的工具生成,程序运行的时候从此文件中读取字符串以及图片。
可以将此文件放到文件系统中,也可以将此文件编译成.c文件,然后再编译成.o 文件,放到代码段里面去。
Mif文件:module imformation file,存放模块的相关信息。
可以将此文件放到文件系统中,也可以将此文件编译成.c文件,然后再编译成.o文件,放到代码段里面去。
二、编译解析平台的编译命令放在了\build\ms目录下。
可以有两种编译方法:一种是使用cmd命令,还有是在cygwin下使用bash脚本。
但道理都是一样的,就是执行一个makefile文件dmss6250.mak。
顺序如下:1)运行cmd,cd到\build\ms目录下,键入ads12;ads12是个批处理命令,功能是为ads1.2,perl,以及gnu设置编译环境变量。
2)执行****.cmd命令。
1、dmss6250.mak整个编译过程就是在执行这个makefile。
在这个makefile的开头处,我们可以看到include dmss_flags.mininclude dmss_$(ASIC)_flags.mininclude incpaths.mininclude armtools.mininclude dmss_objects.min包含的这些文件初始化了一些编译选项,编译路径,编译工具,以及包含要编译模块的min文件。
在添加模块的时候需要修改:incpaths.min:添加<模块的路径变量>= $(SRCROOT)/apps/<module name>在ALL_PATHS中添加<模块的路径变量>。
ALL_PATHS是编译时的查找路径,这是高通的默认做法,在编译的时候,每编译一个文件都会到ALL_PATHS的所有目录下去寻找,因此严重降低了编译的速度。
为了提高编译速度,可以考虑书写一个脚本,在编译的时候将所有的头文件考到一个文件夹下面,指定arm编译的时候到这个文件夹下面搜寻头文件。
dmss_objects.min:添加include <模块的路径变量>/<模块的min文件>每个模块都至少有一个min文件,如alarm:#-------------------------------------------------------------------------------# Alarm#-------------------------------------------------------------------------------ALARM_SOURCES=alarm.c \Alarm_EditForm.c \Alarm_EditPeriodForm.c \Alarm_EditWeeklyForm.c \Alarm_ListForm.c \Alarm_ViewForm.c \Alarm_SetTimeForm.c\Alarm_StatusForm.cALARM_OBJS := $(addprefix $(TARGETDIR)/, $(ALARM_SOURCES:%.c=%.o))$(ALARM_OBJS): APPFLAGS = -DBREW_STA TIC_APP -DAEE_STATICALARM_DEPS := $(addprefix $(TARGETDIR)/, $(ALARM_SOURCES:%.c=%.dep)) $(ALARM_OBJS): APPFLAGS = -DBREW_STA TIC_APP -DAEE_STATICvpath %.c $(ALARM)dmss6250.mak:如Alarm在OBJECTS2中添加ALARM_OBJS。
在dmss6250.mak 文件的最后一行我们可以看到include dmss_rules.min,在这个文件中出现了makefile的目标,依赖和命令。
2、dmss_rules.min目标:all : dmss(在dmss6250.mak中)dmss : setup prereqs firmware vrfiles deps libs copybar exe hex由此可知,此makefile依次执行setup prereqs firmware vrfiles deps libs copybar exe hex,这些东西在编译过程中都可以看到。
主要说明以下几点:deps:此目标用于生成所有的依赖规则,最终都放在****.dep中,然后通过-include $(TARGETDIR)/$(TARGETDIR).dep使用依赖规则。
exe : $(TARGET).$(EXETYPE) $(LINK_TYPE)此目标实现了编译和连接,直到生成elf文件。
Hex:此目标将elf转化成可供QPST(高通提供的下载工具)下载的hex文件。
3、image文件的生成整个工程通过编译,连接以后最终生成映像文件。
整个映像文件的布局通过scl文件完成,关于如何生成可以查看arm相关书籍。
高通提供了m6250_ram.scl ,M6250_rom.scl,具体使用哪个根据编译开关选定,我们可以根据需求进行修改。
在这里说这个,主要使考虑代码段越界的问题,当加了一个比较大的模块时候,生成的代码段就会加大,所以我们要调整代码段的大小。
如何调整?因为我们编译时候的编译选项生成了map文件,这里面可以看到整个image 文件的大小以及其他信息。
具体调整的变量在flash-nand-msm.h中#define FLASH_NAND_BLK_START 0x800nand flash每块分为32个页,每页512个字节,0x800也就是32m空间大小。
三、考虑平台多项目问题高通的6250平台下有很多编译命令,如DVMSX.cmd,DVMSZ.cmd等,不同的编译命令在编译过程中会选择不同的编译开关文件。
如DVMSZ.cmd选则文件custdvmsz.h,其中又包含了targdro.h。
还有DVMSZ.cmd中也包含也很多编译选项。
@echo offdel /f /a buildDVMSZ.log.oldif exist buildDVMSZ.log move buildDVMSZ.log buildDVMSZ.log.old > nulmake -r -f dmss6250.mak USES_ZRF6300=yes USES_BREW_3.1=yes USES_MP4=yes USES_WM=yes USES_IBT=yes USES_GLES_CL=yes USES_QVP=yes USES_GWZRF6250P3=yes USES_AUDFMT_AMR=yes USES_QVPCODEC=yes USES_MMC=yes USES_RAPTOR_UMTS_DDA=yes USES_GRP=yes USES_EGL=yes USES_STATIC_RAPTOR=yes USES_TOUCAN2_QVGA=yes USES_MSUITE=yes USES_ISYSCLOCK=yes USES_AUTH=yes USES_H264=yes USES_SPLIT_CODE_DA TA=yes USES_IDIAG=yes USES_SNDCTL=yes USES_AUDIOEQ=yes USES_IMODE=yes USES_RAPTOR_UMTS_VPA=yes USES_EFS2=yes USES_STRIP_NO_ODM=yes USES_PBMTASK=yes USES_CMX=yes USES_GSTK=yes USES_BT=yes USES_MGP=yes USES_BOOT_LOADER=yes ASIC=M6250 BUILD=DVMSZ VERSION=.... 2>&1 | ..\..\tools\build\qtee buildDVMSZ.log根据编译开关选择不同的代码以及文件进行编译。
具体我们可以根据以后的实际情况通过拉分支的方式解决平台多项目问题,北京那边是这样做的。
此方面由于没有相关经验,需要在以后工作中加以实践。
四、其他相关知识下载工具:QPST:高通提供,下载hex文件,在pc端装好驱动以后,用数据线将手机与pc usb相连,通过串口下载。
在手机不能开机的情况下,找不到串口,所以不能下载。
Trace32:下载elf文件,速度比较慢。
调试工具:QXDM:高通提供,在源码中添加调试信息,然后编译,在QXDM显示窗口中查看调试信息。
Trace32:jtag调试,可以跟踪源码,发现为什么死机等等,但是价格比较贵。
添加模块时除了要修改makefile相关的几个文件以外:还需要修改以下几个地方:如通话记录1、coreapp.min# Owner: recentcallsvpath %.mif $(BREW_STA TIC_MIFS)vpath %.bar $(RECENTCALLS)/resources/en/256colorvpath %.bar $(RECENTCALLS)/resources/ja/256colorvpath %.bar $(RECENTCALLS)/resources/jw/256colorCONSTFILE_FILES+=\recentcalls.mif|fs:/mif/recentcalls.mif \recentcallsen.bar|fs:/mod/recentcalls/recentcalls.bar \recentcallsja.bar|fs:/mod/recentcalls/ja/recentcalls.bar \recentcallsjw.bar|fs:/mod/recentcalls/jw/recentcalls.bar2、oemmodtableext.h#if defined(FEATURE_APP_RECENTCALLS)//程序的入口函数extern int RecentCalls_Load(IShell *ps, void * pHelpers, IModule ** pMod); #endif#if defined (FEATURE_APP_RECENTCALLS){AEEFS_MIF_DIR"recentcalls.mif", RecentCalls_Load},#endif3、oemconstfiles.h#if defined (FEATURE_APP_RECENTCALLS)&gRECENTCALLS_MIF,#endif4、oemappfuncs.c#ifdef FEATURE_APP_RECENTCALLS#include "recentcalls.bid"#endifbid文件,每个applet的都又一个class id,用来启动,关闭等操作。