.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, \\ }, \\