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

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 “ T R A N P R O J E C T N A M E " " {TRAN_PROJECT_NAME}" " TRANPROJECTNAME""{PRODUCT_BENCHFLAG_LID}”
local project_state= ? i s b o m d i s a b l e " ? is_bom_disable " ?isbomdisable"{TRAN_BOM_NAME}" “ P R O D U C T B E N C H F L A G " l o c a l b o m s t a t e = {PRODUCT_BENCHFLAG}" local bom_state= PRODUCTBENCHFLAG"localbomstate=?
local is_need_config=”"

     if [ ${bom_state} -eq 0 ] ; then
             is_need_config="yes"
     elif [ ${bom_state} -eq 1 ] ; then
             is_need_config="no"
     else
             if [ ${project_state} -eq 1 ] ; then
                      is_need_config="no"
             else
                      is_need_config="yes"
             fi
     fi

     if [ ${is_need_config} = "yes" ] ; then
             echo "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 0
     else
             disable_proinfo_feature "${PRODUCT_BENCHFLAG_MACRO}"
             clear_old_config "${PRODUCT_BENCHFLAG_LID}"
             echo "project don't need config"
             return 1
     fi

}

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]当前记录的测试站个数,方便解析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值