基于WINCE6.0系统的I.MX515和S3C2451 UUID不一样问题的解决

1.     获取UUID的方法

同一个APP,调用GetDeviceUniqueId()获取UUID,传递的应用参数一样。

 

调用GetDeviceUniqueID(),最后会调用到底层的OALIoCtlHalGetDeviceInfo()--->GetUUID()--->OALArgsQuery(OAL_ARGS_QUERY_UUID)

在OALArgsQuery函数中把下面的值传递出去

pData = &pArgs->uuid;

pArgs->uuid指向的值在OEMInit()函数中会调用OALArgsInit((BSP_ARGS*) IMAGE_SHARE_ARGS_UA_START)函数来初始化化,代码如下:

 

VOID OALArgsInit(BSP_ARGS* pArgs)
{
   OALMSG(1,(TEXT("+OALArgsInit()\r\n")));
   // Check the BSP Args area
   //
   if (pArgs->header.signature  !=OAL_ARGS_SIGNATURE ||
       pArgs->header.oalVersion != OAL_ARGS_VERSION   ||
       pArgs->header.bspVersion != BSP_ARGS_VERSION)
    {
       S3C2450_IOPORT_REG *v_IOPRegs;
       DWORD count, code, j;
       UCHAR d;
 
       // Zero out the current contents of the structure
       memset(pArgs, 0, sizeof(BSP_ARGS));
 
       // Setup header
       pArgs->header.signature = OAL_ARGS_SIGNATURE;
       pArgs->header.oalVersion = OAL_ARGS_VERSION;
       pArgs->header.bspVersion = BSP_ARGS_VERSION;
 
       //Set-up dummy uuid for SMDK2450. Actually, uuid can be acquired fromNAND id.
       pArgs->uuid[0] = (UCHAR)0x00;
       pArgs->uuid[1] = (UCHAR)0x11;
       pArgs->uuid[2] = (UCHAR)0x22;
       pArgs->uuid[3] = (UCHAR)0x33;
       pArgs->uuid[4] = (UCHAR)0x44;
       pArgs->uuid[5] = (UCHAR)0x55;
       pArgs->uuid[6] = (UCHAR)0x66;
       pArgs->uuid[7] = (UCHAR)0x77; 
       pArgs->uuid[8] = (UCHAR)0x88;
       pArgs->uuid[9] = (UCHAR)0x99;
       pArgs->uuid[10] = (UCHAR)0xaa;
       pArgs->uuid[11] = (UCHAR)0xbb;
       pArgs->uuid[12] = (UCHAR)0xcc;
       pArgs->uuid[13] = (UCHAR)0xdd;
       pArgs->uuid[14] = (UCHAR)0xee;
       pArgs->uuid[15] = (UCHAR)0xff;
 
       ………..
 
       // Can Add code for cleanboot, hiveclean, formatpartion
 
       OALMSG(1,(TEXT("Arguments area is initialized.\r\n")));
    }
   else
    {
       RETAILMSG(1,(TEXT("Arguments area has some values.\r\n")));
    }
   OALMSG(1,(TEXT("-OALArgsInit()\r\n")));
 
   return;
}

2.     GetDeviceUniqueId()获取的UUID不一样

客户要求我们采用CPU为S3C2451的设备调用GetDeviceUniqueId()获取的ID是一样的,现在我们这个设备做了升级,改为采用飞思卡尔的CPU I.MX515,他们也要求升级后的设备取出的ID和S3C2451的一样。

 

S3C2451和I.MX515上面的实现是一样的,但实际上S3C2451平台下读取出来的是C26….,在I.MX515平台上读出来的是8f9…,

 

3.     问题的解决

后来一时找不到原因,就在各自平台的OALArgsQuery()打印uuid的值,发现S3C2451的都是0,但I.MX515平台上的却不全是,下面的信息是I.MX515平台的。

OALArgsQuery() pArgs->uuid[0]=0x0
OALArgsQuery() pArgs->uuid[1]=0x0
OALArgsQuery() pArgs->uuid[2]=0x0
OALArgsQuery() pArgs->uuid[3]=0x0
OALArgsQuery() pArgs->uuid[4]=0x0
OALArgsQuery() pArgs->uuid[5]=0x0
OALArgsQuery() pArgs->uuid[6]=0x0
OALArgsQuery() pArgs->uuid[7]=0x0
OALArgsQuery() pArgs->uuid[8]=0x0
OALArgsQuery() pArgs->uuid[9]=0x0
OALArgsQuery() pArgs->uuid[10]=0x0
OALArgsQuery() pArgs->uuid[11]=0x1
OALArgsQuery() pArgs->uuid[12]=0x8
OALArgsQuery() pArgs->uuid[13]=0x0
OALArgsQuery() pArgs->uuid[14]=0x8
OALArgsQuery() pArgs->uuid[15]=0x48

但是查看了整个BSP并没有看到有对uuid做这些初始化,为什么会有这不同的值呢?暂时还没有找出原因,

 

另外我们要注意,OALArgsInit()函数要对uuid做初始化,是要满足下面的条件,而这个就要注意在不同平台下的eboot或是OAL部分的设置了。

if (pArgs->header.signature  != OAL_ARGS_SIGNATURE ||
       pArgs->header.oalVersion != OAL_ARGS_VERSION   ||
       pArgs->header.bspVersion != BSP_ARGS_VERSION)

但为了解决这个问题,我在两个平台的代码中都重新初始化为0x00,如下:

for(i=0; i<16; i++)
       {
              pArgs->uuid[i]= (UCHAR)0x00;
       }

这样就确保调用GetDeviceUniqueId()在两个平台上获取UUID一样的问题了。

 

你可能感兴趣的:(基于WINCE6.0系统的I.MX515和S3C2451 UUID不一样问题的解决)