本文档主要介绍COROS-SOLO-MB主板测试方法,包含系统框架、测试项、与测试方法三部分。
如下1-1 COROS-SOLO-MB系统测试框架图,主要包括Windows-PC测试端,主板测试MCU,CV2,FPGA模块,及其主要有Sensor,HDMI,SD Card,I2C,SPI,UART,WIFI,AUDIO,NAND,GPIO,ALS,LED,RTC,PSOC,TMP,TPM,PWR_SW,PWR_WKP,DDR测试项组成。
1-1 COROS-SOLO-MB系统测试框架图
2.1 Sensor测试模块
测试标准:外接HDMI显示器查看是否出图。
2-1 Sensor测试方法图
测试原理:
如上2-1 Sensor测试方法图示,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,CV2读I2C0通道寄存器数据。
步骤3,读寄存器函数返回值。
步骤4,CV2下位机响应测试结果并反馈至上位机。
步骤5,上位机PC端解析响应命令并保存显示测试结果。
步骤6,测试标准参看HDMI显示器是否出图,则整个测试完成。
测试实现:
Sensor测试命令:
请求:leopard sensor 1\r\n
响应:$response sensor 1 1$
功能:摄像头出图。
接口函数:static UINT32 sensor_test()
函数功能:读取sensor驱动寄存器接口函数返回值
参数说明:输入Sensor id,区别多路sensor
返回值:成功1,失败0
程序源码:
/*
* Function Name: sensor_test
* Purpose: Camera sensor test .We need someone to look at the monitor
* Parameter:
* Return:
* SVC_OK : success
* SVC_NF : failed
* Remark:
*
*/
static UINT32 sensor_test()
{
UINT32 RetVal = SVC_OK;
UINT8 RxData = 0;
RetVal = LeoPard_Imx334_RegRead(0x3030, &RxData, 1, AMBA_I2C_CHANNEL0);
AmbaPrint_PrintUInt5("===> sensor_0_test,read reg[0x3030]:%d", RxData, 0U, 0U, 0U, 0U);
return RetVal;
}
2.2 HDMI测试模块
测试标准:外接HDMI显示器查看是否出图。
2-2 HDMI测试方法图
测试原理:
如上2-2 HDMI测试方法图示,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,CV2调用AMBA-HDMI API 得到HDMI状态值。
步骤3,CV2响应测试结果。
步骤4,上位机PC端解析响应命令并保存显示测试结果。
步骤5,测试标准参看HDMI显示器是否出图,则整个测试完成。
测试实现:
HDMI测试命令:
leopard HDMI 1 \r\n
$response HDMI 1 1$
功能:SENSOR出图,HDMI连接显示器显示图像。
接口函数:static UINT32 hdmi_test(UINT32 HdmiPort)
函数功能:获取视频表示码。
参数说明:输入UINT32 HdmiPort表示HDMI端口
返回值:成功1,失败0
程序源码:
/*
* Function Name: hdmi_test
* Purpose: Leopard command test
* Parameter: UINT32 HdmiPort
* Return:
* SVC_OK : success
* SVC_NF : failed
* Remark: For this test case that We need someone to look at the monitor
*
*/
static UINT32 hdmi_test(UINT32 HdmiPort)
{
UINT32 RetVal = SVC_OK;
UINT32 HotPlugDetect;
UINT32 EdidDetect;
AMBA_HDMI_SINK_INFO_s SinkInfo;
RetVal = AmbaHDMI_TxGetSinkInfo(HdmiPort, &HotPlugDetect, &EdidDetect, &SinkInfo);
if (0 == HotPlugDetect) {
RetVal = SVC_NG;
}
return RetVal;
}
2.3 SD测试模块
测试标准:SD卡是否可读写数据且比较数据是否相等。
2-3 SD测试方法图
测试原理:
如上2-2 SD测试方法图示,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,在SD创建和写入数据文件。
步骤3,读文件且比较数据大小。
步骤4,CV2下位机响应测试结果并反馈至上位机。
步骤5,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
SD测试命令:
leopard sd 1\r\n
$response sd 1 1$
功能:读取SD卡内数据实现。
接口函数:static UINT32 SDCard_Test(void)
函数功能:向SD卡写文件,读文件比较读写内容一致性。
参数说明:输入无
返回值:成功1,失败0
程序源码:
/*
* Function Name: SDCard_Test
* Purpose: SDCard Test case main function to leopard request command test case.
* Parameter:
* Return:
* SVC_OK : success
* SVC_NF : failed
* Remark: support multi-channels
*
*/
static UINT32 SDCard_Test(void)
{
AMBA_FS_FILE *Fp = NULL;
UINT32 RetVal = SVC_OK, NumSuccess;
UINT8 SdData[20] = { 0 };
/* 1 write */
/* 1.1 create and open file.This function is from CV2 SDK. */
RetVal = AmbaFS_FileOpen("c:\\leopard-sdcard-test.txt", "wb", &Fp);
if (SVC_OK != RetVal) {
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaFS_FileOpen fail!!\n", 0U, 0U);
return SVC_NG;
}
/* 1.2 write some data to this file.This function is from CV2 SDK. */
RetVal = AmbaFS_FileWrite("leopard sdcard test", 1U, 19U, Fp, &NumSuccess);
if (SVC_OK != RetVal) {
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaFS_FileWrite fail!!\n", 0U, 0U);
return SVC_NG;
}
/* 1.2 close this file.This function is from CV2 SDK. */
(void)AmbaFS_FileClose(Fp);
/* 2 read */
/* 2.1 open file.This function is from CV2 SDK. */
RetVal = AmbaFS_FileOpen("c:\\leopard-sdcard-test.txt", "rb", &Fp);
if (SVC_OK != RetVal) {
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaFS_FileOpen fail!!\n", 0U, 0U);
return SVC_NG;
}
/* 2.2 read data from this file.This function is from CV2 SDK. */
RetVal = AmbaFS_FileRead(SdData, 1U, 19U, Fp, &NumSuccess);
if (SVC_OK != RetVal) {
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaFS_FileRead fail!!\n", 0U, 0U);
return SVC_NG;
}
/* 2.2 close this file.This function is from CV2 SDK. */
(void)AmbaFS_FileClose(Fp);
/* 3 compare data */
SvcLog_NG(SVC_LOG_CONTROL_TASK, SdData, 0U, 0U);
if (0 == strcmp(SdData, "leopard sdcard test")) {
return SVC_OK;
}
return RetVal;
}
2.4 I2C测试模块
测试标准:读写FPGA寄存器,判断读写是否一致。
2-4 I2C测试方法图
测试原理:
该I2C接口测试主要有I2C0与I2C3接口测试。如上2-4 I2C测试方法图示,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,写FPGA寄存器数值。
步骤3,保存读寄存器数值并判断读写是否一致。
步骤4,CV2下位机响应测试结果并反馈至上位机。
步骤5,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
I2C0测试命令:
leopard i2c 0 60 0\r\n
$response I2C 0 1$
功能:读取FPGA寄存器数值。
I2C3测试命令:
$response I2C 3 1$
功能:读取FPGA寄存器数值。
接口函数:static UINT32 I2C_Test(UINT32 channel, UINT8 devAdd, UINT16 regAddr)
函数功能:由FPGA读写I2C通讯方式验证。
参数说明:输入UINT32 channel表示通道位,UINT8 devAdd为设备地址,UINT16 regAddr寄存器地址
返回值:成功1,失败0
程序源码:
* Function Name: I2C_Test
* Purpose: I2C Test case main function to leopard request command test case.
* Parameter: UINT32 channel,UINT8 devAdd,UINT16 regAddr
* Return:
* SVC_OK : success
* SVC_NF : failed
* Remark: support multi-channels
*
*/
static UINT32 I2C_Test(UINT32 channel, UINT8 devAdd, UINT16 regAddr)
{
UINT32 RetVal = SVC_OK;
UINT8 value[2];
UINT8 tx[4];
if ((0 == channel && 0x3C == devAdd) || (3 == channel && 0x3D == devAdd)) {
tx[0] = 0x01;
tx[1] = 0x23;
tx[2] = 0x01;
tx[3] = 0x2B;
RetVal = FpgaRegRead(devAdd, regAddr, value, channel);
SvcLog_OK(SVC_LOG_CONTROL_TASK, "===> re[%d]: 0x%04x ", regAddr, (value[0] << 8) | value[1]);//value & 0xffff
SvcLog_OK(SVC_LOG_CONTROL_TASK, "===> I2C channel %d read dev[%d] ", channel, devAdd);
if (RetVal != I2C_ERR_NONE) {
RetVal = SVC_NG;
}
else if (((value[0] << 8) | value[1]) == ((tx[0] << 8) | tx[1])){
SvcLog_OK(SVC_LOG_CONTROL_TASK,"FpgaRegRead value is coincident\n", 0U,0U);
RetVal = SVC_OK;
}
else if (((value[0] << 8) | value[1]) == ((tx[2] << 8) | tx[3])) {
SvcLog_OK(SVC_LOG_CONTROL_TASK,"FpgaRegRead value is coincident\n", 0U,0U);
RetVal = SVC_OK;
}
else {
SvcLog_OK(SVC_LOG_CONTROL_TASK,"FpgaRegRead value is not coincident\n", 0U,0U);
RetVal = SVC_NG;
}
}
else {
SvcLog_OK(SVC_LOG_CONTROL_TASK,"I2C_Test input parameter error\n", 0U,0U);
}
return RetVal;
}
2.5 SPI测试模块
测试标准:SPI连接设备寄存器读写。
2-5 SPI测试方法图
测试原理:
SPI测试包含SPI0与SPI2(MTK,TPM)两个测试接口。如上图2-5 SPI测试方法图示流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,SPI读写MTK,TPM寄存器。
步骤3,保存寄存器返回值并判断结果。
步骤4,CV2下位机响应测试结果并反馈至上位机。
步骤5,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:详细参考2.16章节TPM测试模块。
SPI0 测试命令:
leopard spi0 0
$response spi0 0 1$
功能实现:TPM测试模块做SPI0测试。
接口函数:static UINT32 Spi0_Test(void)
函数功能:读取TPM SPI寄存器信息。
参数说明:输入无
返回值:成功1,失败0
程序源码:
/*
* Function Name: Spi0_Test
* Purpose: Spi0 Test case main function for leopard command test case and call AmbaGPIO_SetFuncGPO api parameters method
* Parameter:
* Return: SVC_OK:success SVC_NG:failed
* Remark:
*
*/
static UINT32 Spi0_Test(void)
{
UINT32 RetVal = SVC_OK;
/* 調用TPM的測試函數 zwc*/
RetVal = TPM_Test(0,1,0);
return RetVal;
}
测试实现:
详细参见2.8章节WIFI测试模块。
SPI2 测试命令:
leopard spi 2
$response spi 2 1$
功能实现:WIFI测试模块做SPI2测试。
接口函数:static UINT32 Spi2_Test(void)
函数功能:读取MTK-WIFI网络接口配置信息。
参数说明:输入无
返回值:成功1,失败0
/*
* Function Name: Spi2_Test
* Purpose: Spi2 Test case for MTK case
* Parameter:
* Return: SVC_OK:success SVC_NG:failed
* Remark: suport multi-channels
*
*/
static UINT32 Spi2_Test(void)
{
/* 調用 mtk ifconfig zwc */
UINT32 RetVal = SVC_OK;
AmbaPrint_PrintStr5("====leopard_get_wifi!!! ====\n", NULL, NULL, NULL, NULL, NULL);
RetVal = mtk_ifconfig();
if (0 == RetVal) {
RetVal = SVC_OK;
}
else {
RetVal = SVC_NG;
}
delay_ms(3 * 1000);
return RetVal;
}
2.6 FLASH模块测试
测试标准:调用AMBA-API 读取Nand Flash ID,比较ID是否正确。
2-6 FLASH测试方法图
测试原理:
如上图2-6 FLASH 测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,读取Nand Flash ID。
步骤3,解析Nand Flash ID。
步骤4,CV2下位机响应测试结果并反馈至上位机。
步骤5,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
程序实现:
Flash 测试命令:
leopard nand 0\r\n
$response nand 1 1$
功能:读取Nand ID并校验正确性实现。
接口函数:static UINT32 Nand_Test(void)
函数功能:读取Nand Flash ID,比较ID是否正确。
参数说明:
返回值:成功1,失败0
程序源码:
/*
* Function Name: Nand_Test
* Purpose: Read and compare NAND_ID for nand flash test case
* Parameter:
* Return: SVC_OK:success SVC_NG:failed
* Remark:
*/
static UINT32 Nand_Test(void)
{
UINT32 RetVal = SVC_OK;
UINT8 nand_id[3] = {0};
memset(nand_id,0,3);
AmbaNAND_ReadID(0xff, nand_id, 2);
if (RetVal != 0) {
SvcLog_NG(SVC_LOG_CONTROL_TASK, "===> AmbaNAND_ReadID failed", 0U, 0U);
return SVC_NG;
}
if(nand_id[0] != 0x00 && nand_id[1] != 0xDC)
RetVal = SVC_NG;
SvcLog_NG(SVC_LOG_CONTROL_TASK, "Nand ID = 0x%02x%02x", nand_id[0], nand_id[1]);
return RetVal;
}
2.7 UART测试模块
测试标准:UART接口写入数据是否成功。
2-7 UART测试方法图
测试原理:
COROS-SOLO-MB共五个UART接口,其中UART与UART0用于RTOS和LINUX通讯接口,UART1 (未使能),UART2用于MTK固件烧录,UART3 (未使能)。UART2测试在WIFI测试项的MTK固件烧录时,即该功能测试完毕。
如上图2-7 UART测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,调用AMBA API写入Uart Data。
步骤3,CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
2.8 WIFI测试模块
测试标准:获取MAC,IP,Gateway等网络接口信息。
2-8 WIFI测试方法图
测试原理:
如上图2-8 WIFI测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,调用MTK SDK 连接WIFI ,取得 MAC与IP Data。
步骤3,返回MAC与IP。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
WIFI设置命令:
leopard setwifi ssid passwd ntp\r\n
$reponse setwifi 1$
功能:设置WIFI AP用户名,密码,NTP时间服务器信息。
接口函数:static UINT32 leopard_set_wifi(UINT8 *SSID, UINT8 *Password, UINT8 *pNTPSServer)
函数功能:设置WIFI配置信息。
参数说明:UINT8 *SSID表示AP用户名, UINT8 *Password表示AP密码, UINT8 *pNTPSServer表示NTP时间服务器。
返回值:成功1,失败0
WIFI 获取命令:
leopard getwifi 0\r\n
$response getwifi 0 1$
功能:获取网络接口信息IP,子网掩码,网关,MAC地址。
接口函数:static UINT32 leopard_get_wifi(void)
函数功能:获取WIFI网络接口信息。
参数说明: 输入参数无
返回值:成功1,失败0
程序源码:
/*
* Function Name: leopard_set_wifi
* Purpose: To set wifi parameters of ssid, passwd, ntpserver
* Parameter: UINT8 *SSID, UINT8 *Password, UINT8 *pNTPSServer
* Return:
* SVC_OK : success
* SVC_NF : failed
* Remark:
*
*/
static UINT32 leopard_set_wifi(UINT8 *SSID, UINT8 *Password, UINT8 *pNTPSServer)
{
UINT32 RetVal = SVC_OK;
AmbaPrint_PrintStr5("===leopard_set_wifi!!! ===\n", NULL, NULL, NULL, NULL, NULL);
RetVal = mtk_init();
SvcLog_NG(SVC_LOG_CONTROL_TASK, "mtk_init()---Ret Val:%d\n", RetVal, 0);
delay_ms(2 * 1000);
RetVal = CoROSWiFi_SetParams(SSID, Password, pNTPSServer);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "CoROSWiFi_SetParams---Ret Val:%d\n", RetVal, 0);
delay_ms(1000);
if (0 == RetVal) {
RetVal = SVC_OK;
SvcLog_NG(SVC_LOG_CONTROL_TASK, "RetVal:%d\n", RetVal, 0);
} else {
RetVal = SVC_NG;
SvcLog_NG(SVC_LOG_CONTROL_TASK, "RetVal:%d\n", RetVal, 0);
}
return RetVal;
}
/*
* Function Name: leopard_get_wifi
* Purpose: To get wifi interface informations
* Parameter:
* Return:
* SVC_OK : success
* SVC_NF : failed
* Remark:
*
*/
static UINT32 leopard_get_wifi(void)
{
UINT32 RetVal = SVC_OK;
AmbaPrint_PrintStr5("=== leopard_get_wifi!!! ===\n", NULL, NULL, NULL, NULL, NULL);
RetVal = mtk_ifconfig();
RetVal = CoROSWiFi_GetRSSI();
delay_ms(3 * 1000);
/* get rssi */
//RetVal = CoROSWiFi_GetRSSI();
if (0 == RetVal) {
RetVal = SVC_OK;
}
else {
RetVal = SVC_NG;
}
return RetVal;
}
2.9 Audio测试模块
测试标准:是否听到测试音频文件播放声音为准。
2-9 Audio测试方法图
测试原理:
如上图2-9 Audio 测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,调用AMBA audio API接口函数播放pcm文件。
步骤3,AMBA API播放音频测试文件。
步骤4,侦听测试文件有声音输出。
步骤5,CV2下位机响应测试结果并反馈至上位机。
步骤6,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
AUDIO 测试命令:
leopard audio 3\r\n
$response audio 3 1$
功能:读取AUDIO声卡数据实现。
接口函数:static UINT32 AUDIO_Test(UINT32 channel)
函数功能:设置声卡寄存器,且获取音频流播放。
参数说明:UINT32 channel表示声卡通道。
返回值:成功1,失败0
程序源码:
/*
* Function Name: AUDIO_Test
* Purpose: AUDIO test case to leopard command test case
* Parameter: UINT32 channel
* Return: SVC_OK:success SVC_NG:failed
* Remark: i2c channel (0-3)
*/
static UINT32 AUDIO_Test(UINT32 channel)
{
UINT32 ret = SVC_OK;
UINT32 audio_type = SVC_AUDIO_TYPE_PCM;
UINT32 play_time = 1000;
if (CheckAudioFile(audio_type) == SVC_NG) {
return SVC_NG;
}
ret |= MAX9744_RegWrite_8(channel, 0x96, 0x20);
ret |= MAX9744_RegWrite_8(channel, 0x96, 0x41);
if (ret == SVC_OK) {
/* start play media file. This file in SDCard ,and this name is sample.pcm.This function is from CV2 SDK.*/
SvcADecFlow_Start(audio_type);
delay_ms(play_time);
/* stop play. This function is from CV2 SDK.*/
SvcADecFlow_Stop();
}
return ret;
}
2.10 GPIO测试模块
测试标准:获取FPGA或MCU 的GPIO的IO Timing
2-10 GPIO测试方法图
测试原理:
如上图2-10 GPIO测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,调用FPGA或MCU设置GPIO Timing IO pinX。
步骤3,设置其他IO Timing as PINX。
步骤4,得到一个比较的IO Timing。
步骤5,CV2下位机响应测试结果并反馈至上位机。
步骤6,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
PSOC 测试命令:
leopard psocgpio 1\r\n
$response psocgpio 1 1$
功能:取得PSOC GPIO寄存器高低电平状态。
接口函数:Psoc_gpio_test
函数功能:取得PSOC GPIO寄存器高低电平状态。
参数说明:
返回值:成功1,失败0
程序源码:
/*
* Function Name: Psoc_test
* Purpose: PSOC-MCU GPIO test
* Parameter: NULL
* Return: SVC_OK:success SVC_NG:failed
* Remark:
*/
static UINT32 Psoc_gpio_test(void)
{
UINT32 RetVal = SVC_OK;
UINT32 RetVal_h;
UINT32 RetVal_l;
RetVal_h = AmbaGPIO_SetFuncGPO(PSOC_GPIO_43, AMBA_GPIO_LEVEL_HIGH);
delay_ms(2);
RetVal_h = Read_IO(PSOC_GPIO_158);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "RetVal = 0x%08x \n", RetVal_h, 0);
RetVal_l = AmbaGPIO_SetFuncGPO(PSOC_GPIO_43, AMBA_GPIO_LEVEL_LOW);
delay_ms(2);
RetVal_l = Read_IO(PSOC_GPIO_158);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "RetVal = 0x%08x \n", RetVal_l, 0);
if (0 == RetVal_l && 1 == RetVal_h) {
AmbaPrint_PrintUInt5("PSOC_GPIO_158 status is equal!!!\n", 0, 0, 0, 0, 0);
RetVal = SVC_OK;
}
else {
AmbaPrint_PrintUInt5("Read PSOC_GPIO_158 and PSOC_GPIO_43 status Failed!!!\n", 0, 0, 0, 0, 0);
RetVal = SVC_NG;
}
return RetVal;
}
2.11 ALS 测试模块
测试标准:取得光感寄存器与光感强度值。
2-11 ALS测试方法图
测试原理:
如上图2-11 ALS测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,读取Als_Opt3001寄存器。
步骤3,取得寄存器返回值与光感强度LUX值。
步骤4,CV2下位机响应测试结果并反馈至上位机。
步骤5,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现
ALS测试命令:
leopard als 0\r\n
$response als 1$
功能:读取SENSOR光感器寄存器数据。
接口函数:static UINT32 Als_Opt3001_test(UINT32 Channel)
函数功能:读取光感Opt3001寄存器状态值。
参数说明:输入UINT32 Channel表示通道数。
返回值:成功1,失败0
程序源码:
/*
* Function Name: Als_Opt3001_test
* Purpose: Read Als Opt3001 Register for test case
* Parameter: UINT32 Channel
* Return: SVC_OK:success SVC_NG:failed
* Remark: support multi-channels
*/
static UINT32 Als_Opt3001_test(UINT32 Channel)
{
UINT32 Retval = SVC_OK;
UINT16 Data = 0;
double LUX;
/* write config reg 0x01 */
Data = 0xCE10;
Als_Opt3001_RegisterWrite(0x45 << 1, 0x01, Data, Channel);
/* 1 read 0x00 val ,16bit ;read 0x01 val*/
Retval = Als_Opt3001_RegisterRead(0x45 << 1, 0x00, &Data, Channel);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "> Als_Opt3001_RegisterRead ===> Data: %d ===> Retval:%d", Data, Retval);
/* 2 convert and get ALS value */
if (0 == Retval) {
LUX = Als_Opt3001_Value(Data);
SvcLog_NG(SVC_LOG_CONTROL_TASK, ">>> LUX : %d\n", LUX, 0U);
}
else {
AmbaPrint_PrintStr5("ALS not work!!!\n", NULL, NULL, NULL, NULL, NULL);
}
return Retval;
}
2.12 LED测试模块
测试标准:设置LED GPIO高低电平状态值。
2-12 LED测试方法图
测试原理:
LED测试主要包括CPU LED,MCU LED,NAND LED,BOARD LED,CAMERA BOARD LED。
如上图2-12 LED测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,获取LED GPIO状态值。
步骤3,取得GPIO状态返回值。
步骤4,CV2下位机响应测试结果并反馈至上位机,且有测试人员目测LED闪灯状态。
步骤5,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
LED测试命令:
leopard led 1\r\n
$response led 1 1 $
功能:获取MCU控制的主板LED GPIO工作状态。
接口函数:static UINT32 Led_test(void)
函数功能:主板Led测试,改变GPIO状态值。
参数说明:输入无
返回值:成功1,失败0
程序源码:
/*
* Function Name: Led_test
* Purpose: LED CONTROL TEST WHICH INCLUDE CPU LED,MCU LED,NAND LED,BOARD LED
* Parameter: NULL
* Return: SVC_OK:success SVC_NG:failed
* Remark:
*/
static UINT32 Led_test(void)
{
UINT32 RetVal = SVC_OK;
AmbaPrint_PrintUInt5("Setting LED GPIO STATUS IS LOW!!!\n", 0, 0, 0, 0, 0);
RetVal = AmbaGPIO_SetFuncGPO(CPU_STAT_LED, AMBA_GPIO_LEVEL_LOW);
RetVal = AmbaGPIO_SetFuncGPO(NAND_CE_LED, AMBA_GPIO_LEVEL_LOW);
RetVal = AmbaGPIO_SetFuncGPO(CAM_D26_LED, AMBA_GPIO_LEVEL_LOW);
delay_ms(2);
AmbaPrint_PrintUInt5("Setting LED GPIO STATUS IS HIGH!!!\n", 0, 0, 0, 0, 0);
RetVal = AmbaGPIO_SetFuncGPO(CPU_STAT_LED, AMBA_GPIO_LEVEL_HIGH);
RetVal = AmbaGPIO_SetFuncGPO(NAND_CE_LED, AMBA_GPIO_LEVEL_HIGH);
RetVal = AmbaGPIO_SetFuncGPO(CAM_D26_LED, AMBA_GPIO_LEVEL_HIGH);
delay_ms(2);
AmbaPrint_PrintUInt5("Setting LED GPIO STATUS IS LOW!!!\n", 0, 0, 0, 0, 0);
RetVal = AmbaGPIO_SetFuncGPO(CPU_STAT_LED, AMBA_GPIO_LEVEL_LOW);
RetVal = AmbaGPIO_SetFuncGPO(NAND_CE_LED, AMBA_GPIO_LEVEL_LOW);
RetVal = AmbaGPIO_SetFuncGPO(CAM_D26_LED, AMBA_GPIO_LEVEL_LOW);
delay_ms(2);
AmbaPrint_PrintUInt5("Setting LED GPIO STATUS IS HIGH!!!\n", 0, 0, 0, 0, 0);
RetVal = AmbaGPIO_SetFuncGPO(CPU_STAT_LED, AMBA_GPIO_LEVEL_HIGH);
RetVal = AmbaGPIO_SetFuncGPO(NAND_CE_LED, AMBA_GPIO_LEVEL_HIGH);
RetVal = AmbaGPIO_SetFuncGPO(CAM_D26_LED, AMBA_GPIO_LEVEL_HIGH);
delay_ms(2);
AmbaPrint_PrintUInt5("Setting LED GPIO STATUS IS LOW!!!\n", 0, 0, 0, 0, 0);
RetVal = AmbaGPIO_SetFuncGPO(CPU_STAT_LED, AMBA_GPIO_LEVEL_LOW);
RetVal = AmbaGPIO_SetFuncGPO(NAND_CE_LED, AMBA_GPIO_LEVEL_LOW);
RetVal = AmbaGPIO_SetFuncGPO(CAM_D26_LED, AMBA_GPIO_LEVEL_LOW);
delay_ms(2);
AmbaPrint_PrintUInt5("Setting LED GPIO STATUS IS HIGH!!!\n", 0, 0, 0, 0, 0);
RetVal = AmbaGPIO_SetFuncGPO(CPU_STAT_LED, AMBA_GPIO_LEVEL_HIGH);
RetVal = AmbaGPIO_SetFuncGPO(NAND_CE_LED, AMBA_GPIO_LEVEL_HIGH);
RetVal = AmbaGPIO_SetFuncGPO(CAM_D26_LED, AMBA_GPIO_LEVEL_HIGH);
return RetVal;
}
2.13 RTC 测试模块
测试标准:获取系统当前时间差值验证RTC工作正常。
2-13 RTC测试方法图
测试原理:
如上图2-13 RTC测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,取得时钟差值。
步骤3,CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
RTC 测试命令:
leopard rtc 1\r\n
$response rtc 1 1$
功能:获取系统时间信息。
接口函数:static UINT32 RTC_Test(void)
函数功能:获取系统时钟。
参数说明:输入无。
返回值:成功1,失败0
程序源码:
/*
* Function Name: RTC_Test
* Purpose: RTC Test case main function to leopard command test case
* Parameter: NULL
* Return: SVC_OK:success SVC_NG:failed
* Remark: support multi-channels
*/
static UINT32 RTC_Test(void)
{
//AmbaRTC_Config
UINT32 Sec1, Sec2;
UINT32 ret = SVC_OK;
AMBA_RTC_DATE_TIME_s pCurrTime;
pCurrTime.Year = 1999;
pCurrTime.Month = 8;
pCurrTime.Day = 01;
pCurrTime.WeekDay = 01;
pCurrTime.Hour = 7;
pCurrTime.Minute = 3;
pCurrTime.Second = 1;
(void)AmbaRTC_Config(NULL, NULL, NULL, NULL);
AmbaRTC_SetSysTime(&pCurrTime);
ret = AmbaRTC_GetSysTime(&pCurrTime);
if (0U == ret) {
AmbaPrint_PrintStr5("AmbaRTC_GetSysTime return successfully!!!", NULL, NULL, NULL, NULL, NULL);
}
else if (RTC_ERR_0000 == ret) {
AmbaPrint_PrintStr5("AmbaRTC_GetSysTime return Invalid argument!!!", NULL, NULL, NULL, NULL, NULL);
}
else if (RTC_ERR_0002 == ret) {
AmbaPrint_PrintStr5("AmbaRTC_GetSysTime return User-define error reported by Callback!!!", NULL, NULL, NULL, NULL, NULL);
}
else {
AmbaPrint_PrintStr5("AmbaRTC_GetSysTime return Exception!!!", NULL, NULL, NULL, NULL, NULL);
}
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaRTC_GetSysTime --- pCurrTime-Year:%d\n,pCurrTime-Month:%d\n", pCurrTime.Year, pCurrTime.Month);
RTC_GetSystemTime(&Sec1);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaRTC_GetSysTime --- Before -- pSysTime:%d\n", Sec1, 0U);
delay_ms(1000);
RTC_GetSystemTime(&Sec2);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "AmbaRTC_GetSysTime --- After -- pSysTime:%d\n",Sec2, 0U);
if (Sec1 != Sec2) {
ret = SVC_OK;
AmbaPrint_PrintStr5("AmbaRTC Has Button Cell!!!", NULL, NULL, NULL, NULL, NULL);
}
else {
ret = SVC_NG;
AmbaPrint_PrintStr5("AmbaRTC Has not Button Cell!!!", NULL, NULL, NULL, NULL, NULL);
}
return ret;
}
2.14 PSOC测试模块
测试验证:PSOC电路状态控制。
2-14 PSOC测试方法图
测试原理:
如上图2-14 PSOC 测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,读取MCU控制PSOC-I2C寄存器数值。
步骤3,CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
PSOCI2C 测试命令:
leopard psoci2c 18\r\n
$response psoci2c 18 1$
功能:读PSOC-I2C data且获取状态值。
接口函数:static UINT32 get_psociic(UINT8 devAdd)
函数功能: 读取MCU控制PSOC-I2C data与保存状态值。
参数说明:输入参数无
返回值:成功1,失败0
程序源码:
/*
* Function Name: get_psociic
* Purpose: Get PSOCIIC date and Status value from MCU .
* Parameter: UINT8 devAdd
* Return: SVC_OK:success SVC_NG:failed
* Remark:
*/
static UINT32 get_psociic(UINT8 devAdd)
{
UINT32 RetVal;
UINT16 Getval;
UINT16 Get_status;
/* Get psociic date */
RetVal = PSOCIIC_Read(devAdd, &Getval);
/* read psociic Status */
Get_status = Getval & 00000001;
SvcLog_NG(SVC_LOG_CONTROL_TASK, "PSOCIIC_Read Getvalue: 0x%04x\n", Getval, 0U);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "PSOCIIC_Read Get_status: 0x%04x\n", Get_status, 0U);
if (RetVal != I2C_ERR_NONE) {
AmbaPrint_PrintStr5("get_psociic failed!!!!!", NULL, NULL, NULL, NULL, NULL);
}
SvcLog_NG(SVC_LOG_CONTROL_TASK, "get_psociic value: 0x%04x\n", Getval, 0U);
if (0 == Get_status) {
RetVal = SVC_NG;
}
else if (1 == Get_status) {
RetVal = SVC_OK;
}
else {
AmbaPrint_PrintStr5("PSOCIIC_Read exception!!!!!", NULL, NULL, NULL, NULL, NULL);
}
return RetVal;
}
2.15 TPM 测试模块
测试标准:读取SLB9670 TPM 寄存器数据。
2-15 TPM测试方法图
测试原理:
如上图2-15 TPM测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,SLB9670 TPM寄存器VID/PID。
步骤3, CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试方法:
TPM测试命令:
leopard tpm 0 1 0\r\n
$ response tpm 0 1$
功能:读取SLB9670加密芯片寄存器vid_rid。
接口函数:static UINT32 TPM_Test(void)
函数功能:读取SLB9670加密芯片寄存器vid_rid。
参数说明:输入参数无
返回值:成功1,失败0
程序源码:
/*
* Function Name: TPM_Test
* Purpose: SLB9670 TPM TEST by Reading register of vid_rid
* Parameter: NULL
* Return: SVC_OK:success SVC_NG:failed
* Remark: support multi-channels
*/
static UINT32 TPM_Test(UINT32 channel,UINT32 spi_mode,UINT32 lsb_msb)
{
UINT32 ret = SVC_OK;
UINT8 RxData[4] = {0};
UINT16 vid_rid = 0;
SvcLog_NG(SVC_LOG_CONTROL_TASK, "channel=%d\t",channel,0U);
SpiConfig_SLB9670.ClkMode = spi_mode;
SpiConfig_SLB9670.FrameBitOrder = lsb_msb;
SvcLog_NG(SVC_LOG_CONTROL_TASK, "SpiConfig_SLB9670.ClkMode:%d\t,SpiConfig_SLB9670.FrameBitOrder:%d",SpiConfig_SLB9670.ClkMode,SpiConfig_SLB9670.FrameBitOrder);
/* 0x80:read , 0x00:write */
/* read data */
SLB9670_RegisterRead(channel, TPM_RID(0), RxData, 1);
SLB9670_RegisterRead(channel, TPM_DID_VID(0), RxData, 4);
vid_rid = ((RxData[0]<<8) | RxData[1]) & 0xffff;
if (0 != vid_rid) {
ret = SVC_OK;
}
else {
ret = SVC_NG;
}
return ret;
}
2.16 TMP测试模块
测试标准:获取温度传感器I2C寄存器值与转换的温度值。
2-16 TMP测试方法图
测试原理:
TMP测试包括Sensor温度传感器与CV2主板温度传感器两部分。如上图2-16 TMP测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,读取TMP102寄存器值与温度值。
步骤3,CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
TMP SEN0测试命令:
leopard tmp 1 1\r\n
$response tpm 1 1$
功能:获取温度传感器sensor0温度。
TMP SEN1测试命令:
leopard tmp 1 3\r\n
$response tpm 1 1$
功能:获取温度传感器sensor1温度。
接口函数:static UINT32 CapTmp_Test(UINT32 ispos, UINT32 Channel)
函数功能:UINT32 ispos 温度转换标值,UINT32 Channel温感ID。
参数说明:输入参数无
返回值:成功1,失败0
程序源码:
/*
* Function Name: CapTmp_Test
* Purpose: read TMP102's register data
* Parameter: UINT32 ispos, UINT32 Channel
* Return: SVC_OK: success SVC_NG: failed
* Remark:
add: 1001 000X
reg: 0000 0000 temperature reg 16bit(all)
reg: 0000 0001 configure reg
reg: 0000 0010 T Low reg
reg: 0000 0011 T Hig reg
*/
static UINT32 CapTmp_Test(UINT32 ispos, UINT32 Channel)
{
UINT32 retval = SVC_OK;
UINT16 tmp = 0;
UINT16 Data = 0;
/* read configure register */
retval = TMP102_RegisterRead(0x90, 0x01, &Data, Channel);
Data = 0;
/* read temperature register */
retval = TMP102_RegisterRead(0x90, 0x00, &Data, Channel);
/* convert tmp */
ispos = Data >> 15;
Data = (Data >> 4) & 0x7ff;
if (0 == ispos) {
tmp = Data * 0.0625;
}
else {
tmp = 0 - (Data * 0.0625);
}
SvcLog_NG(SVC_LOG_CONTROL_TASK, "TMP102_RegisterRead ===> Data: %d", tmp, 0);
if (0 == tmp) {
SvcLog_NG(SVC_LOG_CONTROL_TASK, "TMP102_RegisterRead ===> Data: %d", tmp, 0);
retval = SVC_NG;
return retval;
}
return retval;
}
2.17 PWR_SW测试模块
测试标准:电源开关SW22的GPIO通断状态。
2-17 PWR_SW测试方法图
测试原理:
如上图2-17 PWR_SW测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,由MCU控制PSOC-GPIO通断(LED-D25)状态。
步骤3,CV2下位机响应测试结果并反馈至上位机,提示测试人员按下SW22,能看到D25亮灯。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试方法:
Power switch测试命令:
leopard pwrsw 1 \r\n
$response pwrsw 1 1$
功能: 电源开关按键测试。
接口函数:static UINT32 Pwr_sw_test(void)
函数功能:SW22电源开关按键测试。
参数说明:无。
返回值:成功1,失败0
程序源码:
/*
* Function Name: Pwr_sw_test
* Purpose: Power switch control test by MCU-PSOC-GPIO
* Parameter: NULL
* Return: SVC_OK:success SVC_NG:failed
* Remark:
*/
static UINT32 Pwr_sw_test (void)
{
UINT32 RetVal = SVC_OK;
SvcLog_NG(SVC_LOG_CONTROL_TASK, " Power switch test, Please press down SW22,then look at D25!!!\n", 0, 0);
return RetVal;
}
2.18 PWR_WKP测试模块
测试标准:主板电源唤醒电路SW20开关键功能测试。
2-18 PWR_WKP测试方法图
测试原理:
如上图2-18 PWR_WKP测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,调用AMBA API 获取PWR_WKP状态。
步骤3,CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
Power Wakeup测试命令:
leopard pwrwkup 1\r\n
$response pwrwkup 1 1$
功能:主板电源唤醒电路测试。
接口函数:static UINT32 Power_wakeup_Test(void)
函数功能:电源唤醒测试。
参数说明:输入无。
返回值:成功1,失败0
程序源码:
/*
* Function Name: Power_wakeup_Test
* Purpose: Power wakeup switch control test
* Parameter: NULL
* Return: SVC_OK:success SVC_NG:failed
* Remark:
* AmbaSYS_GetWakeUpInfo()
* System wakeup information
* 0:No power-up sequence involved
* 1:Wake-Up by RTC alarm
* 2:Wake-Up by PWC_WKUP pin
* 3:Wake-Up by PWC_WKUP1 pin
* 4:Wake-Up by PWC_WKUP2 pin
* 5:Wake-Up by PWC_WKUP3 pin
*/
static UINT32 Power_wakeup_Test(void)
{
UINT32 val_tx = SVC_OK;
UINT32 pWakeUpInfo;
val_tx = AmbaSYS_GetWakeUpInfo(&pWakeUpInfo);
SvcLog_NG(SVC_LOG_CONTROL_TASK, "===Power wakeup test, Please press down SW20,then implement test command !!!===\n", 0, 0);
AmbaPrint_PrintUInt5("AmbaSYS_GetWakeUpInfo()---AmbaSYS_GetWakeUpInfo(),pWakeUpInfo: %d\n!!!\n", pWakeUpInfo, 0, 0, 0, 0);
AmbaPrint_PrintUInt5("AmbaSYS_GetWakeUpInfo()---AmbaSYS_GetWakeUpInfo(),val_tx: %d\n!!!\n", val_tx, 0, 0, 0, 0);
if ((0 == val_tx) && (3 == pWakeUpInfo)) {
val_tx = SVC_OK;
}
else {
val_tx = SVC_NG;
}
return val_tx;
}
2.19 LPDDR测试模块
测试标准:写入与读取内存数据且比较是否一致。
2-19 LPDDR测试方法图
测试原理:
如上图2-19LPDDR测试方法图示包含主要流程,主要流程包含以下步骤。
步骤1,上位机PC测试工具下发串口测试指令于CV2下位机。
步骤2,分配一个内存buffer,写入与读取buffer数据且比较一致性。
步骤3,CV2下位机响应测试结果并反馈至上位机。
步骤4,上位机PC端解析响应命令并保存显示测试结果,则整个测试完成。
测试实现:
DDR测试命令:
请求:leopard ddr 0 300\r\n
响应:$response ddr 0 1$
功能:读取指定内存数据实现。
接口函数:static UINT32 LPDDR_Test(UINT32 read_or_write, UINT32 count)
函数功能:分配一段内存,读取内存。
参数说明:输入read_or_write内存分配开始位,count分配内存大小。
返回值:成功1,失败0
程序源码:
/*
* Function Name: LPDDR_Test
* Purpose: Spi Test case main function for leopard command test case
* Parameter: UINT32 read_or_write,UINT32 count
* read_or_write : read or write flag count : write or read data size (MB).
* Return: SVC_OK:success SVC_NG:failed
* Remark: LPDDR test The application layer can get read and write time.
*
*/
static UINT32 LPDDR_Test(UINT32 read_write, UINT32 count)
{
UINT32 RetVal = SVC_OK;
UINT8 lp_str[1024] = { 0 };
UINT8 read_temp;
UINT32 i = 0, j = 0;
UINT32 size = count * 1024 * 1024;
/* write memory*/
if (0 == read_write) {
for (i = 0; i < size; i++) {
for (j = 0; j < 1024; j++) {
lp_str[j] = 0xff;
}
}
}
else {
/* read memory */
for (i = 0; i < size; i++) {
for (j = 0; j < 1024; j++) {
read_temp = lp_str[j];
if(0xff != read_temp)
RetVal = SVC_NG;
}
}
}
return RetVal;
}