近项目要求在工具中添加一个校准标志位,通过ATE工具写入射频参数后应用工具中能显示已校准
在MTK得工厂测试中也是有读取Barcode得,里面有两个方法
一 通过读取NvRam来获取校准标志位
int get_barcode_from_nvram(char *barcode_result)
{
int read_nvram_ready_retry = 0;
F_ID fid;
int rec_size = 0;
int rec_num = 0;
int barcode_lid = AP_CFG_REEB_PRODUCT_INFO_LID;
PRODUCT_INFO *barcode_struct;
bool isread = true;
char nvram_init_val[128] = {0};
LOGD(TAG "Entry get_barcode_from_nvram");
if(barcode_result == NULL)
{
return 0;
}
while(read_nvram_ready_retry < MAX_RETRY_COUNT)
{
read_nvram_ready_retry++;
property_get("service.nvram_init", nvram_init_val, NULL);
if(strcmp(nvram_init_val, "Ready") == 0)
{
break;
}
else
{
usleep(500*1000);
}
}
if(read_nvram_ready_retry >= MAX_RETRY_COUNT)
{
LOGD(TAG "Get nvram restore ready failed!");
return 0;
}
barcode_struct= (PRODUCT_INFO *)malloc(sizeof(PRODUCT_INFO));
if(barcode_struct == NULL)
{
return 0;
}
fid = NVM_GetFileDesc(barcode_lid, &rec_size, &rec_num, isread);
if(fid.iFileDesc < 0)
{
LOGD(TAG "fid.iFileDesc < 0");
return 0;
}
if(rec_size != read(fid.iFileDesc, barcode_struct, rec_size))
{
free(barcode_struct);
return 0;
}
if(strlen((const char *)barcode_struct->barcode) > 0)
{
strcpy(barcode_result, (const char *)barcode_struct->barcode);
}
else
{
strcpy(barcode_result, "unknown");
}
free(barcode_struct);
if(!NVM_CloseFileDesc(fid))
{
return 0;
}
LOGD(TAG "The size of barcode_struct:%d\n", sizeof(barcode_struct));
LOGD(TAG "Barcode is %s\n", barcode_result);
return 1;
}
#endif
二 通过modem通信来读取
int getBarcode(Connection& modem, char *result)
{
const int BUF_SIZE = 128;
char barcode[BUF_SIZE]={0};
int len = 0 ;
if(ER_OK != modem.QueryModemRevision(5, barcode))
return -1 ;
LOGD("Barcode %s",barcode);
strcpy(result,barcode);
if(strlen(result) <= 0)
{
strcpy(result, "unknown");
}
LOGE("getBarcode result = %s\n", result);
return 0;
}
通过打LOG看到工厂模式里是通过Modem来读取Barcode,然后我就自己写了下NvRam上层读取,读出来得都是0,说明校准时并未向NvRam里写
后来在MTK网上在看到如下说明
如何获取手机SN (Serial Number)
[SOLUTION]
一、KK版本之前
KK之前由"phone" service提供接口: String getSN()
二、KK版本
KK版本是已经搬到"phoneEx" service中了,名称是: String getSerialNumber()
KK版上使用范例:
mTelEx =
ITelephonyEx.Stub.asInterface(ServiceManager.getService(“phoneEx”));
String SN = mTelEx. getSerialNumber();
或者也可以直接使用SystemProperties.get(“gsm.serial”);来获得;
三、L版本/L版本以后
L版本/L版本以后,未提供API接口给上层来调用;
请直接获取"gsm.serial"系统属性的值: SystemProperties.get(“gsm.serial”);
试了一下读取gsm.serial值如下
101519_144336 10
1
后面10就是标志位
不过应用层无法直接使用SystemProperties这个类,在系统中有hide标识,不过可以通过反射来操作
public static String get(String key) {
String result="";
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class);
result=(String)get.invoke(c, key);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
/**
* Set the value for the given key.
* @throws IllegalArgumentException if the key exceeds 32 characters
* @throws IllegalArgumentException if the value exceeds 92 characters
*/
public static void set(String key, String val) {
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method set = c.getMethod("set", String.class,String.class);
set.invoke(c, key,val);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}