MTK平台产线生产标记位功能

  1. 背景描述

产线标记位用于记录待测物在每一个测试站的测试时间,测试站名,与测试结果。这些信息在离线的情况下帮助研发,质量,售后等人员了解手机在产线测试的各个情况,并进行追踪。对提高产线生产质量与管控有巨大的帮助。

  1. 设计思路

2.1 定义数据结构,保存测试结果:

typedef struct tagBENCHFLAG
{
unsigned char IDatetime[4];[A1]
unsigned char uIdx;[A2]
unsigned char uResult;[A3]
unsigned char szBenchName[10];[A4]
unsigned char uErrorCode[2];
unsigned char reserved[14];
}BENCHFLAG;

typedef struct
{
BENCHFLAG BenchFlag[30];[A5]
unsigned char uBenchCount;[A6]
unsigned char reserved[1024-960-1];
}PRODUCT_BENCHFLAG;

2.2 测试数据保存在proinfo分区,恢复出厂设置不会擦除。ATA和META模式下实现读写数据的接口。

  1. 代码实现

3.1 在tran_projects / kb8/kb8_h624_l1/kb8/device/transsion/kb8_h624/ProjectConfig_BSP.mk增加宏控

TRAN_FT_BENCHFLAG_SUPPORT = yes

3.3 将添加的nvram项保存到proinfo分区

vendor/mediatek/proprietary/external/nvram/libcustom_nvram/Android.mk

ifeq ($(strip $(TRAN_FT_BENCHFLAG_SUPPORT)), yes)
LOCAL_CFLAGS += -DTRAN_FT_BENCHFLAG_SUPPORT
endif

vendor/mediatek/proprietary/external/nvram / libcustom_nvram/CFG_file_info.c

//BSP:
#if defined(MTK_MLC_NAND_SUPPORT) && defined(TRAN_FT_BENCHFLAG_SUPPORT)
{ AP_CFG_REEB_PRODUCT_BENCHFLAG_LID, 2 * 1024 * 1024, 1024 * 1024 },
#elif defined(TRAN_FT_BENCHFLAG_SUPPORT)
{ AP_CFG_REEB_PRODUCT_BENCHFLAG_LID, 1024 * 1024, 1 * 1024 },
#endif
//BSP:

3.4 工厂模式下添加读写接口

vendor/mediatek/proprietary/factory / Android.mk

#BSP:
ifeq ($(strip $(TRAN_FT_BENCHFLAG_SUPPORT)), yes)
LOCAL_CFLAGS += -DTRAN_FT_BENCHFLAG_SUPPORT
endif
#BSP:

vendor/mediatek/proprietary/factory / inc/common.h

enum {
ITEM_MAIN_CAMERA,
ITEM_MAIN2_CAMERA,
//……………//省略
//BSP:
ITEM_READBANCH,
ITEM_WRITEBANCH,
//BSP:
ITEM_MAX_IDS
};

vendor/mediatek/proprietary/factory / inc/utils.h

//BSP:
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
int read_data_for_ata(int fd, char rbuff[], unsigned int length);
#endif
//BSP: add

vendor/mediatek/proprietary/factory / src/test/ftm_sp_ata.cpp

// BSP : add
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
#include “libnvram.h”
#include “CFG_BenchFlag_File.h”
#include “Custom_NvRam_LID.h”
#endif
// BSP : add
//…//

//BSP: add
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
static char* ftm_read_banch(at_cmd test_item_struct, char test_result);
static char* ftm_write_banch(at_cmd test_item_struct, char test_result);
#endif
//BSP: add

//BSP: add
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
static bool write_test_position_flag(char *test_position_flag, int flag_size)
{
F_ID fid;
int rec_num = 0;
int rec_size = 0;

if( !test_position_flag || flag_size <= 0) {LOGE(TAG "test_position_flag is NULL or flag_size is not greater than 0\n");return false;
}fid = NVM_GetFileDesc(AP_CFG_REEB_PRODUCT_BENCHFLAG_LID, &rec_size, &rec_num, ISWRITE);
if(fid.iFileDesc < 0)
{LOGE(TAG "fail to open custom1 info read_nvram1\n");return false;
}if (rec_num != 1) {LOGE("Unexpected record num %d\n", rec_num);NVM_CloseFileDesc(fid);return false;
}if (rec_size != sizeof(PRODUCT_BENCHFLAG)) {LOGE("Unexpected record size %d PRODUCT_BENCHFLAG %zu\n",rec_size, sizeof(PRODUCT_BENCHFLAG));NVM_CloseFileDesc(fid);return false;
}LOGD(TAG "write nvram: rec_size=%d,rec_num\n", rec_size, rec_num);if (write(fid.iFileDesc, test_position_flag, flag_size) < 0) {LOGE("Write test_position_flag fails errno %d\n", errno);NVM_CloseFileDesc(fid);return false;
};NVM_CloseFileDesc(fid);
return true;

}

static bool read_test_position_flag(char *test_position_flag)
{
F_ID fid;
int rec_size = 0;
int rec_num = 0;

if (test_position_flag == NULL) {LOGE(TAG "test_position_flag is null\n");return false;
}fid = NVM_GetFileDesc(AP_CFG_REEB_PRODUCT_BENCHFLAG_LID, &rec_size, &rec_num, ISREAD);
if(fid.iFileDesc < 0)
{LOGE(TAG "fail to open product info read_nvram1\n");return false;
}if (rec_num != 1) {LOGE("Unexpected record num %d\n", rec_num);NVM_CloseFileDesc(fid);return false;
}if (rec_size != sizeof(PRODUCT_BENCHFLAG)) {LOGE("Unexpected record size %d PRODUCT_BENCHFLAG %zu\n", rec_size, sizeof(PRODUCT_BENCHFLAG));NVM_CloseFileDesc(fid);return false;
}LOGD(TAG "read nvram:rec_size=%d, rec_num=%d\n", rec_size, rec_num);if(rec_size != read(fid.iFileDesc, test_position_flag, rec_size)) {LOGE(TAG "product info read failed\n");NVM_CloseFileDesc(fid);return false;
}
NVM_CloseFileDesc(fid);return true;

}

static char* ftm_read_banch(at_cmd test_item_struct, char test_result)
{
LOGD(TAG “Entry %s\n”, FUNCTION);
if((test_item_struct == NULL) || (test_result == NULL)) {
return NULL;
}

char *p_custominfo = (char*)malloc(sizeof(PRODUCT_BENCHFLAG)+2);
if (p_custominfo == NULL) {LOGE("ftm_read_banch malloc failed\n");return NULL;
}
memset(p_custominfo, 0, sizeof(PRODUCT_BENCHFLAG)+2);if (read_test_position_flag(p_custominfo)) {LOGD(TAG "custom_info: lDatetime=%x, uIdx=%x, uResult=%x, szBenchName=%s.", *((unsigned int*)p_custominfo), *(p_custominfo+4), *(p_custominfo+5), (p_custominfo+6));memcpy(p_custominfo+sizeof(PRODUCT_BENCHFLAG), "\r\n", 2);strcpy(test_result, SP_ATA_PASS);write_data_to_pc(p_custominfo, sizeof(PRODUCT_BENCHFLAG)+2);
} else {LOGE(TAG "read nvram custom_info failed.");strcpy(test_result, SP_ATA_FAIL);write_data_to_pc(test_result, strlen(test_result));
}
free(p_custominfo);
return test_result;

}

static char* ftm_write_banch(at_cmd test_item_struct, char test_result)
{
int ret = 0;

LOGD(TAG "Entry %s\n", __FUNCTION__);
if((test_item_struct == NULL) || (test_result == NULL))
{return NULL;
}char *p_custominfo = (char*)malloc(sizeof(PRODUCT_BENCHFLAG));
if ( p_custominfo == NULL) {LOGE("ftm_write_banch malloc failed\n");return NULL;
}
memset(p_custominfo, 0, sizeof(PRODUCT_BENCHFLAG));sprintf(test_result, "ready\r\n");
write_data_to_pc(test_result, strlen(test_result));

// usleep(100000);

ret = read_data_for_ata(usb_com_port, p_custominfo, sizeof(PRODUCT_BENCHFLAG));usleep(100000);if (ret != sizeof(PRODUCT_BENCHFLAG)) {LOGE("read_data_for_ata fail ret=%d.", ret);sprintf(test_result, "%s", SP_ATA_FAIL);goto END;
}
LOGD(TAG "custom_info: lDatetime=%x, uIdx=%x, uResult=%x, szBenchName=%s.", *((unsigned int*)p_custominfo), *(p_custominfo+4), *(p_custominfo+5), (p_custominfo+6));if (write_test_position_flag(p_custominfo, ret)) {LOGD("write nvram custom_info success.");sprintf(test_result, "%s", SP_ATA_PASS);
} else {LOGE("write nvram custom_info failed.");sprintf(test_result, "%s", SP_ATA_FAIL);
}

END:
free(p_custominfo);
write_data_to_pc(test_result, strlen(test_result));
return test_result;
}
#endif
//BSP: add
//…//
static char* ftm_item_entry_cb(at_cmd test_item_struct, char test_result)
{
item_t *items;
//…………………//省略
//BSP: add
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
if(at_cmd_struct.cmd_type == 0 && (other_cmd_hdlr[at_cmd_struct.index].item_id == ITEM_READBANCH
|| other_cmd_hdlr[at_cmd_struct.index].item_id == ITEM_WRITEBANCH))
{
LOGD(TAG “RLK_BANCH_FLAG: at_command_type=%d.\r\n”, at_command_type);
at_command_type = 0;
}
#endif
//BSP: add

vendor/mediatek/proprietary/factory / src/util/uart_op.cpp

//BSP: add
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
int read_data_for_ata(int fd, char rbuff[], unsigned int length)
{
unsigned int has_read=0;
ssize_t ret_val;
int timeout = 0;

     if(-1 == fd)return -1;LOGD(TAG "Enter %s: uart = %d\n", __FUNCTION__, fd);memset (rbuff, 0, length);while(has_read<length){

loop:
// LOGE(“usb_plus_in = %d\n”, usb_plus_in);
if(usb_plug_in == 0)
{
break;
}
usleep(1000);
//LOGD(“read_a_line uart_mutex try lock\n”);
if (pthread_mutex_lock (&uart_mutex))
{
LOGE(TAG “%s pthread_mutex_lock ERROR!\n”, FUNCTION);
}
//LOGD(“read_a_line uart_mutex lock done\n”);
ret_val = read(fd, &rbuff[has_read], 1);
//LOGD(“read_a_line uart_mutex try unlock\n”);
if (pthread_mutex_unlock (&uart_mutex))
{
LOGE(TAG “%s pthread_mutex_unlock ERROR!\n”, FUNCTION);
}
//LOGD(“read: %c, %d, %d”, rbuff[has_read], ret_val, has_read);
//LOGD(“read_a_line uart_mutex unlock done\n”);
if(-1 == ret_val){
if (errno == EAGAIN){
//LOGD(“UART1 can’t read a byte!\n”);
}else
LOGE(TAG “uart read fail! Error code = 0x%x\n”, errno);
//continue;
goto loop;
}

             has_read += (unsigned int)ret_val;if(timeout++ > 10000){break;}}return has_read;

}
#endif
//BSP: add

3.5 META模式下添加读写接口

vendor/mediatek/proprietary/hardware/meta / common/Android.mk

#BSP: add
ifeq ($(strip $(TRAN_FT_BENCHFLAG_SUPPORT)), yes)
LOCAL_CFLAGS += -DTRAN_FT_BENCHFLAG_SUPPORT
endif
#BSP: add

vendor/mediatek/proprietary/hardware/meta / common/src/FtModule.cpp

#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
#include “libnvram.h”
#include “CFG_BenchFlag_File.h”
#include “Custom_NvRam_LID.h”
#endif

typedef enum FT_CUSTOMER_CMD {
FT_CUSTOMER_CMD_NONE = 0,
//………//省略
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
FT_CUSTOMER_CMD_WRITE_BENCH_FLAG = 102,
FT_CUSTOMER_CMD_READ_BENCH_FLAG = 103,
#endif
FT_CUSTOMER_CMD_MAX,
} FtCustomerCmd;

#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
int write_test_position_flag(char *test_position_flag, int flag_size)
{
F_ID fid;
int rec_num = 0;
int rec_size = 0;

if(test_position_flag == NULL || flag_size <= 0 || flag_size > sizeof(PRODUCT_BENCHFLAG)){return false;
}fid = NVM_GetFileDesc(AP_CFG_REEB_PRODUCT_BENCHFLAG_LID,&rec_size,&rec_num,ISWRITE);
if(fid.iFileDesc < 0)
{META_LOG(TAG "fail to open custom1 info read_nvram1\n");return false;
}if (rec_num != 1) {META_LOG("Unexpected record num %d\n", rec_num);NVM_CloseFileDesc(fid);return false;
}if (rec_size != sizeof(PRODUCT_BENCHFLAG)) {META_LOG("Unexpected record size %d PRODUCT_BENCHFLAG %zu\n", rec_size, sizeof(PRODUCT_BENCHFLAG));NVM_CloseFileDesc(fid);return false;
}if (write(fid.iFileDesc, test_position_flag, flag_size) < 0) {META_LOG("Write test_position_flag fails errno %d\n", errno);NVM_CloseFileDesc(fid);return false;
};NVM_CloseFileDesc(fid);
return true;

}

int read_test_position_flag(char *test_position_flag)
{
F_ID fid;
int rec_size = 0;
int rec_num = 0;

if(test_position_flag == NULL){return false;
}fid = NVM_GetFileDesc(AP_CFG_REEB_PRODUCT_BENCHFLAG_LID, &rec_size, &rec_num, ISREAD);
if(fid.iFileDesc < 0)
{META_LOG(TAG "fail to open product info read_nvram1\n");return false;
}if (rec_num != 1) {META_LOG("Unexpected record num %d\n", rec_num);NVM_CloseFileDesc(fid);return false;
}if (rec_size != sizeof(PRODUCT_BENCHFLAG)) {META_LOG("Unexpected record size %d PRODUCT_BENCHFLAG %zu\n", rec_size, sizeof(PRODUCT_BENCHFLAG));NVM_CloseFileDesc(fid);return false;
}if(rec_size != read(fid.iFileDesc, test_position_flag, rec_size)) {META_LOG(TAG "product info read failed\n");NVM_CloseFileDesc(fid);return false;
}NVM_CloseFileDesc(fid);return true;

}
#endif
//BSP:add 20190618 end

void FtModCustomer::exec(Frame *pFrm)
{
//………//省略
switch(req->cmd.m_u1Dummy)
{
//……………//省略
#if defined(TRAN_FT_BENCHFLAG_SUPPORT)
case FT_CUSTOMER_CMD_WRITE_BENCH_FLAG:
{

        META_LOG("[Meta][FT] WRITE_BENCH_FLAG peer_buff_size=%d !",peer_buff_size);META_LOG("[Meta][FT] custom_info: lDatetime=%u, uIdx=%d, uResult=%d, szBenchName=%s.", *((int*)peer_buf), *(peer_buf+4), *(peer_buf+5), (peer_buf+6));if(write_test_position_flag(peer_buf, peer_buff_size)) {META_LOG("[Meta][FT] write nvram custom_info success.");ft_cnf.result.m_u1Dummy = FT_CUSTOMER_SUCCESS;ft_cnf.status = META_SUCCESS;} else {META_LOG("[Meta][FT] write nvram custom_info failed.");ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;}WriteDataToPC(&ft_cnf, sizeof(ft_cnf), out_buf, sizeof(out_buf));break;}case FT_CUSTOMER_CMD_READ_BENCH_FLAG:{META_LOG("[Meta][FT] READ_BENCH_FLAG peer_buff_size=%d !",peer_buff_size);PRODUCT_BENCHFLAG custom_info;char *p_custominfo = (char*)(&custom_info);memset(p_custominfo, 0, sizeof(PRODUCT_BENCHFLAG));if(read_test_position_flag(p_custominfo)) {META_LOG("[Meta][FT] custom_info: lDatetime=%u, uIdx=%d, uResult=%d, szBenchName=%s.", *((int*)p_custominfo), *(p_custominfo+4), *(p_custominfo+5), (p_custominfo+6));ft_cnf.result.m_u1Dummy = FT_CUSTOMER_SUCCESS;ft_cnf.status = META_SUCCESS;} else {META_LOG("[Meta][FT] read nvram custom_info failed.");ft_cnf.result.m_u1Dummy = FT_CUSTOMER_FAILED;}WriteDataToPC(&ft_cnf, sizeof(ft_cnf), p_custominfo, sizeof(PRODUCT_BENCHFLAG));break;}

#endif
//……………//省略

3.2 vendor/mediatek/proprietary/custom//cgen/添加nvram项

因为此修改在项目文件夹下且每个项目都需要配置一次,所以可以使用脚本,在编译的时候添加,脚本配置如下:

tran_projects / tran_setenv.sh

#BSP:add
if [ -f “tran_projects/common/ConfigProinfo/tran_proinfo_config.sh” ] ; then
source ./tran_projects/common/ConfigProinfo/tran_proinfo_config.sh
fi
#BSP:add
增加tran_projects / common/ConfigProinfo/cust_cfgdefault/CFG_BenchFlag_Default.h

#ifndef _CFG_BENCHFLAG_D_H
#define _CFG_BENCHFLAG_D_H

PRODUCT_BENCHFLAG stProductBenchflagDefault =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
};

#endif

增加tran_projects / common/ConfigProinfo/cust_cfgfileinc/CFG_BenchFlag_File.h

#ifndef _CFG_BENCHFLAG_FILE_H
#define _CFG_BENCHFLAG_FILE_H

typedef struct tagBENCHFLAG
{
unsigned char IDatetime[4];
unsigned char uIdx;
unsigned char uResult;
unsigned char szBenchName[10];
unsigned char uErrorCode[2];
unsigned char reserved[14];
}BENCHFLAG;

typedef struct
{
BENCHFLAG BenchFlag[30];
unsigned char uBenchCount;
unsigned char reserved[1024-960-1];
}PRODUCT_BENCHFLAG;

#define CFG_FILE_PRODUCT_BENCHFLAG_REC_SIZE sizeof(PRODUCT_BENCHFLAG)
#define CFG_FILE_PRODUCT_BENCHFLAG_REC_TOTAL 1

#endif

增加配置文件tran_projects / common/ConfigProinfo/tran_benchflag_config.cfg

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

This config file contains all configs of

AP_CFG_REEB_PRODUCT_BENCHFLAG_LID

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

CFG_file_info_custom.h:start
Part1_start
//BSP: add
#include “…/cfgfileinc/CFG_BenchFlag_File.h”
#include “…/cfgdefault/CFG_BenchFlag_Default.h”
//BSP: add end
Part1_end

Part2_start
//BSP: add start
{
“/mnt/vendor/nvdata/APCFG/APRDEB/PRODUCT_BENCHFLAG”, VER(AP_CFG_REEB_PRODUCT_BENCHFLAG_LID), CFG_FILE_PRODUCT_BENCHFLAG_REC_SIZE,
CFG_FILE_PRODUCT_BENCHFLAG_REC_TOTAL, SIGNLE_DEFUALT_REC, (char *)&stProductBenchflagDefault,DataReset, NULL
},
//BSP: add end
Part2_end

Part3_start
//BSP: add start
int iFilePRODUCT_BENCHFLAGLID=AP_CFG_REEB_PRODUCT_BENCHFLAG_LID;
extern int iFilePRODUCT_BENCHFLAGLID;
//BSP: add end
Part3_end
CFG_file_info_custom.h:end

Custom_NvRam_LID.h:start
Part1_start
//BSP: add start
AP_CFG_REEB_PRODUCT_BENCHFLAG_LID,
//BSP: add end
Part1_end

Part2_start
//BSP: add start
#define AP_CFG_REEB_PRODUCT_BENCHFLAG_LID_VERNO “000”
//BSP: add end
Part2_end
Custom_NvRam_LID.h:end

Custom_NvRam_data_item.h:start
Part1_start
//BSP: add start
LID_BIT VER_LID(AP_CFG_REEB_PRODUCT_BENCHFLAG_LID)
PRODUCT_BENCHFLAG *CFG_FILE_PRODUCT_BENCHFLAG_REC_TOTAL
{

};
//BSP: add end
Part1_end
Custom_NvRam_data_item.h:end

custom_cfg_module_file.h:start
Part1_start
//BSP: add start
#include “…/cfgfileinc/CFG_BenchFlag_File.h”
//BSP: add end
Part1_end
custom_cfg_module_file.h:end

在tran_projects / common/ConfigProinfo/tran_proinfo_config.sh

#add by 20190617
TRAN_BENCHFLAG_CONFIG_FILE=${TRAN_PROCFG_DIR}/tran_benchflag_config.cfg

#add by 20190617
PRODUCT_BENCHFLAG_LID=AP_CFG_REEB_PRODUCT_BENCHFLAG_LID
PRODUCT_BENCHFLAG_INFO_NOTE_START=“for cust BENCHFLAG_LID 20190617 start”
PRODUCT_BENCHFLAG_INFO_NOTE_END="for cust BENCHFLAG_LID 20190617 end

function is_project_disable()
{
//………//省略
local lid_type=“”
if [ 2="2 = "2="{MEM_TRACE_INFO_LID}" ] ; then
lid_type=“disable_mem_trace”
elif [ 2="2 = "2="{PRODUCT_BENCHFLAG_LID}" ] ; then
lid_type=“disable_product_benchflag”
fi
//………//省略

#add by 20190617
function config_product_benchflag_lid()
{
echo “PRODUCT_BENCHFLAG Config Start”
is_project_disable “TRANPROJECTNAME""{TRAN_PROJECT_NAME}" "TRANP​ROJECTN​AME""{PRODUCT_BENCHFLAG_LID}”
local project_state=?isbomdisable"? is_bom_disable "?isb​omd​isable"{TRAN_BOM_NAME}" “PRODUCTBENCHFLAG"localbomstate={PRODUCT_BENCHFLAG}" local bom_state=PRODUCTB​ENCHFLAG"localboms​tate=?
local is_need_config=”"

     if [ ${bom_state} -eq 0 ] ; thenis_need_config="yes"elif [ ${bom_state} -eq 1 ] ; thenis_need_config="no"elseif [ ${project_state} -eq 1 ] ; thenis_need_config="no"elseis_need_config="yes"fifiif [ ${is_need_config} = "yes" ] ; thenecho "current project/bom is need config"enable_proinfo_feature "${PRODUCT_BENCHFLAG_MACRO}"config_lid "${PRODUCT_BENCHFLAG_LID}" "${TRAN_BENCHFLAG_CONFIG_FILE}"echo "PRODUCT_BENCHFLAG Config End"return 0elsedisable_proinfo_feature "${PRODUCT_BENCHFLAG_MACRO}"clear_old_config "${PRODUCT_BENCHFLAG_LID}"echo "project don't need config"return 1fi

}

echo -e “\n================ Proinfo LID Config Start =="
#config_mem_trace_lid
config_product_benchflag_lid
#config_lid
echo -e " Proinfo LID Config End ==================\n”

3.6 Midtest上层接口读写方法说明

上层读取这个结构体在O和N版本上不同,在O版本上使用byname的方式,只需给定路径,比如O版本的直接读取路径:/vendor/nvdata/APCFG/APRDEB/PRODUCT_BENCHFLAG

而在N版本采用获取属性值的方式来读取这个分区,为了兼容,我们需要保留这种方式。在build/tools/buildinfo.sh中添加属性值:

echo “ro.probenchflag.lid=77”

(#ro. probenchflag.lid该属性值需要不同平台check,确认方法:

vendor\mediatek\proprietary\custom{projectname} \cgen\inc\Custom_NvRam_LID.h文件中,查找枚举类型CUSTOM_CFG_FILE_LID内的AP_CFG_REEB_PRODUCT_BENCHFLAG_LID的枚举值。)

build / tools/buildinfo.sh

#BSP:modify start
echo “ro.proinfo.lid=61”
if [ $MTK_PLATFORM == “mt6761” ] ; then
echo “ro.probenchflag.lid=77”
elif [ $MTK_PLATFORM == “mt6765” ] ; then
echo “ro.probenchflag.lid=78”
fi
echo “ro.proinfo.limit_app_status =816”
echo “ro.proinfo.restore_factory_set =817”
echo “ro.proinfo.enable_factory=818”
echo “ro.proinfo.skip_oobe=819”
echo “ro.proinfo.limit_app_status_1 =820”
echo “ro.proinfo.uninstall=821”
echo “ro.proinfo.auto_shutdown=830”
echo “ro.proinfo.monkey_test=831”
echo “ro.proinfo.android_id=832”
echo “ro.proinfo.cam_multiparameter =944”
echo “ro.proinfo.demophone =945”
echo “ro.proinfo.activationtime=946”
echo “ro.proinfo.age_flag =849”
echo “ro.proinfo.activationstatus =950”
echo “ro.proinfo.usbdebug=951”
echo “ro.proinfo.midtest=952”
#BSP: add end

  1. 提交链接

4.1. http://192.168.10.48/#/c/MTK_CODE/alps/vendor/mediatek/proprietary/factory/+/18210/

4.2. http://192.168.10.48/#/c/tran_projects/+/18212/

4.3. http://192.168.10.48/#/c/MTK_CODE/alps/vendor/mediatek/proprietary/external/nvram/+/18209/

4.4. http://192.168.10.48/#/c/MTK_CODE/platform/build/+/12001/

4.5. http://192.168.10.48/#/c/MTK_CODE/alps/vendor/mediatek/proprietary/hardware/meta/+/18207/

  1. 测试方法

5.1 SP META连上手机,读取AP_CFG_REEB_PRODUCT_BENCHFLAG_LID这一项,随意修改里面的内容,再保存到手机。然后用flashtool回读出proinfo分区内容,16进制打开观察META工具手动修改的值是否保存了。

5.2 TPS测试ATA成功后,回读proinfo分区或者SP META读出AP_CFG_REEB_PRODUCT_BENCHFLAG_LID这项内容,观察是否有保存测试结果

5.3 TPS工具执行PSN脚本成功后,回读proinfo分区或者SP META读出AP_CFG_REEB_PRODUCT_BENCHFLAG_LID这项内容,观察是否有保存测试结果

附件:ConfigProinfo.rar

[A1]写入标记位时间,即测试时间

[A2]测试站序号

[A3]0 FAIL,1 PASS, 3 BREAK 测试开始,但未完成

[A4]测试站名与MES一致

[A5]预留30个测试站

[A6]当前记录的测试站个数,方便解析

MTK平台产线生产标记位功能相关推荐

  1. 最新功能 | 飞书推出“线上办公室”功能,助力企业开启无压力远程实时高效协作

    为解决企业节后远程协作办公痛点,飞书"线上办公室"功能应运而生,"线上办公室"通过实时语音频道的方式,高度还原办公室工作.沟通场景,帮助企业和团队之间提升远程协 ...

  2. PHP 织梦 帝国那个好,帝国、PHPCMS及织梦对比(十):推荐位功能

    网站中发布的文章除了需要按时间.栏目分类.类别调用外,往往需要根据编辑的推荐进行不同的调用,那么CMS自然少不了推荐位功能.一般推荐位的设计都有首页头条.首页幻灯焦点.首页推荐.栏目页推荐.列表页推荐 ...

  3. Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方

    Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方 如果你想修改MTK的AAL自动背光调整相关的内容,那么根据情况,可能需要涉及如下文件: 这是Android L版本的 ...

  4. Android P 9.0 MTK平台 增加以太网静态IP功能

    前言 朋友们,最近又开始搞 Android P了,同样的以太网静态 IP 是少不了的功能,今天我们就开始来整一下.之前弄6.0 和 8.1 的都 ok 了. 没想到 9.0 改动还是略微有点大的.来来 ...

  5. 【专题5: 硬件设计】 之 【16.二极管/三极管的钳位功能】

    希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...

  6. php足疗预约,足浴养生管理系统轻松实现各种线上预约功能?

    越来越多的人开始注重养生,不仅是因为工作压力,也是由于人们开始注重自身健康,毕竟革命需要本钱,花钱去做一次足疗.足浴换得身心的短暂修复,成为了许多人的首选,所以传统足疗足浴行业面临新的消费人群,以及消 ...

  7. XCTF-攻防世界CTF平台-Reverse逆向类——56、tar-tar-binks(Mac平台下的64位动态链接共享库.dylib逆向)

    目录标题 一.解压缩 二.查看文件 三.分析程序 四.程序主要逻辑: 五.逆向思路: 步骤一: 步骤二: 六.解密代码: 题目提供了两个文件flag.tar和libarchive.dylib 一.解压 ...

  8. 云台限位功能的作用?

    问题:云台限位功能的作用? 答案: 云台有水平.垂直的限位栓. 云台分别由两个微动开关实现限位功能,当转动角度达到预先设定的限位栓时, 微动开关动作切断电源,云台停止转动.

  9. php 工行线上pos,工行推出新版融e购移动端 增线上POS功能

    工商银行电商平台"融e购"新版移动客户端已于7月20日正式上线.新版移动客户端对原有的两百余项功能点进行了优化升级,让客户可以在移动端享受更加便捷和智能化的购物体验. 据了解,工商 ...

最新文章

  1. 监管AI?吴恩达跟马斯克想到一块去了
  2. 【Python学习】 - Pandas学习 sort_value( ),sort_index( )排序函数的区别与使用
  3. 批量生成6位数字_太准了,你是Excel高手or小白看这6个操作就知道了
  4. 装箱与拆箱的概念及意义
  5. 【180620】小人物走路、奔跑的VC++游戏特效
  6. SQL:查询各科成绩前三名
  7. Syntax error: ( unexpected (expecting fi) ubuntu上sh脚本报错解决办法
  8. 乔布斯斯坦福大学演讲英文原文
  9. 现在润新加坡是个好主意吗?
  10. 【达梦数据库DM8】DM8基本操作及DCA考试感悟分享
  11. linux figlet 制作 banner
  12. 【微信小程序】本地服务页面案例实现
  13. java集成kettle 9.2.0开发
  14. centos 6.5安装步骤
  15. 1.在表格中操作时间,对时间格式转化,2.自定义规则验证身份证号
  16. Docker上手系列:Docker入门hello world
  17. uni-app - 多图片预加载解决方案
  18. 【分类】DWI将每个个体处理到链接矩阵之后做组分析的几个方法
  19. fopen的相关知识
  20. 最简操作系统内核HelloOS

热门文章

  1. 关于cv::warpaffine函数
  2. JS中终止函数执行的代码
  3. 阿里云国际版两个ECS云服务器之间的迁移教程
  4. 9 摄像头视频实时传输
  5. 《编译原理-龙书》练习第2章
  6. 分布式锁的实现【转载】
  7. 邀请函首页制作过程介绍
  8. mysql 一个月以前_mysql查询昨天 一周前 一月前 一年前的数据
  9. 多个微信服务号对接一个微信商户号流程
  10. react手机端项目注意点,ant design-mobile框架