后来咨询厂家,没有得到确切回复,没办法,只能跟踪。
好在函数名称比较容易理解,便使用串口调试打印log,终于一步一步跟踪,发现了问题的所在,经过修正代码,改正了错误,最终MAC可以通过国注册表修改了。通过此次修改,对网络的驱动有了初步的认识,但也仅仅有了概念上的了解,更深层的不准备花时间了,毕竟需要开发的机会不多,也没必要。
虽然改正了,但是感觉和原来的代码没有本质上的改正,待时间充裕再仔细研究研究,多亏了WINCE500的DM9000的源码,在他的基础上才发现解决的办法。
改动后发现本质并没有太大调整,确切的说,并不知道后该的程序就好使,未发现原版本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;
}