⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtl8139config.c

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
* 功能描述: 改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 + -