#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, \\