MTK平台产线生产标记位功能
MTK平台产线生产标记位功能
- 背景描述
产线标记位用于记录待测物在每一个测试站的测试时间,测试站名,与测试结果。这些信息在离线的情况下帮助研发,质量,售后等人员了解手机在产线测试的各个情况,并进行追踪。对提高产线生产质量与管控有巨大的帮助。
- 设计思路
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模式下实现读写数据的接口。
- 代码实现
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}" "TRANPROJECTNAME""{PRODUCT_BENCHFLAG_LID}”
local project_state=?isbomdisable"? is_bom_disable "?isbomdisable"{TRAN_BOM_NAME}" “PRODUCTBENCHFLAG"localbomstate={PRODUCT_BENCHFLAG}" local bom_state=PRODUCTBENCHFLAG"localbomstate=?
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
- 提交链接
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/
- 测试方法
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平台产线生产标记位功能相关推荐
- 最新功能 | 飞书推出“线上办公室”功能,助力企业开启无压力远程实时高效协作
为解决企业节后远程协作办公痛点,飞书"线上办公室"功能应运而生,"线上办公室"通过实时语音频道的方式,高度还原办公室工作.沟通场景,帮助企业和团队之间提升远程协 ...
- PHP 织梦 帝国那个好,帝国、PHPCMS及织梦对比(十):推荐位功能
网站中发布的文章除了需要按时间.栏目分类.类别调用外,往往需要根据编辑的推荐进行不同的调用,那么CMS自然少不了推荐位功能.一般推荐位的设计都有首页头条.首页幻灯焦点.首页推荐.栏目页推荐.列表页推荐 ...
- Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方
Android L系统mtk平台下AAL自动背光调整服务亮度曲线调试需要涉及的地方 如果你想修改MTK的AAL自动背光调整相关的内容,那么根据情况,可能需要涉及如下文件: 这是Android L版本的 ...
- Android P 9.0 MTK平台 增加以太网静态IP功能
前言 朋友们,最近又开始搞 Android P了,同样的以太网静态 IP 是少不了的功能,今天我们就开始来整一下.之前弄6.0 和 8.1 的都 ok 了. 没想到 9.0 改动还是略微有点大的.来来 ...
- 【专题5: 硬件设计】 之 【16.二极管/三极管的钳位功能】
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路 原创不易,文章会持续更新 文章会同步到作者个人公众号上,感谢扫码关注 所有文章总目录:[嵌入式 无人机 电机控制 ...
- php足疗预约,足浴养生管理系统轻松实现各种线上预约功能?
越来越多的人开始注重养生,不仅是因为工作压力,也是由于人们开始注重自身健康,毕竟革命需要本钱,花钱去做一次足疗.足浴换得身心的短暂修复,成为了许多人的首选,所以传统足疗足浴行业面临新的消费人群,以及消 ...
- XCTF-攻防世界CTF平台-Reverse逆向类——56、tar-tar-binks(Mac平台下的64位动态链接共享库.dylib逆向)
目录标题 一.解压缩 二.查看文件 三.分析程序 四.程序主要逻辑: 五.逆向思路: 步骤一: 步骤二: 六.解密代码: 题目提供了两个文件flag.tar和libarchive.dylib 一.解压 ...
- 云台限位功能的作用?
问题:云台限位功能的作用? 答案: 云台有水平.垂直的限位栓. 云台分别由两个微动开关实现限位功能,当转动角度达到预先设定的限位栓时, 微动开关动作切断电源,云台停止转动.
- php 工行线上pos,工行推出新版融e购移动端 增线上POS功能
工商银行电商平台"融e购"新版移动客户端已于7月20日正式上线.新版移动客户端对原有的两百余项功能点进行了优化升级,让客户可以在移动端享受更加便捷和智能化的购物体验. 据了解,工商 ...
最新文章
- 监管AI?吴恩达跟马斯克想到一块去了
- 【Python学习】 - Pandas学习 sort_value( ),sort_index( )排序函数的区别与使用
- 批量生成6位数字_太准了,你是Excel高手or小白看这6个操作就知道了
- 装箱与拆箱的概念及意义
- 【180620】小人物走路、奔跑的VC++游戏特效
- SQL:查询各科成绩前三名
- Syntax error: ( unexpected (expecting fi) ubuntu上sh脚本报错解决办法
- 乔布斯斯坦福大学演讲英文原文
- 现在润新加坡是个好主意吗?
- 【达梦数据库DM8】DM8基本操作及DCA考试感悟分享
- linux figlet 制作 banner
- 【微信小程序】本地服务页面案例实现
- java集成kettle 9.2.0开发
- centos 6.5安装步骤
- 1.在表格中操作时间,对时间格式转化,2.自定义规则验证身份证号
- Docker上手系列:Docker入门hello world
- uni-app - 多图片预加载解决方案
- 【分类】DWI将每个个体处理到链接矩阵之后做组分析的几个方法
- fopen的相关知识
- 最简操作系统内核HelloOS