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

📄 rtl8139config.c

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
}


/************************************************************************
* 函数名称: SetRtl8139State
* 功能描述: 设置8139的各种状态
* 输入参数: unit:    网口的设备号,如rtl0的0 
*			 ucState   网口状态,见rtl8139Config.h中的宏定义        
* 输出参数: 无
* 返 回 值: OK:   成功
             ERROR:失败
* 其它说明: 仅供内部测试用
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/05/21    V1.0       邹同亮          创建
************************************************************************/
STATUS SetRtl8139State(int unit,unsigned char ucState)
{
    RTL81X9END_DEVICE 	*pDrvCtrl = NULL; 
    USHORT  wBMCR =0;
    ULONG	dwTxConfig =0;
    
    /* 判断网口是否存在,不存在返回 */
    pDrvCtrl = (RTL81X9END_DEVICE *)endFindByName("rtl", unit);
    if(pDrvCtrl == NULL )
    {    	
    	return ERROR;
    }
  
  	rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_INTR_MASK, 0x00, NONE);
  	dwTxConfig  = rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_CONFIG, RTL_WIN_0);  	
  	wBMCR =  rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0);
  	
  	/* 检查并配置8139为正常工作状态 */
  	if( ucState == RTL8139_STATE_NORM)
  	{  		
  		rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, wBMCR|0x3000, RTL_WIN_0);  /* 自动协商 */
    	rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_CONFIG, (dwTxConfig&0xfff9ffff), RTL_WIN_0); /* 非自环 */
    	rtl81x9CsrWriteWord	(pDrvCtrl, RTL_REGS_INTR_MASK, RTL_VALID_INTERRUPTS, NONE);
    	taskDelay(20);
    	return OK;
  	}
  	
  	rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, wBMCR&0xefff, RTL_WIN_0); /* 配置各种状态前先禁止网口的自动协商功能 */
  	wBMCR =  rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0);
  	
  	/* 检查并配置8139为自环状态 */
    if(ucState & RTL8139_STATE_LOOP)
    {	    	
    	rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_CONFIG, (dwTxConfig|0x00060000), RTL_WIN_0);
    	taskDelay(20);
    }    
    /* 检查并配置8139速度为100M */
    if(ucState & RTL8139_STATE_100M)
  	{	  		
  		/* 100M */
    	rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, (wBMCR|0x2100), RTL_WIN_0);    	    	    	
    }
    
    /* 检查并配置8139速度为10M */
    if(ucState & RTL8139_STATE_10M)
    {   
    	/* 10M */
    	rtl81x9CsrWriteWord(pDrvCtrl, RTL_REGS_MII_BMCR, (wBMCR&0xcfff), RTL_WIN_0);			    	    			
    }    
    
    taskDelay(10);
    
    rtl81x9CsrWriteWord	(pDrvCtrl, RTL_REGS_INTR_MASK, RTL_VALID_INTERRUPTS, NONE);

    return OK;
}

/************************************************************************
* 函数名称: Get8139Reg
* 功能描述: 打印8139的寄存器
* 输入参数: pDrvCtrl:网口设备控制块指针 
*			 ucBegin:  要打印寄存器开始偏移地址
*			 ucEnd:    要打印寄存器结束偏移地址
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 仅供内部测试用,供GetRtl8139Info调用
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/05/21    V1.0       邹同亮          创建
************************************************************************/
void Get8139Reg(RTL81X9END_DEVICE *pDrvCtrl, unsigned char ucBegin, unsigned char ucEnd)
{   
    if((RTL_REGS_TX_STATUS0 >= ucBegin) && (ucEnd >= RTL_REGS_TX_STATUS0))
    	printf("RTL_REGS_TX_STATUS0:      0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_STATUS0, RTL_WIN_0));
    if((RTL_REGS_TX_STATUS1 >= ucBegin) && (ucEnd >= RTL_REGS_TX_STATUS1))
    	printf("RTL_REGS_TX_STATUS1:      0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_STATUS1, RTL_WIN_0));
    if((RTL_REGS_TX_START_NOR_0 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_NOR_0))
    	printf("RTL_REGS_TX_START_NOR_0:  0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_NOR_0, RTL_WIN_0));
    if((RTL_REGS_TX_START_NOR_1 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_NOR_1))
    	printf("RTL_REGS_TX_START_NOR_1:  0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_NOR_1, RTL_WIN_0));
    if((RTL_REGS_TX_START_HIGH_0 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_HIGH_0))
    	printf("RTL_REGS_TX_START_HIGH_0: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_HIGH_0, RTL_WIN_0));
    if((RTL_REGS_TX_START_HIGH_1 >= ucBegin) && (ucEnd >= RTL_REGS_TX_START_HIGH_1))
    	printf("RTL_REGS_TX_START_HIGH_1: 0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_START_HIGH_1, RTL_WIN_0));
    if((RTL_REGS_RX_EARLY_CNT >= ucBegin) && (ucEnd >= RTL_REGS_RX_EARLY_CNT))
    	printf("RTL_REGS_RX_EARLY_CNT:    0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_RX_EARLY_CNT, RTL_WIN_0));
    if((RTL_REGS_RX_EARLY_STATUS >= ucBegin) && (ucEnd >= RTL_REGS_RX_EARLY_STATUS))
    	printf("RTL_REGS_RX_EARLY_STATUS: 0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_RX_EARLY_STATUS, RTL_WIN_0));
    if((RTL_REGS_CHIP_CMD >= ucBegin) && (ucEnd >= RTL_REGS_CHIP_CMD))
    	printf("RTL_REGS_CHIP_CMD:        0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CHIP_CMD, RTL_WIN_0));    
    
    
    if((RTL_REGS_INTR_MASK >= ucBegin) && (ucEnd >= RTL_REGS_INTR_MASK))
    	printf("RTL_REGS_INTR_MASK:       0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_INTR_MASK, RTL_WIN_0));
    if((RTL_REGS_INTR_STATUS >= ucBegin) && (ucEnd >= RTL_REGS_INTR_STATUS))
    	printf("RTL_REGS_INTR_STATUS:     0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_INTR_STATUS, RTL_WIN_0));
    if((RTL_REGS_TX_CONFIG >= ucBegin) && (ucEnd >= RTL_REGS_TX_CONFIG))
    	printf("RTL_REGS_TX_CONFIG:       0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_CONFIG, RTL_WIN_0));
    if((RTL_REGS_RX_CONFIG >= ucBegin) && (ucEnd >= RTL_REGS_RX_CONFIG))
    	printf("RTL_REGS_RX_CONFIG:       0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RX_CONFIG, RTL_WIN_0));
    if((RTL_REGS_TIMER >= ucBegin) && (ucEnd >= RTL_REGS_TIMER))
    	printf("RTL_REGS_TIMER:           0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TIMER, RTL_WIN_0));
    if((RTL_REGS_RX_MISSED >= ucBegin) && (ucEnd >= RTL_REGS_RX_MISSED))
    	printf("RTL_REGS_RX_MISSED:       0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RX_MISSED, RTL_WIN_0));
   
    if((RTL_REGS_CFG_9346 >= ucBegin) && (ucEnd >= RTL_REGS_CFG_9346))
    	printf("RTL_REGS_CFG_9346:        0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CFG_9346, RTL_WIN_0));
    if((RTL_REGS_CONFIG_0 >= ucBegin) && (ucEnd >= RTL_REGS_CONFIG_0))
    	printf("RTL_REGS_CONFIG_0:        0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CONFIG_0, RTL_WIN_0));
    if((RTL_REGS_CONFIG_1 >= ucBegin) && (ucEnd >= RTL_REGS_CONFIG_1))
    	printf("RTL_REGS_CONFIG_1:        0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CONFIG_1, RTL_WIN_0));
    if((RTL_REGS_TIMERINT >= ucBegin) && (ucEnd >= RTL_REGS_TIMERINT))
    	printf("RTL_REGS_TIMERINT:        0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TIMERINT, RTL_WIN_0));
    if((RTL_REGS_MSR >= ucBegin) && (ucEnd >= RTL_REGS_MSR))
    	printf("RTL_REGS_MSR:             0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_MSR, RTL_WIN_0));
    if((RTL_REGS_CONFIG3 >= ucBegin) && (ucEnd >= RTL_REGS_CONFIG3))
    	printf("RTL_REGS_CONFIG3:         0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_CONFIG3, RTL_WIN_0));
    if((RTL_REGS_MII >= ucBegin) && (ucEnd >= RTL_REGS_MII))
    	printf("RTL_REGS_MII:             0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_MII, RTL_WIN_0));
    if((RTL_REGS_MULTI_INTR >= ucBegin) && (ucEnd >= RTL_REGS_MULTI_INTR))
    	printf("RTL_REGS_MULTI_INTR:      0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_MULTI_INTR, RTL_WIN_0));
       

    
    if((RTL_REGS_MII_BMCR >= ucBegin) && (ucEnd >= RTL_REGS_MII_BMCR))
    	printf("RTL_REGS_MII_BMCR:        0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMCR, RTL_WIN_0));
    if((RTL_REGS_MII_BMSR >= ucBegin) && (ucEnd >= RTL_REGS_MII_BMSR))
    	printf("RTL_REGS_MII_BMSR:        0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_MII_BMSR, RTL_WIN_0));
    if((RTL_REGS_NWAY_ADVERT >= ucBegin) && (ucEnd >= RTL_REGS_NWAY_ADVERT))
    	printf("RTL_REGS_NWAY_ADVERT:     0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAY_ADVERT, RTL_WIN_0));
    if((RTL_REGS_NWAY_LPAR >= ucBegin) && (ucEnd >= RTL_REGS_NWAY_LPAR))
    	printf("RTL_REGS_NWAY_LPAR:       0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAY_LPAR, RTL_WIN_0));
    if((RTL_REGS_NWAY_EXPANSION >= ucBegin) && (ucEnd >= RTL_REGS_NWAY_EXPANSION))
    	printf("RTL_REGS_NWAY_EXPANSION:  0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAY_EXPANSION, RTL_WIN_0));
    if((RTL_REGS_DIS >= ucBegin) && (ucEnd >= RTL_REGS_DIS))
    	printf("RTL_REGS_DIS:             0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_DIS, RTL_WIN_0));
    if((RTL_REGS_FCSC >= ucBegin) && (ucEnd >= RTL_REGS_FCSC))
    	printf("RTL_REGS_FCSC:            0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_FCSC, RTL_WIN_0));
    if((RTL_REGS_NWAYTR >= ucBegin) && (ucEnd >= RTL_REGS_NWAYTR))
    	printf("RTL_REGS_NWAYTR:          0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_NWAYTR, RTL_WIN_0));
    if((RTL_REGS_CSCR >= ucBegin) && (ucEnd >= RTL_REGS_CSCR))
    	printf("RTL_REGS_CSCR:            0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_CSCR, RTL_WIN_0));
    
    if((RTL_REGS_PARA_78 >= ucBegin) && (ucEnd >= RTL_REGS_PARA_78))
    	printf("RTL_REGS_PARA_78:         0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_PARA_78, RTL_WIN_0));
    if((RTL_REGS_PARA_7c >= ucBegin) && (ucEnd >= RTL_REGS_PARA_7c))
    	printf("RTL_REGS_PARA_7c:         0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_PARA_7c, RTL_WIN_0));
    if((RTL_REGS_TPPOLL >= ucBegin) && (ucEnd >= RTL_REGS_TPPOLL))
    	printf("RTL_REGS_TPPOLL:          0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_TPPOLL, RTL_WIN_0));
    if((RTL_REGS_CPCR >= ucBegin) && (ucEnd >= RTL_REGS_CPCR))
    	printf("RTL_REGS_CPCR:            0x%04x\n",rtl81x9CsrReadWord(pDrvCtrl, RTL_REGS_CPCR, RTL_WIN_0));
    if((RTL_REGS_RDSAR_0 >= ucBegin) && (ucEnd >= RTL_REGS_RDSAR_0))
    	printf("RTL_REGS_RDSAR_0:         0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RDSAR_0, RTL_WIN_0));
    if((RTL_REGS_RDSAR_1 >= ucBegin) && (ucEnd >= RTL_REGS_RDSAR_1))
    	printf("RTL_REGS_RDSAR_1:         0x%08lx\n",rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_RDSAR_1, RTL_WIN_0));
    if((RTL_REGS_ETTHR >= ucBegin) && (ucEnd >= RTL_REGS_ETTHR))
    	printf("RTL_REGS_ETTHR:           0x%02x\n",rtl81x9CsrReadByte(pDrvCtrl, RTL_REGS_ETTHR, RTL_WIN_0));    
	
}

/************************************************************************
* 函数名称: GetRxTxDescriptor
* 功能描述: 打印8139的Descriptor值
* 输入参数: pDrvCtrl:网口设备控制块指针 
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 仅供内部测试用,供GetRtl8139Info调用
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/05/21    V1.0       邹同亮          创建
************************************************************************/
void GetRxTxDescriptor(RTL81X9END_DEVICE *pDrvCtrl)
{    
    unsigned long dwRxCmd[64];
    unsigned long dwTxCmd[64];
    int i =0;
    RTL_RMD *pRmd = (RTL_RMD *)NULL;   
    RTL_TMD *pTmd = (RTL_TMD *)NULL;   
    
    /* 获取 */    
    for (i=0; i<64 ; i++)
    {
        pRmd = ( RTL_RMD *)(pDrvCtrl->ptrRxBufSpace + 16*i); 
        dwRxCmd[i] = LONGSWAP(pRmd->cmd_leng);        
    }    
    
    for (i=0; i<64 ; i++)
    {
        pTmd = ( RTL_TMD *)(pDrvCtrl->ptrTxBufSpace + 16*i); 
        dwTxCmd[i] = LONGSWAP(pTmd->cmd_leng);     
    } 
    
    /* 打印 */
    printf("rmdIndex:%d, tmdIndex:%d, tmdIndexC:%d\n", pDrvCtrl->rmdIndex, pDrvCtrl->tmdIndex, pDrvCtrl->tmdIndexC);
    printf("RxDesciptor:\n");    
    for (i=0; i<64 ; i++)
    {        
        if(((i+1)%8) ==0)
        {
            printf("%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx\n",dwRxCmd[i-7],dwRxCmd[i-6],dwRxCmd[i-5],dwRxCmd[i-4],dwRxCmd[i-3],dwRxCmd[i-2],dwRxCmd[i-1],dwRxCmd[i]);
        }
    }
    
    printf("TxDesciptor:\n");    
    for (i=0; i<64 ; i++)
    {        
        if(((i+1)%8) ==0)
        {
            printf("%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx,%08lx\n",dwTxCmd[i-7],dwTxCmd[i-6],dwTxCmd[i-5],dwTxCmd[i-4],dwTxCmd[i-3],dwTxCmd[i-2],dwTxCmd[i-1],dwTxCmd[i]);
        }
    }     

}

/************************************************************************
* 函数名称: Get8139Counter
* 功能描述: 打印8139的统计值
* 输入参数: pDrvCtrl:网口设备控制块指针 
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 仅供内部测试用,供GetRtl8139Info调用
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/05/21    V1.0       邹同亮          创建
************************************************************************/
void Get8139Counter(RTL81X9END_DEVICE *pDrvCtrl)
{    
    
    unsigned long *pCouterBase =NULL;    
	if(pCouterBase == NULL)
	{
        pCouterBase = (unsigned long *)malloc (0x200);
        pCouterBase = (unsigned long *) ( ( (unsigned long)pCouterBase + 63) & ((unsigned long)~63));
	}	
	
	rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_STATUS0, ((unsigned long)pCouterBase) | 0x8, RTL_WIN_0);
	rtl81x9CsrWriteLong(pDrvCtrl, RTL_REGS_TX_STATUS1, 0, RTL_WIN_0);
	
	while( (rtl81x9CsrReadLong(pDrvCtrl, RTL_REGS_TX_STATUS0, RTL_WIN_0) & 0x8) !=0 )
	{
		taskDelay(1);		
	}
	           
	printf("TxOk      = %ld%ld\n", LONGSWAP(*(pCouterBase +1)), LONGSWAP(*pCouterBase));
	printf("RxOk      = %ld%ld\n", LONGSWAP(*(pCouterBase +3)), LONGSWAP(*(pCouterBase +2)));
	printf("TxErr     = %ld%ld\n", LONGSWAP(*(pCouterBase +5)), LONGSWAP(*(pCouterBase +4)));
	printf("RxErr     = %ld\n", LONGSWAP(*(pCouterBase +6)));	
	printf("MissPkt   = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +7))));
	printf("FAE       = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +7) +1)));
	printf("Tx1Col    = %ld\n", LONGSWAP(*(pCouterBase +8)));
	printf("TxMCol    = %ld\n", LONGSWAP(*(pCouterBase +9)));
	printf("RxOkPhy   = %ld%ld\n", LONGSWAP(*(pCouterBase +11)), LONGSWAP(*(pCouterBase +10)));
	printf("RxOkBrd   = %ld%ld\n", LONGSWAP(*(pCouterBase +13)), LONGSWAP(*(pCouterBase +12)));
	printf("RxOkMul   = %ld\n", LONGSWAP(*(pCouterBase +14)));
	printf("TxAbt     = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +15))));
	printf("TxUndrn   = %d\n", WORDSWAP(*((unsigned short*)(pCouterBase +15) +1)));
	
}

/************************************************************************
* 函数名称: GetRtl8139Info
* 功能描述: 打印8139的各种信息
* 输入参数: unit:    网口的设备号,如rtl0的0 
*			 ucInfo    网口信息类型,见rtl8139Config.h中的宏定义        
* 输出参数: 无
* 返 回 值: OK:   成功
             ERROR:失败
* 其它说明: 仅供内部测试用
* 修改日期:    版本号     修改人	      修改内容
* -----------------------------------------------
* 2002/05/21    V1.0       邹同亮          创建
************************************************************************/
STATUS GetRtl8139Info(int unit,unsigned char ucInfo)
{	
	RTL81X9END_DEVICE *pDrvCtrl = NULL;    
	pDrvCtrl = (RTL81X9END_DEVICE *)endFindByName("rtl", unit);
    if(pDrvCtrl == NULL )
    {    	
    	return ERROR;
    }
    
	/* 打印8139的寄存器 */
	if(ucInfo & RTL8139_INFO_REG)
	{	
		Get8139Reg(pDrvCtrl, 0x00, 0xff);	
	}
	
	/* 打印8139的GetRxTxDescriptor */
	if(ucInfo & RTL8139_INFO_DESCP)
	{
		GetRxTxDescriptor(pDrvCtrl);
	}	
	
	/* 打印8139的统计记数器 */
	if(ucInfo & RTL8139_INFO_COUNT)
	{
		Get8139Counter(pDrvCtrl);
	}
	
	/* 打印8139对应设备的缓冲池统计 */
	if(ucInfo & RTL8139_INFO_POOL)
	{
    	netPoolShow(pDrvCtrl->end.pNetPool);
	}
	
	return OK;
}


⌨️ 快捷键说明

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