Android射频校准标志位(Barcode)

近项目要求在工具中添加一个校准标志位,通过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();
          }
          
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值