📄 rtl8139config.c
字号:
* 功能描述: 改8139MAC地址
* 输入参数: unit: 网口的设备号,如rtl0的0
* MacAddress[6]: MAC地址
* 输出参数: 无
* 返 回 值: OK: 加载成功
ERROR: 加载不成功
* 其它说明: 无
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 马书宇 创建
************************************************************************/
void WriteetHead8139(int unit,unsigned char MacAddress[6])
{
RTL81X9END_DEVICE FakeResources[1];
RTL81X9END_DEVICE *FakepReso;
unsigned short eeprom[3] = {0};
unsigned char enetAddr[6];
FakepReso = &FakeResources [0];
FakepReso->devAdrs = pRsrc[unit]->membaseCsr;
enetAddr[0] = MacAddress[0];
enetAddr[1] = MacAddress[1];
enetAddr[2] = MacAddress[2];
enetAddr[3] = MacAddress[3];
enetAddr[4] = MacAddress[4];
enetAddr[5] = MacAddress[5];
rtl81x9ReadEEPROM(FakepReso, (unsigned char*)eeprom, 0x7, 3, 0);
eeprom[0] = ((enetAddr[1]<<8)|enetAddr[0]);
eeprom[1] = ((enetAddr[3]<<8)|enetAddr[2]);
eeprom[2] = ((enetAddr[5]<<8)|enetAddr[4]);
rtl81x9WriteENABLE(FakepReso);
rtl81x9WriteEEPROM(FakepReso, (unsigned char*)eeprom, 0x7, 3, 0);
rtl81x9WriteDISABLE(FakepReso);
/* rtl81x9ReadEEPROM(FakepReso, (unsigned char*)eeprom, 0x7, 3, 0); */
}
#if 0
/************************************************************************
* 函数名称: Set8139DeviceNum
* 功能描述: 把配置文件写到8139带的EEPROM
* 输入参数: unit: 网口的设备号,如rtl0的0
* 输出参数: 无
* 返 回 值: OK: 加载成功
ERROR: 加载不成功
* 其它说明: 调试用
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 汪康宏 创建
************************************************************************/
void write8139DefaultConfig(int unit)
{
RTL81X9END_DEVICE FakeResources [1];
RTL81X9END_DEVICE *FakepReso;
unsigned char defaultConfig[80];
int i;
FILE *ptfp = NULL;
STATUS iRetVal;
ULONG dwFileSize =0;
unsigned char * pWrtBuff = defaultConfig;
unsigned char rdBuff[80], *pRdBuff;
pRdBuff = rdBuff;
bzero(pWrtBuff, sizeof(defaultConfig));
bzero(rdBuff, sizeof(rdBuff));
ptfp = fopen("/tgtsvr/8139.bit","rb");
if(NULL == ptfp)
{
printf("Can not open 8139 EEPROM file!\n");
return;
}
/* 将文件装载到RAM中 */
iRetVal = fread(rdBuff, 1, 64, ptfp);
if(iRetVal != dwFileSize)
{
printf("\nfile read error");
fclose(ptfp);
return;
}
fclose(ptfp);
for(i=0; i<64; i++)
{
pWrtBuff[i+1] = rdBuff[i];
pWrtBuff[i] = rdBuff[i+1];
i++;
}
FakepReso = &FakeResources [0];
FakepReso->devAdrs = pRsrc[unit]->membaseCsr;
rtl81x9WriteENABLE(FakepReso);
taskDelay(1);
rtl81x9WriteEEPROM(FakepReso, pWrtBuff, 0, 32, 0);
rtl81x9WriteDISABLE(FakepReso);
bzero(rdBuff, sizeof(rdBuff));
rtl81x9ReadEEPROM(FakepReso, pRdBuff, 0, 32, 0);
}
#endif
/************************************************************************
* 函数名称: sysChecki8139Loopback
* 功能描述: 8139的自环测试
* 输入参数: unit: 网口的设备号,如rtl0的0
* 输出参数: 无
* 返 回 值: 0: 成功
>0: 各种错误状态
* 其它说明: 先进入轮循环方式,发10包再接收10包,比较收发数据是否一致
* 修改日期: 版本号 修改人 修改内容
* -----------------------------------------------
* 2002/12/24 V1.0 邹同亮 创建
************************************************************************/
ULONG sysChecki8139Loopback(int unit)
{
USHORT wLen;
USHORT wTmp;
USHORT wBMCR; /* 存放老的BMCR寄存器值 */
M_BLK_ID pMblk; /* 发送包Mblk指针 */
M_BLK_ID pMblkR; /* 接收包Mblk指针 */
END_OBJ *FindEnd;/* 网口对应的END_OBJ */
CL_BLK_ID pClBlk;
char *pCluster;
char strSPacket[200],strRPacket[200]; /* 发送和接收数据缓冲区 */
ULONG dwTxConfig; /* 存放老的发送配置寄存器值 */
ULONG dwRet, dwRetValue = 0;
RTL81X9END_DEVICE *pDrvCtrl; /* 网口对应的控制块 */
/*
int iii;
*/
wLen = 64 ;
if(unit > 100)
{
printf("8139网口编号不能超过100\n");
return 1;
}
/* 初始化收发缓冲区 */
for( wTmp = 0 ; wTmp < 12 ; wTmp++ )
{
strSPacket[wTmp] = 0xff;
strRPacket[wTmp] = 0;
}
for( wTmp = 12 ; wTmp < 100; wTmp++)
{
strSPacket[wTmp] = 0;
strRPacket[wTmp] = 0;
}
strcpy(&strSPacket[12],"This is a Network test frame!");
/* 测试前先判断网口是否存在 */
FindEnd = endFindByName("rtl", unit);
if(FindEnd == NULL )
{
printf("找不到编号为%d的8139网口\n", unit);
return 1;
}
pDrvCtrl = FindEnd->devObject.pDevice;
if(pDrvCtrl == NULL )
{
printf("pDrvCtrl == NULL\n");
return 1;
}
/* 测试前先配置网口为自环和轮循方式 */
printf("\ni8139 loopback...\n");
rtl81x9Ioctl( pDrvCtrl, EIOCPOLLSTART, NULL);
dwTxConfig = rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_CONFIG, RTL_WIN_0);
wBMCR = rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0);
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, 0x2d00, RTL_WIN_0); /* 配置自环前先禁止网口的自动协商功能 */
rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_CONFIG, (dwTxConfig|0x00060000), RTL_WIN_0); /* 设置自环方式 */
taskDelay(50);
/* 清除已接收的数据 */
while(1)
{
pMblkR = mBlkGet(pDrvCtrl->end.pNetPool, M_DONTWAIT, MT_DATA);
if(pMblkR == NULL)
break;
if(rtl81x9PollReceive( pDrvCtrl , pMblkR ) == OK)
{
netMblkClChainFree(pMblkR);
}
else
{
netMblkFree(pDrvCtrl->end.pNetPool, pMblkR);
break;
}
}
/* 发10包数据 */
wTmp =0;
dwRet = 1;
do
{
pMblk = mBlkGet(pDrvCtrl->end.pNetPool, M_DONTWAIT, MT_DATA);
if(pMblk == NULL)
{
printf("error!\n i8139 can't alloc mblk !\n");
dwRetValue = 0xfe;
goto testEnd;
}
if((pClBlk = netClBlkGet (pDrvCtrl->end.pNetPool, M_DONTWAIT)) == NULL)
{
netMblkFree(pDrvCtrl->end.pNetPool, pMblk);
DRV_LOG(DRV_DEBUG_ERR,"Out of Cluster Blocks!\n", 1, 2, 3, 4,5, 6);
goto testEnd;
}
pCluster = netClusterGet(pDrvCtrl->end.pNetPool, pDrvCtrl->pClPoolId);
if (pClBlk == NULL)
{
netMblkFree(pDrvCtrl->end.pNetPool, pMblk);
netClBlkFree(pDrvCtrl->end.pNetPool, pClBlk);
DRV_LOG (DRV_DEBUG_POLL_TX, "Get tx buffer error\n", 1, 2, 3, 4, 5, 6);
goto testEnd;
}
netClBlkJoin (pClBlk, pCluster, wLen, NULL, 0, 0, 0);
netMblkClJoin (pMblk, pClBlk);
RTL_CACHE_INVALIDATE (pMblk->mBlkHdr.mData, wLen);
memcpy( pMblk->m_data, strSPacket, wLen );
pMblk->m_len = wLen;
pMblk->mBlkHdr.mFlags |= M_PKTHDR;
pMblk->mBlkPktHdr.len = pMblk->m_len;
dwRet = rtl81x9PollSend( pDrvCtrl , pMblk );
if(dwRet == OK )
{
printf("8139 Send Number %d frame correct! \n", wTmp+1);
}
else
{
printf("8139 send Number %d frame incorrect! \n", wTmp+1);
}
/*
if( (dwRet = rtl81x9PollSend( pDrvCtrl , pMblk ) ) != EAGAIN )
{
break;
}
*/
taskDelay(20);
wTmp++;
}while( wTmp < 10 );
/* 判断接收到的数据是否正确 */
wTmp =0;
do
{
pMblkR = mBlkGet(pDrvCtrl->end.pNetPool, M_DONTWAIT, MT_DATA);
if( pMblkR == NULL )
{
printf("error!\n i8139 can't alloc mblk !\n");
dwRetValue = 0x4;
goto testEnd;
}
pMblk->mBlkHdr.mLen = 100;
dwRet = rtl81x9PollReceive(pDrvCtrl, pMblkR);
if( dwRet == OK )
{
netMblkToBufCopy (pMblkR, &strRPacket[0], NULL);
netMblkClChainFree(pMblkR);
/*
printf("receive wLen is 0x%x\n",pMblkR->mBlkHdr.mLen);
for(iii=0;iii<pMblkR->mBlkHdr.mLen;iii++)
{
if(iii%16==0&&iii!=0)
printf("\n");
printf("%02x ",(int)*(pMblkR->mBlkHdr.mData+iii));
}
printf("\n");
*/
if( bcmp( strSPacket, strRPacket, wLen ) == 0 )
{
printf("8139 Recv Number %d frame correct! \n", wTmp+1);
dwRetValue = OK;
}
else
{
printf("8139 Recv Number %d frame incorrect! \n", wTmp+1);
dwRetValue = 2;
}
}
else
{
netMblkFree(pDrvCtrl->end.pNetPool, pMblkR);
printf("error!\n 8139 can't received frame !\n");
dwRetValue = 3 ;
break;
}
wTmp++;
}while(wTmp < 10);
/* 恢复测试前状态并返回测试结果 */
testEnd:
rtl81x9CsrWriteLong (pDrvCtrl, RTL_REGS_TX_CONFIG, dwTxConfig, RTL_WIN_0);
rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, wBMCR,RTL_WIN_0);
rtl81x9Ioctl( pDrvCtrl, EIOCPOLLSTOP, NULL );
taskDelay(100);
return dwRetValue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -