互芯平台GSM软件简明教程 - 图文

更新时间:2024-01-17 13:16:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

互芯平台GSM软件简明教程

一、 综合

1、 如何建立软件开发环境?

1.1、从ftp的/Tools/ CSDTK3.5_Cygwin1.5.25_Svn_1.5.4_Full_Setup.rar下载CSDTK,目前版本的CSDTK只支持windows xp和windows 2000平台。CSDTK集成了cygwin环境和一个强大的开发调试工具cooltools,以及一套交叉编译工具链。在安装之前,请检查电脑是否已经安装过cygwin,若是请先将以前安装过的cygwin卸载掉。之后双击CSDTK3.0_Cygwin1.5_Svn_1.5_Full_Setup.exe进行安装,如下图: 注:建议使用专门的ftp软件来下载,例如FileZilla、cuteftp等等。

注:第一次建立编译环境,请严格按照文档来配置(包括路径名称,目录结构,大小写等),有很多客户自己乱改名字导致各种问题。对环境熟悉了之后再按照自己的需要定制。

选择“Next”,进入下图:

这里选择的是CSDTK的安装路径,建议用默认的C:\\CSDTK,选择“Next”,进入下图:

选择“Next”,进入下图:

选择“Install”,进行安装。这里安装的是cooltools和交叉编译器,安装完成后会出现如下界面:

选择“下一步”,进入下图:

选择“下一步”,进入下图:

这里选择的是cygwin的安装路径,建议使用默认的C:\\CSDTK\\cygwin。在“Install For”标签里建议选择“All Users”,在“Default Text File Type”标签里必须选择“Unix / binary”。 选择“下一步”,进入下图:

这里要选择cygiwn的本地安装包的路径,我们在之前的安装过程中已经将其保存在

C:\\CSDTK\\cygwin,所以直接选择“下一步”即可,进入下图:

这一步是要选择安装的包,直接选择“下一步”,然后选择“安装”。cgywin安装完成后,出现CSDTK的安装完成界面,如下图,说明整个CSDTK已经安装完成。然后下载ftp的/Software Package/Gallite1129_BV_V1_0_3_20110713_1050/ cooltools_release_1107141450.rar,解压缩后替换C:\\CSDTK\\cooltools目录。

1.2、从ftp的/Software Package/Gallite1129_BV_V1_0_3_20110713_1050/soft.rar下载源代码,解压源代码,建议放到某个盘(例如d:)的如下目录d:/projects/gallite,目录结构如下图所示,注意有个soft目录。然后从ftp的/Software Package下获取所有的补丁包(以patch_BV1_0_3_xxx形式命名),打上这些补丁。

1.3、设置一个HOME的环境变量,如图:

双击桌面上的cygwin图标运行cygwin,在C:\\CSDTK\\cygwin\\home\\下会创建一个以当前用户名命名的目录(例如为yourname)。将D:\\projects\\gallite\\soft\\env\\win32\\.bashrc和D:\\projects\\gallite\\soft\\env\\win32\\cygenv.sh这两个文件拷贝到该目录下,并用UltraEdit编辑C:\\CSDTK\\cygwin\\home\\yourname\\.bashrc文件(打开时若UltraEdit提示要转换成DOS格式,请选择“否”),将116行: export PROJ_ROOT=/cygdrive/c/projects 替换成:

export PROJ_ROOT=/cygdrive/d/projects 将122行

export PATH=/usr/bin:/crosscompiler/bin:/cooltools/:

替换成 export

PATH=/usr/bin:/crosscompiler/bin:/cygdrive/c/CSDTK/cooltools/:/cygdrive/c/Program\\ Files/Xoreax/IncrediBuild:

保存并关闭C:\\CSDTK\\cygwin\\home\\yourname\\.bashrc,在cygwin窗口依次输入如下命令: $ source ~/.bashrc $ work gallite

若此时显示“Soft base SOFT_WORKDIR=/cygdrive/d/projects/gallite/soft,Project Switched to gallite”且当前路径切换到/cygdrive/d/projects/gallite/soft,如下图所示,则说明安装成功。以后每次打开新的cygwin窗口进行编译之前,都要先运行这两个命令。

注:建议将cygwin窗口的缓冲区高度增大一些,如图:

2、 如何编译代码?

2.1、正式发布的代码只有一个默认的资源包,位于\\soft\\application\\mmi_customer,由于长时间没有维护了,强烈不建议使用。一般来说每个项目都有自己的资源包,所以要创建一个\\soft\\application\\target_res目录,将该项目的资源包放到该目录下,例如我的代码里有如下的资源包:

如果需要特定的资源包,请联系FAE,因为资源包是不在ftp上发布的。然后运行如下命令: $ ctmake -j 8 CT_RELEASE=debug CT_TARGET=gallite_ms11_ap_qqvga_p0 CT_USER=FAE WITHOUT_WERROR=1 CT_OPT=dbg_size CT_RESGEN=yes CT_PRODUCT=110829_MS11_DEV

最后在\\soft\\hex\\gallite_ms11_ap_qqvga_p0_110829_MS11_DEV_debug下会生成如下文件:

说明编译成功。

2.2、编译命令的说明

ctmake:make的封装脚本,主要处理模块化编译、多进程编译和分布式编译,之后会调用系统的make; -j 8:ctmka默认设置为4进程,如果你的电脑速度较快,可以用“-j 8”设置成8个进程。 CT_RELEASE=debug/release:debug和release模式有几个区别,当出现软件原因的异常或者部分硬件原因的跑飞/死机和异常时,debug版本的软件会死循环等待调试工具的命令,直观看到的现象就是冻屏;而release版本的软件则会重启。另外debug版本的软件比releae的多占用一些(大概几十K)ROM和RAM空间。一般来说,开发调试的时候用debug模式,量产软件发布用release模式。

CT_TARGET=xxx:设置target。target是互芯平台特有的概念,里面包括某个项目的绝大部分硬件的配置信息和部分的软件配置信息。target位于\\soft\\target\\下,编译的时候必须用CT_TARGET=指定一个target。

CT_USER=ADMIN/FAE:由于发布给客户的代码中stack是库的形式,所以要用CT_USER=FAE;

如果有全部的源代码,则可以用CT_USER=ADMIN。一般客户都用CT_USER=FAE。 WITHOUT_WERROR=1/x:这个变量指定了对于编译时产生的警告错误的处理方式,值为1则显示警告信息编译继续进行,其它值则警告做错误处理,编译停止。

CT_OPT=dbg/dbg_opt/dbg_size/size/speed:这个变量指定了编译时的优化方式。dbg不开任何优化,只生成调试信息;dbg_opt使用-O2级优化,它会打开不涉及代码尺寸和运行速度权衡的所有优化,同时dbg_opt还会打开-falign-functions=16 -falign-jumps=16来优化运行速度,也会生成调试信息;dbg_size使用-Os级优化,它会优化代码尺寸,类似于-O2,但是将禁止任何为对齐而插入的空间,同时生成调试信息;size类似于dbg_size,只是不生成调试信息;speed类似于dbg_opt,只是不生成调试信息。另外,所有的优化都默认打开了-frename-registers选项。低端平台由于成本因素考虑,对空间的关注大于对速度的关注,所以一般都会在命令行上显式的指定CT_OPT=dbg_size。如果没有显式的指定,则在release时会使用speed,debug时会使用dbg_opt,最后往往会在link的时候由于ROM空间不够而报错。

CT_RESGEN=yes/no:这个变量指定是否编译资源。 CT_PRODUCT=xxx:这个变量影响了两个地方,一个是最后编译生成的路径和文件名字会包含CT_PRODUC指定的信息,一个是在手机运行时输入掩码(例如*#36*#)后查看版本信息的时候,会显示CT_PRODUC指定的信息。建议量产软件发布的时候都带PRODUCT信息,便于跟踪软件版本。

2.3、其它编译选项的说明

CT_USERGEN=yes/no:是否生成文件系统。选择yes后将会生成一个空的文件系统,并集成到最后生成的lod文件中,这样可以加快第一次开机时的开机速度(不必重建文件系统了),同时还会避免一些由于重建文件系统时引入的错误,缺点是如果文件系统过大,会导致下载时间稍长。建议采用CT_USERGEN=yes。

WITH_SVN=0/x:是否使用SVN自动生成版本信息。如果你的电脑上没有安装SVN,或者安装了较高版本的SVN,请指定WITH_SVN=0,否则会产生编译错误。推荐使用1.5.4版本的SVN。如果需要安装SVN server,请参考evn目录下的“SVN安装配置”。

ibuild:分布式编译,请参考env目录下的《互芯平台上使用IncrediBuild进行分布式编译.doc》。注意,建议使用IncrediBuild 3.51或更高版本,因为老版本对cygwin的支持不大好。

dump:反汇编。 :可以在编译命令行的任何地方指定,这样编译时会模块化编译,也就是只编译指定的模块,然后link。这样可以大大的加快编译的速度。一个例子:

$ ctmake -j 8 CT_RELEASE=debug CT_TARGET=gallite_ms11_ap_qqvga_p0 CT_USER=FAE WITHOUT_WERROR=1 CT_OPT=dbg_size CT_RESGEN=yes CT_PRODUCT=110829_MS11_DEV application/coolmmi/mmi/GUI application/coolmmi/mmi/Alarm

注意,模块化编译需要你的make版本为3.81或以上(CSDTK默认安装的是3.81),如果手动的修改为其它低版本会导致模块化编译失效。另外在模块化编译之前要进行过完全编译。

3、 下载、抓trace、调试

3.1、首先要安装usb转串口芯片CP2102的驱动,该驱动位于misc目录下的CP210x_VCP_Win2K_XP_S2K3(V5.30).zip。然后插入下载线,在设备管理器里面确保可以看到该设备,如下图(可能你看到的串口号和图示的不同)。如果找不到串口设备,请更换电

脑的USB口和下载线,或者检查驱动是否正确安装。

C:\\CSDTK\\cooltools\\coolwatcher.exe,显示如下界面:

3.2、运行

第一次运行coolwatcher时,需要在Profiles标签里选择Gallite,在lastcomport输入正确的串口号。以后运行coolwatcher时,会使用上次设置的信息。点击Ok,进入如下界面(你的界面可能和下图略有不同,因为我把不常用的一些标签给关掉了)。如果左边的Ruby Script栏下方显示“[COM OPEN OK]”,说明串口已经被成功打开了,否则要检查串口号是否正确。

点击工具栏的第6个图标

,选择要被下载的lod文件。点击工具栏的第7个图标

,选

择该项目用的flash的ramrun。常用的ramrun位于\\soft\\toolpool\\plugins\\fastpf\\flash_programmers下,你也可以自己编译ramrun。然后将手机开机。如果手机的flash是第一次下载,则左边Ruby Script栏会输出0xffffffff;

如果手机里面已经有正常运行的软件,则Ruby Script栏会输出0xffffffff和0x57,可以依次来判断手机和coolwatcher之间的通讯是否正常。点击工具栏的第8个图标,就开始下载,右下角会显示下载的进度条。

3.3、抓trace首先要确保编译出含有trace输出的软件。当前由于ROM空间的限制,默认trace输出都是关闭的。打开trace需要编辑相应项目的target.def文件,如下几行: ## 31 ## # trace 设置

GLOBAL_EXPORT_FLAG += MMI_NO_TRACE GLOBAL_EXPORT_FLAG += EDRV_NO_TRACE GLOBAL_EXPORT_FLAG += HAL_NO_PRINTF GLOBAL_EXPORT_FLAG += PAL_NO_TRACE GLOBAL_EXPORT_FLAG += SXS_NO_PRINTF GLOBAL_EXPORT_FLAG += APS_NO_PRINTF GLOBAL_EXPORT_FLAG += ARS_NO_PRINTF GLOBAL_EXPORT_FLAG += SXS_NO_DUMP GLOBAL_EXPORT_FLAG += MCI_NO_TRACE GLOBAL_EXPORT_FLAG += CSW_NO_TRACE GLOBAL_EXPORT_FLAG += CALIB_NO_PRINTF GLOBAL_EXPORT_FLAG += UMSS_NO_PRINTF GLOBAL_EXPORT_FLAG += UCTLS_NO_PRINTF GLOBAL_EXPORT_FLAG += VOIS_NO_PRINTF GLOBAL_EXPORT_FLAG += STACK_NO_PRINTF GLOBAL_EXPORT_FLAG += RFD_NO_TRACE 例如如果要打开MMI的trace,则修改为: #GLOBAL_EXPORT_FLAG += MMI_NO_TRACE #GLOBAL_EXPORT_FLAG += SXS_NO_PRINTF

也就是说,打开任何一个或者几个trace,GLOBAL_EXPORT_FLAG += SXS_NO_PRINTF都要被注释掉。然后全部重编(将\\soft\\build\\相应的目录删掉,再编译),这时的软件就是含有trace输出信息的。如果ROM空间不够,可以只保留英文 打开coolwatcher的Plugins菜单,选择Activate Trace Tool,右边会出现新的Trace tool标签,如下图:

选择图标

,可以设置trace level,如下图:

点击Apply,将手机开机,点击,就可以输出trace信息了。

3.4、上面提到的trace输出是非实时的,系统在空闲的时候输出trace,而且输出的数据量比较大的时候可能会输出不完整。另外有一种更简单的调试手段,使用hal_HstSendEvent()函数输出一个32bit的数据,这个输出是实时的,也不会被冲掉,输出的数据显示在Ruby Script栏里。事实上上面提到的开机输出的0x57就是调用这个函数输出的。

3.5、如果程序遇到异常,debug版本的软件会冻屏。这时连上coolwatcher,点击第5个图标,选择C:\\CSDTK\\cooltools\\rbbase\\common\\plugins\\CoolGDB\\profiles\\gallite_xcpu.cgd文件(选择一次即可,以后系统会默认用上次选择的)。然后选择第4个图标,即可进入gdb调试窗口。第一次使用的时候windows防火墙会提示拦截,请放行。常用如下gdb命令,可以用来帮助debug:

bt和bt f,输出出现异常的task异常现场的call stack; print或p,输出全局变量的值,如p gIsOnSearchingScreen;

其它常用gdb命令请查看gdb手册,在gnu目录下的《GDB Quick Reference.pdf》。

4、 开始一个新项目

我们的整个软件由三部分构成:target配置、代码、资源包。一套软件里面,有很多target配置,也有很多资源包,但是只有一套代码。新建一个target,选择一个现有的资源包或新建一个资源包,进行适当的编辑,再和当前的代码一起编译,就会生成一个新的项目的lod。 注意:下面提到的gallite若不特意说明指的是CT1129/30/31(8806),不包括CT1128。 4.1、target配置。一个新的项目,第一步是要配置其target。一般来说,我们可以选择一个现有的和新项目硬件配置比较接近的target作为基础,修改成新项目的target。

我们在\\soft\\target目录下面可以看到很多目录,每个目录是一个项目的target配置。 target配置分成三个文件

target.def : 主要是配置芯片型号和全局参数 tgt_board_cfg.h : 主要是配置gallite芯片接口和外设 tgt_app_cfg.h : 主要是配置文件系统和内存分配 下面我们详细描述一下这几个文件的具体参数的定义 4.1.1、target.def详细描述

输入资料:原理图和产品定义

参与人员:原理图设计者、驱动工程师

开始配置target之前,需要问清楚,项目所使用的 FLASH、LCD(模组和 IC 的 SPEC)、Sensor、RF PA、Audio PA、蓝牙等型号,以及支持的SIM卡数等。

先看一个模板,我们以gallite_r440_3232为例说明,蓝色部分是源文件内容,黑色部分是我对会经常修改的部分的注释。这里只是贴一个例子,后续对于专门问题会专门讨论: #######下面是gallite集成配置,不能随意改动################## CT_ASIC ?= gallite CT_ASIC_CFG ?= chip 3GPP_MODE ?= gsm ROM_TYPE ?= chip

##chip package for different sram size:CT1129/CT1130/CT1131 ##CT1129: 16Mbit sram ##CT1130: 32Mbit sram ##CT1131: 64Mbit sram CT_CHIP_PKG ?= CT1130 ##chip DIE:8805/8806/8808 CT_CHIP_DIE ?= 8806 CT_ROMULATOR ?= no

PM_MODEL ?= rda1203_gallite_CT1129 XCV_MODEL ?= xcv_rda6220_gallite_CT1129 AD_MODEL ?= codec_gallite

#上面是gallite芯片集成的配置。根据内置psram和spi flash大小的不同,gallite目前分为CT1129,CT1130和CT1131。根据贴的具体的芯片型号和批次,这里要给CT_CHIP_PKG和CT_CHIP_DIE赋正确的值。其它部分不必修改。注:CT_CHIP_PKG和CT_CHIP_DIE在bv3及以前的版本中不必定义。

######触屏驱动 gallite集成,需要则配rda1203_gallite,否则为空####### TSD_MODEL ?=

######FM驱动 gallite集成,需要则配rda5802e_gallite,特别注意的是若是使用ATV RDA5888S或RDA5888E中集成的FM时,需要配成rda5888e####### FM_MODEL ?= rda5802e_gallite

#有的带atv的项目客户对内置fm的效果不满意,要求使用外置fm,这里就需要修改成rda5888e

#######上面是gallite集成配置,不能随意改动###################

##注意1:除非特别说明,module的名字必须和edrv目录下面的目录名保持一致, ##否则编译的时候找不到对应的目标。如果edrv下面没有相关的目录,

##说明暂时没有这个设备的驱动,需要驱动工程师自己去开发一个新的驱动, ##驱动程序可以根据设备的SPEC参考已有的驱动进行修改。

## 1 ##

#######RF PA型号 驱动程序在edrv/rfd目录###################

## pa_rda6212 ## pa_rda6216 ## pasw_rda6218 ## pasw_rda6231

## pasw表示集成PA和Switch ## 推荐使用pasw_rda6231

PA_MODEL ?= pasw_rda6231

#对于4频的项目,一般会贴6232,但是软件驱动是通用的,这里也配成pasw_rda6231就行了。

##Switch型号

SW_MODEL ?=

#################################################################

## 2 ##

#######选择FLASH型号,驱动程序edrv/memd################### ##ADMUX MCP

##1 Numonyx M36L0R7050U3ZS 128+32 ## Numonyx M36L0R7050L3ZS 128+32 ## Numonyx M36L0R7050T4 128+32 ## Numonyx M36L0R7050T3 128+32 ## Numonyx M36P0R8060N0ZS 256+64 ## Numonyx M36W0R6050U4ZS 64+32

##2 Spansion S71NS128PB0 128+32 ## Spansion S71NS256NB0 256+32 ## Spansion S71NS256PC0 256+64 ## Spansion S71WS256NC0 256+32 ## Spansion S71WS256PD0 256+32

##3 TOSHIBA TY5701111183KC 128+32 ## TOSHIBA TY671111184KC 128+64

##Normal MCP

##1 Samsung K5L6331CAA_D270 64+32 ## Samsung K5L2731CAA_D770 128+32 ## Samsung K5J6332CTM-D770 64+32 ## Samsung K5L3316CAM 32+16

##2 TOSHIBA TV00560002EDGB 64+32 ## TOSHIBA TV00570002ARGQ 128+32

##3 EON EN71PL0640B0 64+32

## EON EN71GL064B0 64+32 ## EON EN71PL032A0 32+16 ## EON EN71GL032A0 32+16

##4 Spansion S71PL064JB0 64+32 ## Spansion S71PL064JA0 64+16 ## Spansion S71PL127NB0 128+32 ## Spansion S71PL256NC0 256+64 ##5 ESMT FM91L03216UA 32+16 ##6 Silicon7 SVME3216UTA 32+16

##7 Numonyx M36W0T60x0xTB3 64+16/32

##flash model interface:parallel/spi FLSH_IF ?= spi

FLSH_MODEL ?= flsh_gd25q32

#spi flash的驱动是通用的,这里可以根据容量来统一使用通用驱动flsh_spi32m、flsh_spi32x2m、flsh_spi64m和flsh_spi64x2m。在bv3及以前的版本中,还是需要使用特定驱动,比如flsh_gd25q32

SYS_MEMD_EBC_CLK ?= __52MHz__

ifeq \

##SPIFLASH spi CLK cfg:__52MHz__/__78MHz__/__104MHz__/__156MHz__ SYS_MEMD_FLSH_SPI_CLK ?= __78MHz__

GLOBAL_EXPORT_FLAG += __PRJ_WITH_SPIFLSH__ endif # (${FLSH_IF},)

##ram is ADMUX or not

GLOBAL_EXPORT_FLAG += MEMD_RAM_IS_ADMUX ##flash is ADMUX or not

#GLOBAL_EXPORT_FLAG += MEMD_FLASH_IS_ADMUX ## ram support burst mode or not

GLOBAL_EXPORT_FLAG += MEMD_RAM_IS_BURST ##flash support burst mode or not

#GLOBAL_EXPORT_FLAG += MEMD_FLASH_IS_BURST

##ebc clock use 52MHz/78MHz/104MHz

ifeq \GLOBAL_EXPORT_FLAG += RAM_CLK_IS_52M endif

ifeq \GLOBAL_EXPORT_FLAG += RAM_CLK_IS_78M

endif

ifeq \GLOBAL_EXPORT_FLAG += RAM_CLK_IS_104M endif

ifeq \GLOBAL_EXPORT_FLAG += RAM_CLK_IS_156M endif

ifeq \GLOBAL_EXPORT_FLAG += SPI_FLSH_52M endif

ifeq \GLOBAL_EXPORT_FLAG += SPI_FLSH_78M endif

ifeq \GLOBAL_EXPORT_FLAG += SPI_FLSH_104M endif

#################################################################

## 3 ##

##配置底层是否支持WAP/MMS,1为支持,0为不支持####### WAPMMS_SUPPORT ?= 1

ifeq \MMI_USING_SLIM_WAPMMS := YES

ifeq \GLOBAL_EXPORT_FLAG += MMI_USING_SLIM_WAPMMS endif endif

#如果3216的项目是不支持WAPMMS的,这里要定义WAPMMS_SUPPORT ?= 0

#如果是3232的项目,可以支持SLIM WAPMMS,这里要定义WAPMMS_SUPPORT ?= 1,MMI_USING_SLIM_WAPMMS := YES

#如果是3264或者6432的项目,可以支持全功能的WAPMMS,这里要定义WAPMMS_SUPPORT ?= 1

##对于读写速度较慢的flash,需要定义这个宏,

##定义这个宏后,当运行camera/video player/video recorder等应用时不自动下载彩信内容,只下载彩信通知,用户可以之后手动下载彩信内容 #GLOBAL_EXPORT_FLAG += MANUAL_DOWNLOAD_MMS

#################################################################

## 4 ##

#######选择LCD型号,驱动程序edrv/lcdd################### ## 1 QVGA 240*320

## Hx8347 Lgdp4532 St7781 Ssd1297 Spfd5408b

## Hx8367 S6d1121 St7787 Ili9320 ## Otm3225 Ili9325 Ili9328 Ili9340 ## 2 QCIF 176*220

## Hx8340b Kc20 R61503v Otm2201a

## Ili9225 lgb4525b R61503vr Otm2201h ## Ili9225b Ili9225br S6d0164 Dc2200 ## 3 QQVGA 128*160

## Ili9163 S6b33bf St7669v S6d0144 ## St7735 Hx8345a Fd54124bv

LCD_MODEL ?= ili9163c st7735r

##lcd model interface:slcd/gouda/lcdc LCD_IF ?= gouda

TARGET_EXPORT_FLAG += lcd_line_8_low ifeq \

GLOBAL_EXPORT_FLAG += __PRJ_WITH_SPILCD__ endif # (${LCD_IF},)

#我们的lcd驱动支持自适应;lcd接口支持gouda和slcd,根据硬件情况进行配置。支持的lcd模组可以查看\\soft\\platform\\edrv\\lcdd\\

#################################################################

## 5 ##

#######选择CAMERA型号,驱动程序edrv/camdold################### ##1 OmniVision OV7660 VGA ## OmniVision OV7670 VGA ## OmniVision OV7675 VGA ##2 GalaxyCore GC0306 VGA ## GalaxyCore GC0307 VGA ## GalaxyCore GC0309 VGA ##3 BYD BYD3503 VGA ## BYD BYD3603 VGA ## BYD BYD3703 VGA

##4 HYNIX YACBAA0SDDAS VGA ## HYNIX HYA10S VGA ##5 SET SIV100B VGA

##6 Superpix SP80818 VGA

CAMERA_MODEL := gc0309 pas6175

##camera model interface:parallel/spi CAMERA_IF ?= parallel

##支持双camera

#GLOBAL_EXPORT_FLAG += SUPPORT_DUAL_CAMERA ##拍照时候闪光灯功能

#GLOBAL_EXPORT_FLAG += __CAMERA_FEATURE_FLASH__ ##使用camera模拟2d sensor

#GLOBAL_EXPORT_FLAG += CAM_MD_SUPPORT

ifeq \

GLOBAL_EXPORT_FLAG += __PRJ_WITH_SPICAM__ endif # (${CAMERA_IF},)

#我们的cam驱动支持自适应;lcd接口支持parallel和spi,根据硬件情况进行配置。支持的cam模组可以查看\\soft\\platform\\edrv\\camlod\\

#################################################################

## 6 ##

#######选择Blue Tooth型号,驱动程序edrv/btd################### ##RDA5868+ 6x6 ##RDA5872 6x6 ##RDA5870 6x6 ##RDA5875 4x4

##推荐使用RDA5872,RDA5870兼容设计,Gallite平台支持BT免晶体设计

BT_MODEL ?= rda5875

ifneq (${BT_MODEL},)

## 当不支持A2DP的时候需要定义这个宏

#GLOBAL_EXPORT_FLAG += __BT_NO_A2DP_PROFILE__ #GLOBAL_EXPORT_FLAG += __BT_AUDIO_VIA_SCO__ # Define BT crystal flag BT_SHARE_CRYSTAL := 1 endif # (${BT_MODEL},)

#################################################################

## 7 ##

#######选择ATV型号,驱动程序edrv/analogtvd################### ##RDA5888S 8x8 ##RDA5888E 6x6

##推荐使用RDA5888E,Gallite平台支持ATV免晶体设计

ATV_MODEL ?=

ifneq (${ATV_MODEL},) ANALOG_TV_SUPPORT := 1

endif # (${ATV_MODEL},)

#################################################################

## 8 ##

##配置T卡接口为sdmmc,使用PSI接口时候可以配置为spi#### MCD_IF ?= sdmmc

#################################################################

## 9 ##

##umss_storage_flashmc表示支持FLASH和T卡U盘,umss_storage_mc 表示仅支持T卡U盘###

UCTLS_SERVICE ?= umss_storage_flashmc

#################################################################

## 10 ##

##配置I2C类型,当配置了这项为i2c_gpio之后,I2C接口将作为GPIO来使用,用GPIO10和GPIO11来软件模拟I2C接口###

I2C_MODEL ?=

ifeq \

TARGET_EXPORT_FLAG += I2C_BASED_ON_GPIO endif

#################################################################

## 11 ##

#######选择gsensor型号,驱动程序edrv/gsensor################### ## mma7660fc

## mma7660fc_gpio GSENSOR_MODEL ?=

#################################################################

## 12 ##

##选择多卡模式,rda1203_gallite(2卡驱动);threesimd(3卡驱动);fourdimd(4卡驱动),驱动程序在edrv/dual_sim中##

DUALSIM_MODEL ?= rda1203_gallite_CT1129 ifeq \TARGET_EXPORT_FLAG += GALLITE_IS_8806 else

ifeq \TARGET_EXPORT_FLAG += GALLITE_IS_8808 endif

endif

#8806和8808的区别在bv3及其以前是不存在的,统一用TARGET_EXPORT_FLAG += GALLITE_IS_CT1129

##3卡驱动需要定义此宏

#TARGET_EXPORT_FLAG += TGT_THREE_SIM

##支持的多卡的数量***

NUMBER_OF_SIM ?= 2

##支持多卡的卡序排列*** USER_SIM_ORDER := 1 2

##如果用了SIM switch开关,就打开此宏 #TARGET_EXPORT_FLAG += SIM_SWITCH_USED

ifneq (${USER_SIM_ORDER},)

TARGET_EXPORT_FLAG += USER_SIM_SWAP endif # (${USER_SIM_ORDER},) #这里要根据sim卡数量合理配置

#################################################################

## 13 ##

##定义资源包####### CT_ERES :=440_3216

#这里定义使用的资源包,资源包在\\soft\\application\\target_res下。 #################################################################

## 14 ##

# Define the ML language support多国语言设置 ## ML_SUPPORT_CP0 印地语 ## ML_SUPPORT_CP1256 波斯语 ## ML_SUPPORT_CP1258 越南语 ## ML_SUPPORT_CP874 泰语 ## ML_SUPPORT_CP936 中文

## ML_SUPPORT_ISO8859_1 阿尔巴尼亚语、巴斯克语、布列塔尼语、加泰罗尼亚语、 ## 丹麦语、荷兰语、法罗语、弗里西语、加利西亚语、德语、 ## 格陵兰语、冰岛语、爱尔兰盖尔语、意大利语、拉丁语、

## 卢森堡语、挪威语、葡萄牙语、里托罗曼斯语、苏格兰盖尔语、西班牙语及瑞典语

## ML_SUPPORT_ISO8859_5 斯拉夫语 俄语

## ML_SUPPORT_ISO8859_6 阿拉伯语 ##多国语言设置总控制宏,目前需要常开 GLOBAL_EXPORT_FLAG += ML_SUPPORT

GLOBAL_EXPORT_FLAG += ML_SUPPORT_CP0 #GLOBAL_EXPORT_FLAG += ML_SUPPORT_ISO8859_1 #GLOBAL_EXPORT_FLAG += ML_SUPPORT_CP936

#对于多国语言,除了要在资源包里定义语言外,还要在这里定义相应的字符集编码。 #################################################################

## 15 ##

##当使用的FLASH为单BANKFLASH的时候,需要打开这个宏####### GLOBAL_EXPORT_FLAG += USER_DATA_CACHE_SUPPORT GLOBAL_EXPORT_FLAG += FACT_SETTING_CACHE_SUPPORT #gallite只支持spi flash,所以这里要一直打开; #对于CT1128,根据flash的情况选择打开或者关闭

#################################################################

## 16 ##

##RMVB播放解码需求的内存较大,MDI视频播放器总共约760KB####### TARGET_MEDIA_RM_MODEL :=0

ifeq \

TARGET_EXPORT_FLAG +=TARGET_MEDIA_RM_SUPPORT endif

################################################################# ## 17 ##

##支持video recorder功能

#GLOBAL_EXPORT_FLAG += VIDEO_RECORDER_SUPPORT

#这里是个小bug,应该定义成VIDEO_RECORDER_SUPPORT=0或者1。

##video record 时,内存分配控制。不支持video record时,可以关闭此宏节省内存。 #GLOBAL_EXPORT_FLAG += MEM_3216_CAMERA_LARGE_MODE GLOBAL_EXPORT_FLAG +=CAMERA_SUPPORT_300K_PIXELS

################################################################# ## 18 ##

##支持sound recorder功能

#TARGET_EXPORT_FLAG += SOUND_RECORDER_SUPPORT

################################################################# #这里是个小bug,应该定义成SOUND_RECORDER_SUPPORT=0或者1。 ## 19 ##

##增加单位时间内检测电池电压的次数,1500ma以上的电池可以不加这个宏 ##r440 close for many sxr mail box exceed

#TARGET_EXPORT_FLAG += PM_INCREASE_BATTERY_DETECT

#################################################################

## 20 ##

##启动camera ISP功能,在所有3216平台上必须打开,而在所有非3216平台上须关闭 GLOBAL_EXPORT_FLAG += _CAM_SMALL_MEM_

#################################################################

## 21 ##

##将文件系统REG区和sms区合并为CSW区,节省代码空间,客户无需修改,若存储的SMS数较多则需要注销此宏

GLOBAL_EXPORT_FLAG += _REG_SMS_MERGE

#################################################################

## 22 ##

##将QQVGA 放大到 QCIF.

#GLOBAL_EXPORT_FLAG += LCD_SCALE_128_160_TO_176_220

#################################################################

## 23 ##

# Receiver uses one speaker line (using left line by default) TARGET_EXPORT_FLAG += RECV_USE_SPK_LINE

# If using right line, the following macro should be added as well #TARGET_EXPORT_FLAG += RECV_USE_SPK_LINE_R

#################################################################

#在CT1128时代,由于芯片的一个bug,导致recv输出的时候有TDD,解决办法是将recv连接到spk输出。在gallite时代,已经不再存在这个问题。但是有些项目设计的时候仍然保留了从spk输出的传统。所以根据硬件设计的具体情况,这两个宏要选择打开或者关闭 ## 24 ## # RF优化选项: 若XCV直接控制PA与SW的可以打开此宏,若TCO控制则必须关掉此宏(请先咨询FAE)

TARGET_EXPORT_FLAG += INTERNAL_XCV_CONTROL_PASW

################################################################# #XCV直接控制已经是目前推荐的参考设计,所以这个宏一般都是打开的。 ## 25 ##

##关闭了魔音功能

GLOBAL_EXPORT_FLAG += TARGET_MAGIC_SOUND_OFF

#################################################################

## 26 ##

##关闭midi支持

GLOBAL_EXPORT_FLAG += MIDI_NOT_SUPPORT

GLOBAL_EXPORT_FLAG += TARGET_MIDI_SUPPORT_OFF

#################################################################

## 27 ##

##强制将FM设为单声道

GLOBAL_EXPORT_FLAG += FMRDO_SINGLEVOLUMECHANNEL_SUPPORT

################################################################# #fm的问题后续专门讨论。 ## 28 ##

##禁止提前显示开机LOGO,打开后节约部分空间,默认128x60x2字节 GLOBAL_EXPORT_FLAG += NO_CS_LOGO

################################################################# #开机时间的问题后续专门讨论。

## 29 ##

##应用于压缩code yes ; no

CT_COMPRESS_CODE_SECTION ?= yes ##应用于压缩字符串资源

MMI_EXPORT_FLAG += COMPRESS_OPTIMIZE_FLASH_SIZE MMI_EXPORT_FLAG += COMPRESS_USE_LZMA

## 3264 3232 6464 COMPRESS_STATE := 3232

ifeq \GLOBAL_EXPORT_FLAG += COMPRESS_3264 endif

ifeq \GLOBAL_EXPORT_FLAG += COMPRESS_6464 endif

ifeq \GLOBAL_EXPORT_FLAG += COMPRESS_3232 endif

#代码压缩的问题后续专门讨论。

##编译优化选项,节约部分空间 CT_OPT:=dbg_size

##编译时候遇到warnning不停止编译 WITHOUT_WERROR:=1

##################################################################

## 30 ##

##支持T卡热插拔

#MMI_EXPORT_FLAG += __TFLASH_MOUNT_DYNAMIC__

#################################################################

############################################ ## 31 ## # trace 设置

GLOBAL_EXPORT_FLAG += MMI_NO_TRACE GLOBAL_EXPORT_FLAG += EDRV_NO_TRACE GLOBAL_EXPORT_FLAG += HAL_NO_PRINTF GLOBAL_EXPORT_FLAG += PAL_NO_TRACE GLOBAL_EXPORT_FLAG += SXS_NO_PRINTF GLOBAL_EXPORT_FLAG += APS_NO_PRINTF GLOBAL_EXPORT_FLAG += ARS_NO_PRINTF GLOBAL_EXPORT_FLAG += SXS_NO_DUMP GLOBAL_EXPORT_FLAG += MCI_NO_TRACE GLOBAL_EXPORT_FLAG += CSW_NO_TRACE GLOBAL_EXPORT_FLAG += CALIB_NO_PRINTF GLOBAL_EXPORT_FLAG += UMSS_NO_PRINTF GLOBAL_EXPORT_FLAG += UCTLS_NO_PRINTF GLOBAL_EXPORT_FLAG += VOIS_NO_PRINTF GLOBAL_EXPORT_FLAG += STACK_NO_PRINTF

GLOBAL_EXPORT_FLAG += RFD_NO_TRACE ############################################

## 32 ##

##该文件主要定义了一些宏开关,用于裁剪代码使用,主要用于3216项目使用 gallite_ulc.def####### TARGET_MEM_ULC_3216:= YES

include ${SOFT_WORKDIR}/target/${CT_TARGET}/gallite_ulc.def

include ${SOFT_WORKDIR}/platform/edrv/memd/${FLSH_MODEL}/memd.def #################################################################

## 32 ##

##这个宏开关,用来控制是否支持自动记录按键信息,通常用于记录出问题之前的按键信息,方便工程人员复现问题#######

##打开这个宏会额外占用大约9KByte的空间,可以根据实际情况考虑是否打开这个功能## #GLOBAL_EXPORT_FLAG += AUTO_TEST_KEYPRESS_RECORD_SUPPORT GLOBAL_EXPORT_FLAG += __SENDKEY2_SUPPORT__

## 33 ##

##定义短消息和电话本的条目

##PHONE_SMS_ENTRY_COUNT表征FLASH上多卡项目总计SMS容量,单卡数目为PHONE_SMS_ENTRY_COUNT/SIM_COUNT

##SIM_SMS_ENTRY_COUNT表征SIM卡上最大SMS容量,请勿修改 GLOBAL_EXPORT_FLAG += PHONE_SMS_ENTRY_COUNT=100 GLOBAL_EXPORT_FLAG += SIM_SMS_ENTRY_COUNT=255

GLOBAL_EXPORT_FLAG += PHONE_PHB_ENTRY_COUNT=100

GLOBAL_EXPORT_FLAG += __MMI_PHB_SLIM_OPTIONAL_FIELD__ GLOBAL_EXPORT_FLAG += __PHB_CALLER_IMAGE_SAVE_PATH_ONLY__

#################################################################

########以下用于抓去信息使用,建议不要修改######################## ifeq \

GLOBAL_EXPORT_FLAG += DUALSIMD_PROFILING GLOBAL_EXPORT_FLAG += STK_PROFILING GLOBAL_EXPORT_FLAG += TSD_PROFILING GLOBAL_EXPORT_FLAG += PMD_PROFILING GLOBAL_EXPORT_FLAG += RFD_NO_TRACE GLOBAL_EXPORT_FLAG += SX_PROFILING

GLOBAL_EXPORT_FLAG += HAL_PROFILE_ON_BUFFER GLOBAL_EXPORT_FLAG += PAL_PROFILING GLOBAL_EXPORT_FLAG += HAL_PROFILING

GLOBAL_EXPORT_FLAG += SPC_FUNC_PROFILING GLOBAL_EXPORT_FLAG += SPAL_IRQ_PROFILING ##系统启动时,尽早打开trace,需要时置0 #TARGET_EXPORT_FLAG += EARLY_TRACE_OPEN #Open fs layer assert.

GLOBAL_EXPORT_FLAG += _FS_DEBUG endif

##通过SPI调试射频寄存器参数时需要把此宏置0 TARGET_EXPORT_FLAG += SPI_REG_DEBUG LDPPFLAGS += -DSPI_REG_DEBUG

#################################################################

######################export board information defination##############################

EXPORT_BOARD_INFO := yes #enable or disable board information to lod EXPORT_BOARD_FLAGS := PM_MODEL ATV_MODEL FM_MODEL #user defined board information #######################################################################################

GLOBAL_EXPORT_FLAG += PA_VRAMP_220PF

#if not using external audio pa ,need disable this macro AUD_SPK_ON_WITH_LCD #TARGET_EXPORT_FLAG += AUD_SPK_ON_WITH_LCD

GLOBAL_EXPORT_FLAG += TGT_GALLITE_R440

## FM USE LINE_IN FM_USING_I2S := 0

#GLOBAL_EXPORT_FLAG += USE_HIGH_CORE_VAL 4.2、tgt_board_cfg.h详细描述 板级配置(board cfg)分为芯片接口配置和 device 接口配置。芯片接口配置包括配置gallite芯片的各个功能接口的使用情况,如:RF、UART interface、SPI、I2C/I2S、GPIO/GPO/TCO 等等,device接口配置包括device在gallite上所使用的接口和控制IO的连接情况。接口 device的具体配置情况和device driver相关,具体的接口定义是由device driver提供的。所以每当gallite用到新的device时,device driver开发者需要按照先前已有的configuration定义device driver的接口,保证兼容性。如果当前的配置不能满足新的driver的需要,可以按照需要添加合理的接口配置,并更新接口配置定义。对于tgt_board_cfg.h的配置需要基带工程师和软件工程师一起配合完成。 4.2.1、GPIO/GPO/TCO

GPIO有三种状态:AS_ALT_FUNC、AS_GPIO、NOT_CONNECTED。做原理图的时候要求基带工程师必须把有复用的管脚在原理图中标注出来,如下图所示:

注意:只有GPIO0~GPIO7是带中断的GPIO口。 GPIO_0在芯片内部使用了,在原理图上看不到GPIO_0的PIN脚。GPIO_0默认AS_GPIO。从上图可以看出,当PIN有复用的时候基带工程师会在原理图上标注出来,比如图中的PIN D14对应的PIN名为UART2_RXD/UART1_DTR/GPIO_8,表示PIN D14是复用的,既可以当做 GPIO(GPIO_8)来用也可以当成功能PIN(UART2_RXD或者UART1_DTR)来用。当PIN D14用作GPIO_8的时候,如下定义: #define TGT_HAL_GPIO_8_USED AS_GPIO

当PIN D14用作功能PIN(UART2_RXD或者UART1_DTR)时,如下定义: #define TGT_HAL_GPIO_8_USED AS_ALT_FUNC 当PIN D14悬空时,如下定义:

#define TGT_HAL_GPIO_8_USED NOT_CONNECTED

对于没有复用的GPIO只有两个状态:AS_GPIO和NOT_CONNECTED。在gallite上给到芯片外部使用的GPIO都是有复用功能的。对于到底是作为功能管脚使用还是作为GPIO使用,需要软件工程师跟基带工程师确认,同时这里也要求基带工程师使用网络标号的时候严格安装具体用途来标记网络名称。

GPO 只有两个状态:0表示管脚没有连接到任何设备或者连接了设备但是没有作为 GPO 使用(GPO脚也有复用功能),1表示作为GPO使用。

TCO只有两个状态:0表示管脚没有连接到任何设备或者连接了设备但是没有作为TCO使用(TCO脚也有复用功能),1表示作为TCO使用。 举例如下:

GPO_1/2/3/4用作SPI2接口时,相应的GPO应该配置成0 TCO_5用作I2S_DO时,应该配置成 0

注意:GPO在系统重启之后,默认值为1010101010,即偶数为0,奇数为1。对于要求默认开机为低的应用,要求接到偶数管脚上去,或者接到GPIO脚。

以下部分禁止改动,以下部分是让上面的配置生成三个整数,让程序使用起来更方便。

#define TGT_HAL_NO_CONNECT_GPIO ( \\ ((TGT_HAL_GPIO_0_USED & 2) >> 1) | \\

(TGT_HAL_GPIO_1_USED & 2) | \\ ……………….

#define TGT_HAL_USED_GPIO ( \\ (TGT_HAL_GPIO_0_USED & 1) | \\ ((TGT_HAL_GPIO_1_USED & 1) << 1) | \\ …………………

#define TGT_HAL_USED_GPO ( \\ (TGT_HAL_GPO_0_USED & 1) ……………………

#define TGT_HAL_USED_TCO (TGT_HAL_TCO_0_USED & 1) …………….. 4.2.2、并行Camera

#define TGT_HAL_CAM_CFG { .camUsed = TRUE, .camRstActiveH = FALSE, .camPdnActiveH = TRUE, .camPdnRemap = { .gpioId = HAL_GPIO_NONE}, .camRstRemap = { .gpioId = HAL_GPIO_NONE}, .cam1Used = FALSE, .cam1RstActiveH = FALSE, .cam1PdnActiveH = TRUE, .cam1PdnRemap = { .gpioId = HAL_GPO_1}, .cam1RstRemap = { .gpioId = HAL_GPIO_NONE}, }

| \\ ( \\ | \\ \\

\\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ gallite提供了专用的并行Camera接口,包括DATA0~7,PCLK、HREF、VSYNC、MCLK、RST、PDN和专用I2C接口。当使用单个并行Camera的时候,我们可以直接使用专用的PDN管脚,当使用双并行Camera(camera0和camera1)的时候,可以连接到两个不同的GPIO或者GPO,或者一个并行Camera的PDN接专用PDN管脚另外一个并行Camera接GPIO(GPO)。专用的I2C接口为硬流控,对于时序不好控制的Sensor,我们建议使用GPIO来模拟I2C,软流控更容易控制I2C的时序。

.camUsed:camera0被使用,则为TRUE,否则为FALSE;

.camRstActiveH:camera0的RST脚的极性,TRUE表示高电平reset有效,FALSE为低电平reset有效。

.camPdnActiveH:camera0的PDN脚的极性,TRUE表示高电平PDN有效,FALSE为低电平PDN有效。

.camPdnRemap:camera0的PDN管脚配置的 GPIO 端口号。 如果为{ .gpioId = HAL_GPIO_NONE},则PDN接专用PDN管脚,否则为接GPIO或者GPO。

.cam1Used、.cam1RstActiveH、.cam1PdnActiveH、.cam1PdnRemap和.cam1RstRemap为camera1的定义,意义和camera0相同。需要注意的是,camera1的RST脚可以和camera0的.camRstRemap相同,此时表示共用reset 管脚。当只有一个Camera的时候,这里配置为 HAL_GPIO_NONE。

另外gallite共有三组硬流控I2C总线,并口camera会使用其中一组(或使用GPIO模拟I2C),建议选用硬流控I2C的时候使用第1组,一般把这组专门分配给camera使用。在代码里如下定义:

#ifndef TGT_CAMD_CONFIG

#define TGT_CAMD_CONFIG \\ { \\ .i2cBusId = HAL_I2C_BUS_ID_1, \\ }

#endif // TGT_CAMD_CONFIG

4.2.3、串行Camera

gallite支持串行camera,配置方法是将并行camera的.camUsed和.cam1Used都设为FALSE,并增加如下的设置:

#ifndef TGT_CAMD_CONFIG #ifdef __PRJ_WITH_SPICAM__

#define TGT_CAMD_CONFIG \\ { \\ .i2cBusId = HAL_I2C_BUS_ID_1, \\ .spiCamPinCSB = { .gpoId = HAL_GPO_5 }, \\

.spiCamPinOverflowM = { .gpoId = HAL_GPIO_3 }, \\ .spiCamPinOverflowS = { .gpoId = HAL_GPIO_2 }, \\ } #else

#define TGT_CAMD_CONFIG \\ { \\ .i2cBusId = HAL_I2C_BUS_ID_1, \\ }

#endif //__PRJ_WITH_SPICAM__ #endif // TGT_CAMD_CONFIG

当使用spi camera的时候,target.def里会打开__PRJ_WITH_SPICAM__。一般来说spi cam需要一组硬流控I2C(一般选用第1组);3个IO口,一个作为输出(CSB),两个作为输入(OFM,OFS);以及一组SPI。 4.2.4、PWM

gallite支持三种方式的PWM,分别是PWL、PWT和LPG。在gallite上,PWM功能目前没有被使用,键盘和屏的背光控制是由PMIC提供的,PMIC给LCD背光提供PWM控制,给键盘背光提供开关控制,具体见下面的PMD部分。 4.2.5、I2C

#define TGT_HAL_I2C_CFG \\ { \\ .i2cUsed = TRUE, \\ .i2cBps = HAL_I2C_BPS_100K, \\ .i2c2Used = TRUE, \\ .i2c2Bps = HAL_I2C_BPS_100K, \\ .i2c3Used = FALSE, \\ .i2c3Bps = HAL_I2C_BPS_100K, \\ }

I2C共有3组,如果某一组被使用了,则设置相应的.i2cUsed(或.i2c2Used、.i2c3Used)为TRUE,否则为FALSE。gallite约定i2c1给camera用,i2c2给蓝牙或者gsensor用。 4.2.6、I2S

#define TGT_HAL_I2S_CFG \\ { \\ .doUsed = TRUE, \\ .di0Used = TRUE, \\ .di1Used = TRUE, \\

}

gallite包含两组I2S,一组给芯片内部使用,另一组给外设使用。target里面只能定义外设使用的配置,一般当产品中包含了蓝牙,蓝牙的PCM接口将会使用到I2S接口,FM 录音也会使用到I2S接口。 4.2.7、ebc

#define TGT_HAL_EBC_CFG \\ { \\ .cs2Used = FALSE, \\ .cs3Used = FALSE, \\ .cs4Used = FALSE \\ }

ebc的片选的使用配置。CT1128的ebc支持5 个片选,cs0为MCP FLASH,cs1为MCP RAM,这两个固定为 MCP Memory 使用。

.cs2Used为2复用,.cs2Used为TRUE,做ebc cs用,否则作为GPIO_22使用。 .cs3Used 为2复用,.cs2Used为TRUE,做ebc cs用,否则作为GPIO_23使用。 .cs4Used为TURE时,做ebc cs,FALSE悬空。

gallite不再在芯片外部支持ebc,内部ebc用来访问内置RAM。 4.2.8、UART

#define TGT_HAL_UART_CFG \\ { \\

HAL_UART_CONFIG_FLOWCONTROL, \\ HAL_UART_CONFIG_NONE \\ }

两个field代表gallite的两个UART的配置。HAL_UART_CONFIG_FLOWCONTROL代表 UART做流控使用,HAL_UART_CONFIG_NONE代表UART2没用使用。UART可选的配置包括:

HAL_UART_CONFIG_NONE(UART 没有使用); HAL_UART_CONFIG_DATA(只是用TXD和RXD);

HAL_UART_CONFIG_FLOWCONTROL(带流控UART,包括RTS和CTS); HAL_UART_CONFIG_MODEM(8线全功能UART也就是MODEM)。 HST_UART不需要配置。

注意:当UART接口被配置之后,四个PIN均需要同时作为UART使用,哪怕UART只用到两个PIN。在GPIO 配置中也需要注意这个问题。例如下面的配置是不允许的: #define TGT_HAL_GPIO_5_USED AS_GPIO #define TGT_HAL_GPIO_6_USED AS_GPIO

#define TGT_HAL_GPIO_7_USED AS_ALT_FUNC #define TGT_HAL_GPIO_8_USED AS_ALT_FUNC 4.2.9、SPI

#define TGT_HAL_SPI_CFG \\ { \\ { \\ .cs0Used = FALSE, \\ .cs1Used = FALSE, \\ .cs2Used = FALSE, \\

.cs3Used = FALSE, \\ .cs0ActiveLow = FALSE, \\ .cs1ActiveLow = FALSE, \\ .cs2ActiveLow = FALSE, \\ .cs3ActiveLow = FALSE, \\ .di0Used = FALSE, \\ .di1Used = FALSE \\ }, \\ { \\ .cs0Used = FALSE, \\ .cs1Used = FALSE, \\ .cs2Used = FALSE, \\ .cs3Used = FALSE, \\ .cs0ActiveLow = FALSE, \\ .cs1ActiveLow = FALSE, \\ .cs2ActiveLow = FALSE, \\ .cs3ActiveLow = FALSE, \\ .di0Used = FALSE, \\ .di1Used = FALSE \\ } \\

}

gallite芯片外部支持包括两组独立的SPI接口,SPI(SPI_1)和SPI_2。SPI_1支持3个片选信号,可连接3个device;SPI_2支持1个片选信号,可连接1个device。即SPI最多可以连接4个SPI device,但SPI_1某一时刻只允许访问3个device中的一个,但SPI_1和SPI_2 是独立的,可以同时访问其连接的device。

.cs0Used:根据硬件连接设备的情况,将.cs0Used、.cs1Used和.cs2Used设为TRUE(连接设备)或者FALSE(悬空或不做SPI使用)。 cs0ActiveLow:根据连接的设备的极性设置。

.di0Used和di1Used:TRUE代表SPI接口接收SPI device的数据,FALSE为.diUsed没有使用(不接收数据)。

gallite芯片内部还有一组SPI,用来支持集成的PMU、ABB和FM。这部分配置对用户是透明的。

4.2.10、并行LCD

#define TGT_HAL_GOUDA_CFG \\ { \\ .cs0Used = TRUE, \\ .cs1Used = FALSE, \\ .lcdData16Bit = FALSE, \\ .lcdResetActiveLow = TRUE, \\ .lcdResetPin = { .gpoId = HAL_GPO_11 }, \\ }

gallite 提供了专用的并行LCD接口GOUDA,支持8bit和16bit的并行LCD,如图所示: .cs0Used和.cs1Used:gouda有两个专门的片选信号,单屏设置cs0为TRUE,cs1为FALSE,双屏都设为TRUE;

.lcdData16Bit:8bit数据线设为FALSE,16bit数据线设为TRUE; .lcdResetActiveLow:reset信号的极性;

.lcdResetPin:reset信号的控制脚,例如下图是用GPIO_11来控制的。

4.2.11、串行LCD

#ifndef TGT_SPILCD_CONFIG #ifdef __PRJ_WITH_SPILCD__

#define TGT_SPILCD_CONFIG \\ { \\ .lcdA0Pin = { .gpoId = HAL_GPIO_6 }, \\ .lcdResetPin = { .gpoId = HAL_GPO_11 }, \\ }

#endif #endif

当使用spi lcd的时候,target.def里会打开__PRJ_WITH_SPILCD__。一般来说spi lcd需要2个IO口,一个作为输出(reset),一个作为输出(A0);以及一组SPI。 4.2.12、IO驱动

#define TGT_HAL_IO_DRIVE \\ { \\ { \\ .mData = 4, \\ .lsbMa = 4, \\ .msbMa = 4, \\ .ma23 = 4, \\ .mCs0 = 4, \\ .mCs1 = 4, \\ .mCs2 = 4, \\ .mCtrl = 4, \\ .mCtrlWe = 4, \\ .mClk = 4, \\ .serialLcd = 4, \\ .serialLcdSce = 4, \\ .xvrDomain = 4, \\ } \\ }

这个设置目前不起作用,不必修改它。IO驱动能力在代码里被硬编码为hwp_configRegs->IO_Drive1_Select = 0xffffffff; 4.2.13、HAL

#define TGT_HAL_CONFIG \\ { \\ .chipVersion = TGT_HAL_CHIP_VERSION, \\ .rfClkFreq = TGT_HAL_RF_CLK_FREQ, \\ .useLpsCo1 = FALSE, \\ .keyInMask = 0x1f, \\ .keyOutMask = 0x1f, \\

.pwmCfg = TGT_HAL_PWM_CFG, \\ .useUsbBackup = FALSE, \\ .useClk32k = FALSE, \\ .i2cCfg = TGT_HAL_I2C_CFG, \\ .i2sCfg = TGT_HAL_I2S_CFG, \\ .ebcCfg = TGT_HAL_EBC_CFG, \\ .uartCfg = TGT_HAL_UART_CFG, \\ .spiCfg = TGT_HAL_SPI_CFG, \\ .spi2UseSdPins = FALSE, \\ .useSdmmc = TRUE, \\ .camCfg = TGT_HAL_CAM_CFG, \\ .goudaCfg = TGT_HAL_GOUDA_CFG, \\ .noConnectGpio = TGT_HAL_NO_CONNECT_GPIO, \\ .usedGpio = TGT_HAL_USED_GPIO, \\ .usedGpo = TGT_HAL_USED_GPO, \\ .usedTco = TGT_HAL_USED_TCO, \\ .ioDrive = TGT_HAL_IO_DRIVE \\ }

这个配置是前面大部分配置的综合。 .keyInMask和.keyOutMask:这里需要根据实际使用到的KEYIN和KEYOUT的情况来配置,bit0~bit7对应keyin0~keyin7和keyout0~keyout7,当为0的时候,键盘扫描的时候会忽略来自该管脚的中断。

.useUsbBackup:当前平台没有使用该功能;

.useClk32k:如果使用D16脚输出32k则设为TRUE,并将GPO6和PWL1设置为不使用,同时在target.def里打开 USE_32K_CLOCK_PIN := 1

TARGET_EXPORT_FLAG += USE_32K_CLOCK_PIN

在最新的参考设计上这是推荐的做法,在bv3及以前版本上不支持。 .useSdmmc = TRUE和.spi2UseSdPins = FALSE,表示SDMMC使用的是专用SDMMC接口,反之,使用 SPI2 接口。 4.2.14、KEYPAD

#define KEY_COL_NUM 8

#define TGT_KEY_NB (KEY_ROW_NUM * KEY_COL_NUM)

#define KEY_MAP \\

{ \\

KP_STAR, KP_7, KP_4, KP_1, KP_UP , KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\ KP_0, KP_8, KP_5, KP_2, KP_DW, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\ KP_POUND,KP_9, KP_6, KP_3, KP_RT , KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\ KP_FM, KP_SR, KP_DEL ,KP_OK ,KP_LT , KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\

KP_BACK, KP_SL, KP_UNMAPPED, KP_UNMAPPED, KP_VD, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\

KP_UNMAPPED.KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\

KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\ KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, KP_UNMAPPED, \\ }

KEY_PAD为矩阵格式,系统默认支持的键盘阵列为8*8,行代表KEY_OUT0到7,列代表KEY_IN0到7。没有用到的键值定义为KP_ UNMAPPED。

对于 MMI 中使用到的键值,在 adp_events.c 中还有一层映射关系。

关于键盘定义,在Layout完成之后,Layout工程师需要把键盘的映射关系告诉基带工程师,基带工程师应该及时的把映射关系添加到原理图上。

4.2.15、RFD

#define TGT_XCV_CONFIG {.RST = TCO_UNUSED, .PDN = TCO(11) } #define TGT_PA_CONFIG {.ENA = TCO_UNUSED, .TXEN = TCO_UNUSED, .BS = TCO_UNUSED }

#define TGT_SW_CONFIG {.SW1 = TCO(2), .SW2 = TCO(3), .SW3 = TCO(4) } RFD包括transceiver(收发器,gallite芯片内置),power amplifier(功率放大器)和antenna switch(天线开关)。

XCV.RST为transceiver的reset信号;XCV.PDN为transceiver的enable信号,{.RST = UNUSED, .PDN = TCO(11) },这个不能改,gallite内部就是这么连接的。

PA.ENA为PA的enable信号,通常PA/SW二合一的芯片,不需要设置 PA.ENA,设置为 UNUSED;PA.TXEN为transmit的enable信号,PA.BS为band select信号,通常PA/SW二合一的芯片,不需要设置PA.BS,设置为UNUSED; SW.SW1/2/3为switch的band选择信号,这里的顺序需要根据RF页switch上GPIO0~GPIO3(或者CTR0~CTR2)的顺序来定义。

事实上,目前参考设计推荐的RF方案是使用内部的XCV来控制PA/SW,如下图,这样的方案是不可配置的,所以在target里面RFD的配置无效,系统会采用固定的配置。要使用内部 XCV控制PA/SW,需要在target.def里面打开TARGET_EXPORT_FLAG += INTERNAL_XCV_CONTROL_PASW。

4.2.16、PMD

PMD 配置分成 3 部分.power、.level和其他电源配置。 .power指的是供电的开关,分成四部分:

.ldo:电源提供的来源,来自于GPIO(GPO)的控制或者PMIC上的ldo,当没有供电或者不需要单独控制的时候配置为PMD_LDO_NONE。具体设置可以参考 PMD_LDO_ID_T,常用的两种配置举例:

{.opal = PMD_LDO_LCD } 使用PMIC上的vlcd ldo来供电;

{ .pin = { .gpioId=HAL_GPIO_3} } 通过GPIO3来控制外置ldo或其它设备来供电; { .pin = { .gpoId=HAL_GPO_4} } 通过GPO4来控制外置ldo或其它设备来供电; .polarity:极性,高电平有效还是低电平有效 .shared:是否与其他设备共用电源

.powerOnState:上电之后状态,TRUE 为上电之后为高电平,FALSE 反之。 .level指的是供电的等级,比如背光亮度,分成三部分: .type:电源类型,参考 PMD_LEVEL_TYPE_OPAL_T。 PMD_LEVEL_TYPE_NONE:没有级别;

PMD_LEVEL_TYPE_PWL0:由基带的PWL0提供级别控制; PMD_LEVEL_TYPE_PWL1:由基带的PWL1提供级别控制; PMD_LEVEL_TYPE_LPG:由基带的LPG提供级别控制;

PMD_LEVEL_TYPE_LDO:又分两种情况,分别是PMIC控制的内部ldo,或者GPIO/GPO控制的外部ldo。

PMD_LEVEL_TYPE_OPAL:PMIC提供的特殊的电源管理模块,包括sim卡,键盘背光等。 PMD_LEVEL_TYPE_BACKLIGHT:PMIC提供的led drive控制。

.ldo:电源提供的来源,来自于GPIO(GPO)的控制或者PMIC上的ldo,当没有供电或者不需要单独控制的时候配置为PMD_LDO_NONE。 .powerOnState:上电之后的级别。

#define TGT_PMD_CONFIG \\ { \\ .power = \\ { \\ { /* PMD_POWER_MIC : Micro bias enable */ \\ .ldo = { .opal = PMD_LDO_MIC}, \\ .polarity = TRUE, \\ .shared = TRUE, /* with PMD_POWER_EARPIECE */ \\ .powerOnState = FALSE, \\ }, \\

这是ldo mic给mic和耳机mic供电,是两者共用的。,

{ /* PMD_POWER_CAMERA : Camera LDO enable */ \\ .ldo = { .opal = PMD_LDO_CAM|PMD_LDO_RF}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ 一般Camera供电有两路,2.8V和1.8V,对应的电压设置.ldoCamIs2_8和.ldoRfIs2_8,TRUE 为 2.8,反之1.8;大部分Sensor的供电都是AVDD接2.8V,DVDD接1.8V,但是也有特殊的,比如byd3603,两个电压都是2.8V的,这样.ldoCamIs2_8和.ldoRfIs2_8都要设为TRUE。 { /* PMD_POWER_ANALOG : Analog LDO enable */ \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_STEREO_DAC : Stereo DAC LDO enable */ \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_LOUD_SPEAKER : Loud Speaker enable */ \\ .ldo /*= { .pin = { .gpoId = HAL_GPO_0 } },*/ \\ ={ .opal = PMD_LDO_NONE}, \\

.polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\

如果使用外部功放,一般需要用GPIO/GPO控制;如果只是使用内部功放,则不需控制,因为内部音频功放由ABB控制。

{ /* PMD_POWER_PA : RF Power Amplifier */ \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_USB : USB LDOs enable */ \\ .ldo = { .opal = PMD_LDO_USB}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\

{ /* PMD_POWER_SDMMC : SD/MMC LDO enable */ \\

.ldo = { .opal = PMD_LDO_NONE}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_FM : FM LDO enable */ \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_EARPIECE : Ear Piece Micro bias enable */\\ .ldo = { .opal = PMD_LDO_MIC}, \\ .polarity = TRUE, \\ .shared = TRUE, /* with PMD_POWER_MIC */ \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_BT : BlueTooth LDOs enable */ \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_CAMERA_FLASH : Camera Flash Light enable */ \\ .ldo = { .pin = {.gpioId = HAL_GPO_2}}, \\ .polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_LCD : (main) LCD LDO enable */ \\

.ldo = { .opal = PMD_LDO_LCD | PMD_LDO_USB}, \\

.polarity = TRUE, \\ .shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ { /* PMD_POWER_I2C : I2C LDO enable */ \\ /* Inside Gallite chip, PMD_LDO_CAM also supplies */ \\ /* power to I2C1 I/O. It must be specified here */ \\ /* if I2C1 is used on this board. */ \\ /* On this board, PMD_LDO_LCD also supplies power */ \\ /* to I2C2 pull-up resistor. */ \\

.ldo = { .opal = PMD_LDO_LCD}, \\ .polarity = TRUE, \\

.shared = FALSE, \\ .powerOnState = FALSE, \\ }, \\ }, \\ 如果使用了多组I2C,且供电ldo不同,则要将几个ldo或起来。

.level = \\ { \\ { /* PMD_LEVEL_SIM : Sim class voltage */ \\

.type = PMD_LEVEL_TYPE_NONE, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\ { /* PMD_LEVEL_KEYPAD : KeyPad Back Light level */ \\

.type = PMD_LEVEL_TYPE_OPAL, \\ .ldo = { .pin = { .gpoId = HAL_GPO_NONE}}, \\ .powerOnState = 0, \\ }, \\

键盘背光控制,一般有三种硬件方案:使用GPIO/GPO控制外置ldo、基带PWL1控制和PMIC提供的KEYPAD Light接口。

使用GPIO/GPO控制ldo只能起开关作用,不能调节亮度等级,配置方式如下: .type = PMD_LEVEL_TYPE_LDO

.ldo= { .pin = { .gpoId = HAL_GPO_3}}, 使用基带上的PWL1接口时,如下配置: .type =PMD_LEVEL_TYPE_PWL1

.ldo = { .pin = { .gpoId = HAL_GPO_6}},或任意其它值。 使用 PWL1可以调节亮度等级,分7个等级,255为最亮

.lightLevelToPwm1 = { 0, 0, 0, 0, 0, 224, 224, 224}, 使用PMIC提供的KEYPAD Light接口LED_KP,如下配置:

.type = PMD_LEVEL_TYPE_OPAL, \\ .ldo = { .opal = PMD_LDO_NONE},

LED_KP的亮度等级由.lightLevelToPwm0来控制,最大为0xFF。 .lightLevelToPwm0 = { 0, 32, 32, 32, 32, 32, 32, 32},

{ /* PMD_LEVEL_LCD : (main) LCD Back Light level*/ \\

.type = PMD_LEVEL_TYPE_BACKLIGHT, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\

LCD 背光设置和键盘背光设置相似,背光等级由.lightLevelToRda1203控制,最大0x8f88。 lightLevelToRda1203 ={ 0x8088, 0x8188, 0x8488, 0x8888, 0x8c88, 0x8d88, 0x8e88, 0x8f88} { /* PMD_LEVEL_SUB_LCD : Sub LCD Back Light level */ \\

.type = PMD_LEVEL_TYPE_NONE, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\

{ /* PMD_LEVEL_LED0 : LED0 Light level */ \\

.type = PMD_LEVEL_TYPE_NONE, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\ { /* PMD_LEVEL_LED1 : LED1 Light level */ \\

.type = PMD_LEVEL_TYPE_NONE, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\ { /* PMD_LEVEL_LED2 : LED2 Light level */ \\

.type = PMD_LEVEL_TYPE_NONE, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\ { /* PMD_LEVEL_LED3 : LED3 Light level */ \\ .type = PMD_LEVEL_TYPE_LDO, \\ .ldo = { .pin = {.gpioId = HAL_GPO_4}}, \\ .powerOnState = 0, \\ }, \\ LED3被用来作为手电筒的控制。

{ /* PMD_LEVEL_VIBRATOR : Vibrator control level */ \\

.type = PMD_LEVEL_TYPE_LDO, \\ .ldo = { .opal = PMD_LDO_VIBR}, \\ .powerOnState = 0, \\ }, \\ { /* PMD_LEVEL_LOUD_SPEAKER : loudspeaker gain */ \\ .type = PMD_LEVEL_TYPE_NONE, \\ .ldo = { .opal = PMD_LDO_NONE}, \\ .powerOnState = 0, \\ }, \\ }, \\ .lightLevelToRda1203 = {0x8088, 0x8188, 0x8488, 0x8488, \\

0x8488, 0x8488, 0x8488, 0x8488}, \\ .lightLevelToPwm0 = { 0, 32, 32, 32, 32, 32, 32, 32}, \\ .lightLevelToPwm1 = { 0, 0, 0, 0, 0, 224, 224, 224}, \\ /* Inside Gallite chip, PMD_LDO_MMC also supplies power to */ \\ /* TCU0-2, so if any of TCU0-2 is used, MMC LDO should be */ \\ /* always on in active mode and cannot be controlled as a */ \\

/* POWER or LEVEL LDO. */ \\ .ldoEnableNormal = PMD_LDO_MMC, \\ .ldoEnableLowPower = 0, \\ .ldoEnableNorma表示工作状态下常开的LDOs,.ldoEnableLowPower表示在低功耗状态下一直常开的LDOs。当某个LDO被放到.ldoEnableNormal时,如果有特定设备用到它,可以直

接设为.ldo = { .opal = PMD_LDO_NONE}, 例如这里.ldoEnableNorma是PMD_LDO_MMC,那么上面的PMD_POWER_SDMMC的.ldo就要设为PMD_LDO_NONE。 .ldoMicIs2_8 = TRUE, \\ .ldoCamIs2_8 = TRUE, \\ .ldoLcdIs2_8 = TRUE, \\ .ldoMMCIs2_8 = TRUE, \\ .ldoIbrIs2_8 = FALSE, \\ .ldoRfIs2_8 = FALSE, \\ 分别是VMIC、VCAM、VLCD、VMMC、VVIB和VRF的电压选择,TRUE为2.8V,FALSE为1.8V。gallite共有11个ldo,其它的有些由硬件配置,有些电压是固定的,所以没有在这里列出。

.batteryGpadcChannel = HAL_ANA_GPADC_CHAN_3, \\ 为电池电压检测所用的ADC通道

.batteryLevelFullMV = 4200, \\ 为电池充电电压上限,4.2V为满

.batteryLevelPrechargeMV = 3200, \\ 预冲门限电压

.batteryChargeTimeout = 4 HOURS, \\ 充电 TimeOut 时间,Timeout之后,报充电满

.batteryPulseChargeEndRatio = 4, /* 400mA / 50mA */ \\ 目前没用到

.batteryOffsetHighActivityMV = 30, \\ 背光亮时的电压补偿

.powerOnVoltageMV = 3400, \\ .powerDownVoltageMV = 3400, \\ 开机电压设置和关机电压设置

.batteryChargeCurrent = PMD_CHARGER_700MA, \\ 快充时的充电电流

.batteryChargerTopingUp = TRUE, \\ 目前没用到

.earpieceDetectGpio = HAL_GPIO_5, /* HAL_GPIO_NONE */ \\ 耳机中断检测使用的 GPIO

.earpieceGpadcChannel = HAL_ANA_GPADC_CHAN_0, \\ 为耳机mic电压检测所用的ADC通道 }

4.2.17、MEMD和AUDIO 这两部分一般不用修改。 4.2.18、SDMMC

#ifdef TGT_WITH_MCD_IF_spi #ifndef TGT_MCD_CONFIG

#define TGT_MCD_CONFIG \\ { \\ HAL_SPI_CS1, \\ HAL_GPIO_7 \\

}

#endif // TGT_MCD_CONFIG #endif

#ifdef TGT_WITH_MCD_IF_sdmmc #ifndef TGT_MCD_CONFIG

#define TGT_MCD_CONFIG \\ { \\ .cardDetectGpio = HAL_GPIO_NONE, \\ .gpioCardDetectHigh = TRUE, \\ .dat3HasPullDown = FALSE \\ }

#endif // TGT_MCD_CONFIG #endif

SDMMC有两种控制方式,一种是通过SPI,一种是通过专门的SDMMC接口,目前一般使用SDMMC接口的方式。如果支持热拔插,需要配置.cardDetectGpio为某个GPIO(0-7)作为中断检测口。 4.2.19、TSD

#define TGT_TSD_CONFIG \\ { \\ .penGpio = HAL_GPIO_0, \\ .debounceTime = 5*HAL_TICK1S/1000, \\ .downPeriod = 3, \\ .upPeriod = 3, \\ .maxError = 0x50 \\

}

pmic集成了触摸ic,如果启用触摸屏功能,需要在target.def里定义TSD_MODEL ?= rda1203_gallite

.penGpio:芯片内部固定接到GPIO_0上,所以不能改;

.debounceTime:debounce时间,越大越准确,但是灵敏度和反应时间降低。建议用默认值; .downPeriod和.upPeriod:多少个debounceTime之后开始pendown/penup取数; .maxError:同一点上两次采样的最大差异。 4.2.20、FM

#ifdef TGT_WITH_FM_MODEL_rda5802e_gallite #ifndef TGT_FMD_CONFIG

#define TGT_FMD_CONFIG \\ { \\ .powerOnTime = 16384, \\ .channelSpacing = FMD_CHANNEL_SPACE_100, \\ .seekRSSIThreshold = 0x10 \\ }

#endif // TGT_FMD_CONFIG

#endif // TGT_WITH_FM_MODEL_rda5802e_gallite

#ifdef TGT_WITH_FM_MODEL_rda5802na #ifndef TGT_FMD_CONFIG

#define TGT_FMD_CONFIG \\ { \\ .i2cBusId = HAL_I2C_BUS_ID_2, \\

.i2cBps = HAL_I2C_BPS_100K, \\ .powerOnTime = 1600, \\ .volumeVal = {0,0x7,0x10,0x12,0x15,0x1b,0x1e,0x25}, \\

.channelSpacing = FMD_CHANNEL_SPACE_100, .seekRSSIThreshold = 0x05, }

#endif // TGT_FMD_CONFIG #endif

#ifdef TGT_WITH_FM_MODEL_rda5888e #ifndef TGT_FMD_CONFIG

#define TGT_FMD_CONFIG { .i2cBps = HAL_I2C_BPS_100K, .powerOnTime = 1600, .volumeVal = {0,0x7,0x10,0x12,0x15,0x1b,0x1e,0x25}, .channelSpacing = FMD_CHANNEL_SPACE_100, .seekRSSIThreshold = 0x05, .pinPdn = { .gpioId = HAL_GPIO_NONE } }

#endif // TGT_FMD_CONFIG #endif

#ifdef TGT_WITH_FM_MODEL_rda5888h #ifndef TGT_FMD_CONFIG

#define TGT_FMD_CONFIG { .i2cBps = HAL_I2C_BPS_100K, .powerOnTime = 1600, .volumeVal = {0,0x7,0x10,0x12,0x15,0x1b,0x1e,0x25}, .channelSpacing = FMD_CHANNEL_SPACE_100, .seekRSSIThreshold = 0x05, .pinPdn = { .gpioId = HAL_GPIO_NONE } }

#endif // TGT_FMD_CONFIG #endif

根据target.def里面配置的不同,会选用不同的fm配置。一般不必修改。 4.2.21、GPIO模拟I2C

#ifndef TGT_GPIOI2C_CONFIG

#define TGT_GPIOI2C_CONFIG \\ \\ \\ \\

\\ \\ \\

\\ \\ \\ \\ \\

\\ \\ \\

\\ \\ \\ \\

{ \\ .i2c_gpio_Bps = GPIO_I2C_BPS_80K , \\ .scl_i2c_gpio = HAL_GPIO_25 , \\ .scl_i2c_gpo = HAL_GPO_NONE , \\ .sda_i2c = HAL_GPIO_24 \\ }

#endif // TGT_GPIOI2C_CONFIG . i2c_gpio_Bps:波特率设置

. scl_i2c_gpio:SCL的GPIO设置;

. scl_i2c_gpo:SCL的GPO设置,和. scl_i2c_gpio二选一即可; . sda_i2c:SDA的GPIO设置 4.2.22、BT

#define TGT_BTD_CONFIG \\ { \\ .i2cBusId = HAL_I2C_BUS_ID_2, \\ .pinReset = { .gpoId = HAL_GPIO_9 }, \\ .pinWakeUp = { .gpioId = HAL_GPIO_NONE }, \\ .pinSleep = { .gpioId = HAL_GPIO_1 } \\ }

.i2cBusId:选用哪组I2C;

.pinReset:基带的哪个IO控制BT的reset脚; .pinWakeUp:不用了,配成HAL_GPIO_NONE;

.pinSleep:BT通过这个脚唤醒基带,所以要配成GPIO0-8之间的可中断脚。 4.3、tgt_app_cfg.h详细描述

4.3.1、该文件配置用户数据区。用户数据区是用来存储 NVRAM、系统参数、WAP/MMS、短消息、电话本和用户数据(机身内存)的。我们通常会被告知客户要求支持 500 条短信或者更多,支持的越多需要在用户数据区内分配给SMS的空间就越大,当然同时还会占用一部分 RAM。下面是一个例子:

#define TGT_DSM_PART_CONFIG \\ { \\ { \\ .szPartName = \ \\

.eDevType = DSM_MEM_DEV_FLASH, \\ .eCheckLevel = DSM_CHECK_LEVEL_1, \\ .uSecCnt = 35, \\ .uRsvBlkCnt = 1, \\

.eModuleId = DSM_MODULE_FS_ROOT \\ }, \\ { \\ .szPartName = \ \\

.eDevType = DSM_MEM_DEV_FLASH, \\ .eCheckLevel = DSM_CHECK_LEVEL_1, \\ .uSecCnt = 5, \\ .uRsvBlkCnt = 1, \\

.eModuleId = DSM_MODULE_FS \\

}, \\ { \\

.szPartName = \ \\ .eDevType = DSM_MEM_DEV_FLASH, \\ .eCheckLevel = DSM_CHECK_LEVEL_3, \\ .uSecCnt = 43, \\ .uRsvBlkCnt = 2, \\

.eModuleId = DSM_MODULE_FS \\ }, \\ { \\ .szPartName = \ \\

.eDevType = DSM_MEM_DEV_FLASH, \\ .eCheckLevel = DSM_CHECK_LEVEL_1, \\ .uSecCnt = 15, \\ .uRsvBlkCnt = 1, \\

.eModuleId = DSM_MODULE_CSW \\ }, \\ { \\ .szPartName = \ \\

.eDevType = DSM_MEM_DEV_TFLASH, \\ .eCheckLevel = DSM_CHECK_LEVEL_3, \\ .uSecCnt = 0, \\ .uRsvBlkCnt = 0, \\

.eModuleId = DSM_MODULE_FS \\ } \\ }

带WAP/MMS的单T卡项目一般有5个分区,不带WAP/MMS的单T卡项目一般有4个分区,对于双T卡项目再加多一个分区,如下:

{ \\ .szPartName = \ \\

.eDevType = DSM_MEM_DEV_TFLASH, \\ .eCheckLevel = DSM_CHECK_LEVEL_3, \\ .uSecCnt = 0, \\ .uRsvBlkCnt = 0, \\

.eModuleId = DSM_MODULE_FS \\ }

每个分区的存储一般如下约定:

VDS0:这个是根分区,其它的分区都mount到VDS0。VDS0本身存储NV数据(包括电话簿,因为电话簿本身就是以NV方式存储的)。VDS0的容量可以如下估算(以3216项目为例):

logical_data_item_table_cust 70K logical_data_item_table_custpack 25K

NVRAM_UNIT 除电话本部分是 35.5K

电话本:NVRAM_PHB_NVRAM_LID(名字+号码) 电话本条目数 × sizeof(CFW_PBK_ENTRY_INFO)(78字节) 取整到512字节倍数

NVRAM_EF_PHB_SOMEFIELDS_LID(家庭号码??) 电话本条目数 × OPTIONAL_FIELDS_RECORD_SIZE (229字节)取整到512字节倍数 取整到512字节倍数

按照250个本机电话本来计算如下:

250*78=19500 取整到512字节倍数 19968 19.5K 250*229=57250取整到512字节倍数 57344 56K 电话本共需要19.5K +56K =75.5K

VDS0共需要70K +25K +35.5K +75.5K =206K。如果NVRAM_EF_PHB_SOMEFIELDS_LID是使用部分域,则VDS0需要的空间可以更小。保险起见,建议多增加30%的大小。

VDS1:用户数据区,就是在手机的filemgr里看到的分区。大小要根据项目需求来定义,如果打开了qq,则尽可能增加该分区的大小。 WAP_MMS:存储WAP/MMS的数据。

CSW:存储短消息和注册表数据。由于注册表数据不大,所以一个比较粗略的计算方式是,该分区大小正比与短消息容量。

MMC0/1:T卡的映射,不占用用户数据区。

现在知道了分区的存储容量,比如VDS0是206K,如何计算其.uSecCnt呢?这里有两个经验公式:

公式1:BlkCnt = (SecSz*SecCnt)/528 - RsvBlkCnt - 1

公式2:DataSz = (SecSz*SecCnt/528 - RsvBlkCnt - 38 - 1)*512 其中

BlkCnt:Block数目,Block是一个逻辑存储单位,大小是512字节。 DataSz:分区可存储的数据大小,注意它并不等于分区分配的物理空间大小(SecSz*SecCnt),因为FAT文件系统和VDS的扇区管理都需要空间。

SecSz:sector的大小,这个是flash本身决定的,现在的spi flash一般都是4K。 SecCnt:分区分配的sector的数目,也就是.uSecCnt。

RsvBlkCnt:分区分配的保留block的数目,保留的block越多,存储和访问的速度就越快,但是占用额外的空间也越多。 还有几个约束:

1)分区总数(包括T-Flash分区在内)不能大于8;

2)各个分区的SecCnt之和再加1不能大于flash用户区的sector_number(用户区的sector number在该项目用到的memd.def中)。

3)每个Flash分区划分必须符合如下最低要求:secCnt >=1 && RsvBlkCnt >= 1; 4)有且只有一个根目录分区,DataSz > 100KByte;

5)必须有一个CSW分区,SecCnt >=1(SecSz >= 64KByte的情况下); 6)可以有零个或多个普通文件系统分区;

7)分区名称最长不能超过15字节且必须由如下ASCII字符组成:

根据这些约束和公式2,可以算出某个存储容量需要多少物理sector。保险起见,建议多增加30%。

4.3.2、该文件还定义了CSW和MMI用到的heap大小,例如:

#define TGT_CSW_CONFIG \\ { \\

.cswHeapSize = 130*1024, \\ .cosHeapSize = 680*1024 \\ }

.cswHeapSize:这是CSW用到的heap大小; .cosHeapSize:这是MMI用到的heap大小。

我们的系统里面有很多heap,其中最原始的两个heap编号是heap0和heap1,heap0是在外部RAM上分配的(gallite内置的RAM也属于这种),heap1是在片上SRAM上分配的。我们一般关注heap0。在RAM上,除去静态分配的内存(data、bss、分配到RAM执行的text和overlay等),其它一股脑都给了heap0。其它的heap(比如上面CSW和MMI的heap)又从heap0上分出来,分出来后的heap在逻辑上和heap0是平等的。

CSW和MMI的这两个heap由于比较大,所以其分配比较敏感,如果太大了会造成RAM的浪费,且会影响到其它heap空间的分配(其它heap空间严重过小会造成开机死机,轻微过小会导致有时无法拨打电话或者有时echo loop测试无效等各种bug),太小了会影响通讯和多媒体功能。目前配置这两个heap的大小主要依赖经验值,影响的因素有存储规格(3216、3232、6432、6464),有无WAP/MMS,有无JAVA,屏幕的分辨率等等。所以配置一个新项目,最好参考现有的规格比较接近的项目,来配置这两个参数。另外,需要保证如下约束: _heap_size- cswHeapSize- cosHeapSize > 350K(3216项目) _heap_size- cswHeapSize- cosHeapSize > 400K(非3216项目) 其中_heap_size可以在符号表文件(map文件)中查到。 4.4、MMI配置

MMI的配置信息放在资源包的mmi_cfg目录下,包括:mmi_cfg.deg,conversion.mk以及 mmi_features.h。而资源包被target.def的CT_ERES变量所定义,这就把target和资源包(包括MMI配置)给关联起来了。

这些配置信息根据名字就可以理解,这里就不一一列出了。 4.4、资源

资源在资源包的mmi_customer目录下。 4.4.1、增加字符串:

1)在相关头文件里(例如Alarm的string id都在Alarmdef.h里)增加一个新的string id,然后编辑soft\\application\\mmi_customer\\ResGenerator\\ref_list.txt文件,增加一项字符串,推荐使用excel或者UltraEdit。这个文件在资源编译的时候会被拷贝到相关的资源包里; 2)编辑soft\\application\\target_res\\资源包\\mmi_customer\\Res_MMI\\下的相关文件(例如Alarm的字符串都由Res_Alarm.c处理),使用ADD_APPLICATION_STRING或者ADD_APPLICATION_STRING2宏明确在项目中增加一项字符串资源; 这样在代码里就可以通过该stirng id使用这个字符串了。 4.4.2、增加/替换图片: 1)在相关头文件里(例如Alarm的image id都在Alarmdef.h里)增加一个新的image id(替换的话略过这一步),然后解压缩soft\\application\\target_res\\资源包\\mmi_customer\\Images\\PLUTOxxxXxxx\\image.zip,在相关目录(例如Alarm的图片都在Alarm目录下)中新增或者替换某张图片;再压缩该目录,替换原来的image.zip文件。注意,该zip文件要保证和之前的zip文件保持相同的目录层次。 2)编辑soft\\application\\target_res\\资源包\\mmi_customer\\Res_MMI\\下的相关文件(例如Alarm的图片都由Res_Alarm.c处理),使用ADD_APPLICATION_IMAGE或者ADD_APPLICATION_IMAGE2或者ADD_APPLICATION_IMAGE3宏明确在项目中增加一项图片资源;

这样在代码里就可以通过该image id使用这个图片了。 4.4.3、增加菜单:

1)在相关头文件里(例如Alarm的menu id都在Alarmdef.h里)增加一个新的menu id; 2)编辑soft\\application\\target_res\\资源包\\mmi_customer\\Res_MMI\\下的相关文件(例如Alarm的菜单都由Res_Alarm.c处理),使用ADD_APPLICATION_MENUITEM宏明确在项目中增加一项菜单资源;这个宏的参数比较多,务必小心处理。 这样在代码里就可以通过该menu id使用这个menu了。 4.4.4、增加/编辑铃声 1)在soft\\application\\target_res\\资源包\\mmi_customer\\aud_source目录下新增或者替换某首铃声;

2)编辑soft\\application\\target_res\\资源包\\mmi_customer\\Res_MMI\\Res_Audio.c,资源编译的时候铃声数据会被保存到\\soft\\application\\target_res\\资源包\\mmi_customer\\CustResource\\ringData\\include下;

3)在soft\\application\\target_res\\资源包\\mmi_customer\\CustResource\\src\\resource_audio.c使用该铃声数据。

资源编译通过在编译命令行上增加CT_RESGEN=yes来进行。 4.4、模拟器

使用模拟器可以加速UI的开发。模拟器在代码中包含两个目录:CoolSimulator和NetworkSimulator。NetworkSimulator会生成一个dll给CoolSimulator使用,而CoolSimulator就是模拟器。第一次使用模拟器的时候,需要运行soft\\application\\CoolSimulator\\ocx\\regSkin.bat来注册控件CoolPhoneCtrl.ocx,否则模拟器不能使用。注意,目前模拟器对VC6.0的SP6支持不好,不要安装SP6。 在编译资源的时候,会把编译出来的资源文件自动添加到模拟器的工程文件中,把当前项目的编译开关自动添加到模拟器的宏文件中(TargetOption.txt)。所以运行模拟器之前,要先编译资源。如果编译模拟器的时候报错说某个头文件找不到(新增一个模块的时候会出现这个错误),需要手动编辑IncOption.txt文件,增加新的包含路径。

二、 常见问题

1、 双频、四频如何定义?

在soft\\application\\target_res\\g021_441_3216\\mmi_cfg\\conversion.mk有如下编译开关: MMI_EXPORT_FLAG += __GSM850__ MMI_EXPORT_FLAG += __EGSM900__ MMI_EXPORT_FLAG += __DCS1800__ MMI_EXPORT_FLAG += __PCS1900__ 以上编译开关根据需要打开;

双频的PA建议使用rda6231,四频的PA建议使用rda6232。软件默认的支持如下接收方式: RX1接850,RX2接900,RX3接1800,RX4接1900;

如果RX1接1900,RX2接1800,RX3接900,RX4接850,需要在target.def里打开GLOBAL_EXPORT_FLAG += __RF_RX1234_RECFG__; 如果其它特殊的接法,请联系FAE。

2、 射频发射正常,无接收

根据上面RX1-RX4的接法检查软硬件是否匹配。

3、 使用rda6231如何支持四频?

接收线如图连接,同时在xcvConfigure()函数配置0x3A,0x2A和0x2C寄存器如下: xcvBuildSpiCmd (confCmd, 0x3A, 0x0afaf ); // GPIO BS1,BS0 Setting for PCB6220 xcvBuildSpiCmd (confCmd, 0x2A, 0x007ff ); // GPIO SWEN

xcvBuildSpiCmd (confCmd, 0x2C, 0x0 ); // GPIO SWEN_highband

4、 如何在CAT调整音频参数后将其作为默认参数编译进代码?

使用CAT调整音频参数后,要先写入FLASH,再使用将参数导出到一个头

文件中,例如命名为:calibp_audio_defaults.h。

然后将calibp_audio_defaults.h覆盖soft\\platform\\calib\\src\\下的同名文件即可。

5、 如何进行模块化编译?

参考第一部分的“如何编译代码”一节。

6、 如何修改RF默认参数?

PA/SW的默认参数在:soft\\platform\\edrv\\rfd\\pasw_rda6231\\src\\drv_pasw_calib.h;

XCV的默认参数在:soft\\platform\\edrv\\rfd\\xcv_rda6220_gallite_CT1129\\src\\drv_xcv_calib.h。

7、 编译的时候提示boot目录找不到

如下图所示:

在资源管理器里也看不到这个boot目录,但是在cmd命令行里可以使用cd命令进入到该目录。出现该现象是由于电脑感染了病毒,请重新安装系统。

8、 LCD开机或者唤醒白屏

硬件焊接没问题的话,软件从几个地方入手:

8.1、确认target.def里的LCD_MODEL配置正确。由于我们的lcd自适应是通过lcd的id来识别实现的,所以同样id的lcd不能同时赋值给LCD_MODEL; 8.2、检查lcddp_Init(),适当延长关键的延时;

8.3、如果是睡眠唤醒白屏,可以在lcddp_WakeUp()里直接调用lcddp_Init(); 8.4、配合模组厂的FAE检查波形。

9、 播放MP4的时候花屏、错位、颠倒、镜像或者像素偏移

这种问题一般是由于lcd驱动的旋屏函数错误导致的,如果全屏出现这些现象是由于lcddp_SetDirRotation()函数错误,如果非全屏出现这些现象是由于lcdd_SetDirDefault()函数错误。请查阅规格书检查该函数。

10、 输入法候选字显示不全

修改soft\\application\\thirdpartylibs\\gb_code\\include\\gbhmi.h,适当减GB_CH_CANDIDATE_COUNT和GB_CH_SYMBOL_CANDIDATE_COUNT的值。

11、 3216的项目能否支持MIDI?

目前MIDI占用不到110KB的ROM,还有不到100B的静态RAM内存,可以根据实际情况打开MIDI的支持。

12、 SendKey2如何支持?

如果需要支持SendKey2,则在tgt_board_cfg.h文件中定义KEY_MAP的地方,将sendkey1的位置上定义为KP_BACK,sendkey2的位置上定义为KP_DEL;并在soft\\application\\target_res\\资源包\\mmi_cfg\\mmi_config.def文件中定义MMI_SUPPORT_SENDKEY2 := YES

如果只需要支持SendKey1,则在tgt_board_cfg.h文件中定义KEY_MAP的地方,将send1的位置上定义为KP_SND,并在soft\\application\\target_res\\资源包\\mmi_cfg\\mmi_config.def文件中定义MMI_SUPPORT_SENDKEY2 := NO

13、 压缩的介绍

目前的压缩功能分三种,由三组开关控制:

1)资源压缩,主要是字符串的压缩,应用于3216的项目上,在target.def里打开 MMI_EXPORT_FLAG += COMPRESS_OPTIMIZE_FLASH_SIZE MMI_EXPORT_FLAG += COMPRESS_USE_LZMA

2)代码段的压缩,应用于3232、3264和6432的项目上,在target.def里打开 CT_COMPRESS_CODE_SECTION ?=yes

3)数据段的压缩,应用于3232、3264和6432的项目上,在target.def里打开 CT_COMPRESS_DATA_SECTION :=yes

MMI_EXPORT_FLAG += COMPRESS_USE_LZMA

14、 宏的定义和使用

我们平台共有5种类型的宏,定义在不同的地方:

GLOBAL_EXPORT_FLAG:顾名思义,这是全局宏,希望所有的代码都能看的到,所以一般定义在target.def里。

TARGET_EXPORT_FLAG:目标板相关的宏,全局可见,多用来作为硬件级的功能开关,所以一般定义在target.def里。

CHIP_EXPORT_FLAG:芯片相关的宏,不建议改动,定义在soft\\platform\\chip\\defs\\和soft\\platform\\chip\\rom\\gallite\\lib\\下的def文件里,全局可见。

上面这3种宏,如果按照约定的位置来定义,是所有的代码都看得到的。 LOCAL_EXPORT_FLAG:局部宏,包括如下几个来源:

MMI_EXPORT_FLAG:顾名思义是MMI相关的宏,只有application目录下的文件才看得到,定义在soft\\application\\target_res\\资源包\\mmi_cfg\\conversion.mk;MMI_EXPORT_FLAG定义的宏最后会加到LOCAL_EXPORT_FLAG里去;

本文来源:https://www.bwwdw.com/article/5cvo.html

Top