OK6410不能更改MAC的解决办法

特此声明:转载的,不知道能不能行,大家可以尝试一下。
最近有项目需要使用ARM11,就选择了OK6410的硬件平台,这个平台很好,可安装WINCE和linux,由于这两套系统都比较熟悉,还是比较热衷与WINCE,感觉这个WINCE600系统功能较WINCE500有很大提升,最后也就使用WINCE600了。
在项目中需要配置网卡的MAC,尝试通过注册表进行修改,但测试后发现不行,后来上网搜索了一编,按照别人的提示重编译,没有效果,看来还得研究研究驱动了。

后来咨询厂家,没有得到确切回复,没办法,只能跟踪。

好在函数名称比较容易理解,便使用串口调试打印log,终于一步一步跟踪,发现了问题的所在,经过修正代码,改正了错误,最终MAC可以通过国注册表修改了。通过此次修改,对网络的驱动有了初步的认识,但也仅仅有了概念上的了解,更深层的不准备花时间了,毕竟需要开发的机会不多,也没必要。

虽然改正了,但是感觉和原来的代码没有本质上的改正,待时间充裕再仔细研究研究,多亏了WINCE500DM9000的源码,在他的基础上才发现解决的办法。

 

改动后发现本质并没有太大调整,确切的说,并不知道后该的程序就好使,未发现原版本MAC修改不成的问题,也就集中精力查找了一下,经过打印log的方式,终于了解了问题的所在。

就是在运行中,

m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]]

的数据被EDeviceLoadEeprom函数意外篡改了,里面的数恢复成固定数据了,DeviceReadEeprom就是完成填充默认数据的过程,新增了变量就不会改变。所以就解决了这个问题。

也可改动DeviceReadEeprom里的语句,返回真确的数据即可。

还可注视掉EDeviceLoadEeprom内的功能,好像不行,因为它参与计算了。可讲

     for(n=0;n<(DIM(m_szEeprom)/sizeof(EEPROM_DATA_TYPE));n++,pcurr++)

     {

         *pcurr = DeviceReadEeprom(n);

 

     } // of for offset n

    

注视掉即可。

 

void NIC_DEVICE_OBJECT::EDeviceLoadEeprom(void)

{

     int      n;

     EEPROM_DATA_TYPE   *pcurr=(EEPROM_DATA_TYPE*)&m_szEeprom[0];

 

     for(n=0;n<(DIM(m_szEeprom)/sizeof(EEPROM_DATA_TYPE));n++,pcurr++)

     {

         *pcurr = DeviceReadEeprom(n);

 

     } // of for offset n

    

     DeviceCalculateCRC32(&m_szEeprom[0],DIM(m_szEeprom)-2);

}

U16  C_DM9000::DeviceReadEeprom(

     U32      uWordAddress)

{

//----------------------------------------------  

     //U16 eeprom[] = { 0x1122,0x3344,0x5566,0x5445,0x0a46,0x9000,0x01e7,0x4180};

  //U16 eeprom[] = { 0xaae0,0xdec8,0x5163,0x5445,0x0a46,0x9000,0x01e7,0x4180};

  U16 eeprom[] = { 0xaae0,0xdec8,0x5163};

     if( uWordAddress < sizeof( eeprom ) )

         return eeprom[uWordAddress];

     else

         return 0;

//----------------------------------------------

}

 

PU8      NIC_DEVICE_OBJECT::DeviceMacAddress(

     PU8      ptrBuffer)

{

     if(!ptrBuffer) return ptrBuffer;

 

     PU16 pcurr=(PU16)&m_szEeprom[

         m_szEepromFormat[EID_MAC_ADDRESS]];

     //*(PU16)ptrBuffer = *pcurr++;

     //*(PU16)(ptrBuffer+2) = *pcurr++;

     //*(PU16)(ptrBuffer+4) = *pcurr++;

 

     //RETAILMSG(1,(TEXT( "NdisReadNetworkAddress =  0x%x  0x%x  0x%x\n"), *(PU16)ptrBuffer,

     //                                                                             *(PU16)(ptrBuffer+2),

     //                                                                             *(PU16)(ptrBuffer+4)));

 

     //RETAILMSG(1,(TEXT("\n\n\n\n---------------------------------NdisReadNetworkAddress---------4-------------\n\n\n\n")));

 

     //            RETAILMSG(1,(TEXT( "NdisReadNetworkAddress =  0x%x  0x%x  0x%x  0x%x  0x%x  0x%x\n"),     m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]+0],

     //                                                                                                              m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]+1],

     //                                                                                                              m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]+2],

     //                                                                                                              m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]+3],

     //                                                                                                              m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]+4],

     //                                                                                                              m_szEeprom[m_szEepromFormat[EID_MAC_ADDRESS]+5]));

 

     //        RETAILMSG(1,(TEXT("\n\n\n\n---------------------------------NdisReadNetworkAddress---------11-------------\n\n\n\n")));

    

     pcurr = (PU16)&SoftMac[0];

     *(PU16)ptrBuffer = *pcurr++;

     *(PU16)(ptrBuffer+2) = *pcurr++;

     *(PU16)(ptrBuffer+4) = *pcurr++;

 

     //RETAILMSG(1,(TEXT( "NdisReadNetworkAddress =  0x%x  0x%x  0x%x\n"), *(PU16)ptrBuffer,

     //                                                                             *(PU16)(ptrBuffer+2),

     //                                                                             *(PU16)(ptrBuffer+4)));

 

     //RETAILMSG(1,(TEXT("\n\n\n\n---------------------------------NdisReadNetworkAddress---------5-------------\n\n\n\n")));

 

     return ptrBuffer;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值