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

📄 rtl8139config.c

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/************************************************************************
* 版权所有 (C)2003, 深圳市中兴通讯股份有限公司。
* 
* 文件名称: rtl8139Config.c
* 文件标识: 
* 内容摘要: 提供对8139的各种配置函数
* 其它说明: 暂无
                 
* 当前版本: V1.0
* 作    者: 邹同亮
* 完成日期: 2003年1月11日
* 
* 修改记录1:增加了读写8139寄存器和Descriptor的函数,并加了注释
*    修改日期:2003-5-20
*    版 本 号:
*    修 改 人:
*    修改内容: 
* 修改记录2:…
************************************************************************/
#include "vxWorks.h"
#include "muxlib.h"
#include "etherLib.h"
#include "end.h"
#include "endLib.h"
#include "ifLib.h" 
#include "ipProto.h" 

#include "rtl8139Config.h" 
#include "rtlcpp.h" 


IMPORT STATUS ipDetach(int unit, char * pDevice );
IMPORT void netPoolShow(NET_POOL_ID pNetPool);


/************************************************************************
* 函数名称: Set8139DeviceNum
* 功能描述: 初始化8139对应的资源表入口
* 输入参数: unit:    	网口的设备号,如rtl0的0  
*			 pciBus:	PCI总线号  
*			 pciDevice:网口PCI设备号
*			 pciFunc:	网口PCI功能号
* 输出参数: 无
* 返 回 值: OK:    加载成功
            ERROR: 加载不成功            
* 其它说明: 无
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/12/24    V1.0       汪康宏          创建
* 2003/03/28    V1.01      邹同亮          设置前先判断是否存在
************************************************************************/
STATUS Set8139DeviceNum(int unit, UINT32  pciBus, UINT32 pciDevice, UINT32  pciFunc)
{
    UINT32 		membaseCsr;  /* 网口内存空间基地址 */
    UINT32 		iobaseCsr;	 /* 网口IO空间基地址 */
    UINT16	    deviceId;    /* 设备类型号 */
    char 		irq;         /* 网口中断向量号 */
	
	/* 填写PCI设备表 */				
	pRsrc [unit] = rtl81x9PciResrcs + unit; 
				
	pRsrc [unit]->pciBus    = pciBus;
	pRsrc [unit]->pciDevice = pciDevice;
	pRsrc [unit]->pciFunc   = pciFunc;
				
	
    UnitNum++;
    needScan8139 = 0;    
    
	pciConfigInWord (pciBus, pciDevice, pciFunc, PCI_CFG_DEVICE_ID, &deviceId);
	if ((RTL_DEVICEID_8129 != deviceId) &&	(RTL_DEVICEID_8139 != deviceId))
	{
		return(ERROR);		
	}	
	
	pRsrc [unit] = rtl81x9PciResrcs + unit;		
	
	
	/* 获得网口PCI的内存基地址、IO基地址、中断向量号 */	
	pciConfigInLong (pRsrc[unit]->pciBus, 
		pRsrc[unit]->pciDevice, 
		pRsrc[unit]->pciFunc,
		PCI_CFG_BASE_ADDRESS_0, &iobaseCsr);
	
	pciConfigInLong (pRsrc[unit]->pciBus, 
		pRsrc[unit]->pciDevice, 
		pRsrc[unit]->pciFunc,
		PCI_CFG_BASE_ADDRESS_1, &membaseCsr);
	
	pciConfigInByte (pRsrc[unit]->pciBus, 
		pRsrc[unit]->pciDevice, 
		pRsrc[unit]->pciFunc,
		PCI_CFG_DEV_INT_LINE, &irq);	
	
	membaseCsr   &= PCI_MEMBASE_MASK;
	iobaseCsr    &= PCI_IOBASE_MASK;
	
	/* 填写到资源表 */	
	pRsrc[unit]->membaseCsr   = membaseCsr;
	pRsrc[unit]->iobaseCsr    = iobaseCsr;
	pRsrc[unit]->irq          = irq;
	pRsrc[unit]->irqvec       = irq;    
	
	
	/* 使能内存空间和IO空间映射 */	
	pciConfigOutWord (	pRsrc[unit]->pciBus, 
		pRsrc[unit]->pciDevice, 
		pRsrc[unit]->pciFunc,
		PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE |
		PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE);
	
	/* 禁止睡眠模式 */	
	pciConfigOutWord (pRsrc[unit]->pciBus, 
		pRsrc[unit]->pciDevice, 
		pRsrc[unit]->pciFunc, 
		PCI_CFG_MODE, 
		SLEEP_MODE_DIS);		
    
    return OK;
}	


/************************************************************************
* 函数名称: init8139net
* 功能描述: 加载8139网口
* 输入参数: unit:    	网口的设备号,如rtl0的0  
*			 pciBus:	PCI总线号  
*			 pciDevice:网口PCI设备号
*			 pciFunc:	网口PCI功能号
*			 clusterNum:网口缓冲区大小,缺省值为2000
* 输出参数: 无
* 返 回 值: OK:    加载成功
            ERROR: 加载不成功            
* 其它说明: 无
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/12/24    V1.0        邹同亮          创建
************************************************************************/
STATUS  init8139net(int unit,   UINT32  pciBus, UINT32 pciDevice, UINT32  pciFunc, UINT32 clusterNum)
{
    void *pInitC;
 
 	/* 初始化8139对应的资源表入口 */
 	if(Set8139DeviceNum(unit, pciBus, pciDevice, pciFunc) !=OK)
 	{
 		return ERROR;
 	}  
  	g_ul8139ClusterNum = clusterNum;
  	
  	/* 加载8139设备到mux并启动之 */
    pInitC = (void *)muxDevLoad(unit,
                                sysRtlcpEndLoad,
                                "",
                                1, NULL);
    if (pInitC == NULL)
    {
        printf("muxLoad failed!\n");
        return ERROR;
    }
    else
    {
        
        if (muxDevStart(pInitC) != OK)
        {
            printf("muxDevStart failed!\n");
            return ERROR;
        }
    } 
	return OK;
}

	
/************************************************************************
* 函数名称:  Get8139MacAddr
* 功能描述:  用于获得8139的mac地址
* 输入参数: unit:    网口的设备号,如rtl0的0            
* 输出参数: pucAddr: 用于传出MAC地址.为6个字节的数组,如0x00,0x01,0xaf,0x04,
            0xb,0x16
* 返 回 值: OK:    成功
            ERROR: 不成功            
* 其它说明: 无
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/12/24   V1.0        马书宇          创建
************************************************************************/
STATUS Get8139MacAddr(int unit, unsigned char * pucAddr)
{
	END_OBJ  *FindEnd;
	char NetDevice[5] = "rtl";
	
	FindEnd = endFindByName(NetDevice,unit);
	if(FindEnd == NULL)
	{
		printf("endFindByName error\n");
		return (ERROR);
	}
	if((*(FindEnd->pFuncTable->ioctl))(FindEnd->devObject.pDevice, EIOCGADDR, pucAddr) == ERROR)
	{
		printf("GetNetMac error\n");
		return (ERROR);
	}
	return (OK);
}


/************************************************************************
* 函数名称:  Set8139MacAddr
* 功能描述:  用于动态修改8139的mac地址
* 输入参数: unit:    网口的设备号,如rtl0的0
            pucAddr: 用于传入MAC地址.为6个字节的数组,如0x00,0x01,0xaf,0x04,
             0xb,0x16
* 输出参数: 无
* 返 回 值: OK:    成功
            ERROR: 不成功            
* 其它说明: 修改网口MAC地址之前,必须保存当前掩码和IP地址,卸掉协议栈,
            修改之后,再装载协议栈,恢复原来地掩码和IP地址
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/12/24   V1.0        马书宇          创建
************************************************************************/
STATUS Set8139MacAddr(int unit, unsigned char * pucAddr)
{
	END_OBJ *FindEnd;
	char  IpAddress[40];
	int NetMask[2];	
	char NetDevice[4] = "rtl";
	char DeviceName[4] = "rtl";
	
	NetDevice[3] = unit + 0x30;
	
	/* 判断网口是否存在 */
	FindEnd = endFindByName(DeviceName, unit);
	if(FindEnd == NULL)
	{
		printf("endFindByName error\n");
		return (ERROR);
	}
	
	/* 修改前先保存一些IP层信息,为修改后恢复用 */
	if(ifMaskGet(NetDevice, NetMask) == ERROR)
	{
		printf("ifMaskGet error\n");
		return (ERROR);
	}
	if(ifAddrGet(NetDevice, IpAddress) == ERROR)
	{
		printf("ifAddrGet error\n");
		return (ERROR);
	}
	if(ipDetach(unit, DeviceName) == ERROR)
	{
		printf("ipDetach error\n");
		return (ERROR);
	}	
	
	/* 修改MAC地址 */
	if((*(FindEnd->pFuncTable->ioctl))(FindEnd->devObject.pDevice, EIOCSADDR, pucAddr) == ERROR)
	{
		printf("SetNetMac error\n");
		return (ERROR);
	}

	/* 恢复以前的设置 */
	if(ipAttach (unit, DeviceName) == ERROR)
	{
		printf("ipAttach error\n");
		return (ERROR);
	}
	
	if(ifMaskSet(NetDevice, *NetMask) == ERROR)
	{
		printf("ifMaskSet error\n");
		return (ERROR);
	}	

	if(ifAddrSet(NetDevice, IpAddress) == ERROR)
	{
		printf("ifAddrSet error, errno:%x\n",errno);		
		/* return (ERROR); */
	}
		
	return (OK);
}

/************************************************************************
* 函数名称:  Set8139MacWithoutIP
* 功能描述:  用于动态修改8139的mac地址
* 输入参数: unit:    网口的设备号,如rtl0的0
             pucAddr: 用于传入MAC地址.为6个字节的数组,如0x00,0x01,0xaf,0x04,
             0xb,0x16
* 输出参数: 无
* 返 回 值: OK:    成功
             ERROR: 不成功            
* 其它说明: 用于没有加vxWorks协议栈的网口的MAC地址修改
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2003/06/16   V1.0        邹同亮          创建
************************************************************************/
STATUS Set8139MacWithoutIP(int unit, unsigned char * pucAddr)
{
	END_OBJ * FindEnd;
	char  IpAddress[40];
	int NetMask;		
	char DeviceName[4] = "rtl";
	char NetDevice[4] = "rtl";
	
	NetDevice[3] = unit + 0x30;
	
	/* 判断网口是否存在 */
	FindEnd = endFindByName(DeviceName, unit);
	if(FindEnd == NULL)
	{
		printf("endFindByName error\n");
		return (ERROR);
	}	
	
	/* 修改MAC地址 */
	if((*(FindEnd->pFuncTable->ioctl))(FindEnd->devObject.pDevice, EIOCSADDR, pucAddr)==ERROR)
	{
		printf("SetNetMac error\n");
		return (ERROR);
	}		
	return (OK);
}

/************************************************************************
* 函数名称: writeethead8139

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -