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

📄 dm9isa.cpp

📁 DM9000芯片所有的资料,包括如何与S3C2440连接的原理图,PCB,还有最新驱动,怎样在驱动里修改参数的PDF文档
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	a= b= c= d= WSTR("NA");
	if (rData&0x8000) a= WSTR("100FDX");
	if (rData&0x4000) b= WSTR("100HALF");
	if (rData&0x2000) c= WSTR("10FDX");
	if (rData&0x1000) d= WSTR("10HALF");
	switch (m_LSMode)
	{
		case LINKSPEED_AUTO:
			WPrintf(WSTR(" -A.N.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
			break;
		case LINKSPEED_HALF100BASE:
			WPrintf(WSTR(" -100H.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
			break;
		case LINKSPEED_HALF10BASE:
			WPrintf(WSTR(" -10H.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
			break;
		default: // otherwise
			WPrintf(WSTR(" -??CkSts??.Done: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
			break;
	}
	monitor= rData & 0x000f;
	//Show_BMCR.
	rData= DeviceReadPhy(0, 0);
	a= b= c= d= WSTR("NA");
	if (rData&0x2000) { // 100M
	  if (rData&0x0100)
		a= WSTR("100MFull");
	  else
		b= WSTR("100MHalf");
	}else{ // 10M
	  if (rData&0x0100)
		c= WSTR("10MFull");
	  else
		d= WSTR("10MHalf");
	}
	WPrintf(WSTR(" -BMCR.Stat: [%s][%s][%s][%s] 0x%x\r\n"), a,b,c,d, rData);
	return monitor==0x8;
}
BOOL DM9ISA::OP_ShowLinkMode(int PIndex)
{
	WORD rData, monitor;
	LPWSTR a,b,c,d;
	//Show_A.N.
	rData= DeviceReadPhy(PIndex, MIIADDR_SPSTAT); //* 17.[15:12]=
	a= b= c= d= WSTR("NA");
	if (rData&0x8000) a= WSTR("100FDX");
	if (rData&0x4000) b= WSTR("100HALF");
	if (rData&0x2000) c= WSTR("10FDX");
	if (rData&0x1000) d= WSTR("10HALF");
	switch (m_LSMode)
	{
		case LINKSPEED_AUTO:
			WPrintf(WSTR(" -(PHY-%d) A.N.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
			break;
		case LINKSPEED_HALF100BASE:
			WPrintf(WSTR(" -(PHY-%d) 100H.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
			break;
		case LINKSPEED_HALF10BASE:
			WPrintf(WSTR(" -(PHY-%d) 10H.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
			break;
		default: // otherwise
			WPrintf(WSTR(" -(PHY-%d) ??CkSts??.Done: [%s][%s][%s][%s] 0x%x (PHY-%d)\r\n"), PIndex, a,b,c,d, rData );
			break;
	}
	monitor= rData & 0x000f;
	//Show_BMCR.
	rData= DeviceReadPhy(PIndex, 0);
	a= b= c= d= WSTR("NA");
	if (rData&0x2000) { // 100M
	  if (rData&0x0100)
		a= WSTR("100MFull");
	  else
		b= WSTR("100MHalf");
	}else{ // 10M
	  if (rData&0x0100)
		c= WSTR("10MFull");
	  else
		d= WSTR("10MHalf");
	}
	WPrintf(WSTR(" -(PHY-%d) BMCR.Stat: [%s][%s][%s][%s] 0x%x \r\n"), PIndex, a,b,c,d, rData );
	return monitor==0x8;
}

/************************************************************************
*
*	Definition:
*		set link mode to NIC.
*
*************************************************************************/
BOOL DM9ISA::LnkStat_SetLinkMode(int linkMode, LPWSTR modename)
{
	//( _T("LnkStat_SetLinkMode_"), modename, LinkNameTbl[linkMode] );
	int Ret;
	OP_SetLinkMode(linkMode);

	if (Ret= LnkStat_WaitLinkUp())
		WPrintf(_T("Exit: LnkStat_SetLinkMode() \r\n"));
	return Ret;
}

BOOL DM9ISA::ISA_LinkUp(void)
{
	BYTE Ctl, Mod;
	BOOL MYLinkProcess;

	if (m_nMaxTxPending==1) //DM9000E
	{
			WPrintf(_T(" [LinkUp: DM9000E No MDIX_Ctrl] \r\n"));
			
			MYLinkProcess= ISA_LinkUpProcess(PAD_FIX_MODE);
			//MYLinkProcess=_ISA_LinkUpProcess(_MDIX_MODE)
			//MYLinkProcess=_ISA_LinkUpProcess(_MDI_MODE)
	
			if (MYLinkProcess)
				WPrintf(_T(" DM9000= [Link OK] \r\n"));
			else
				WPrintf(_T(" DM9000= [Un-Link] \r\n"));
	}
	else
	{
		int i= MDIX_CNTL_MODE_ENUM;
		if (m_auto_mdix_flgb)
			i= AUTO_MDIX_MODE;

		Ctl= m_btEeprom[7]>>6; // from parent
		Mod= (m_btEeprom[15]&0x40)>>6; // from parent

		/*
		_PSTR(_T(" (EEPROM B07-bit[7:6])= bit[1:0]=0x%02X \r\n"), Ctl);
		_PSTR(_T(" (EEPROM B15-bit[6])= bit[0]=%d \r\n"), Mod);

		if (Ctl==0x01 && Mod==0)
			_PSTR(_T(" [EEPROM_Display: Auto_MDIX Off] \r\n"));
		else if (Ctl==0x01 && Mod==1)
			_PSTR(_T(" [EEPROM_Display: Auto_MDIX On] \r\n"));
		else
			_PSTR(_T(" [EEPROM_Invalid_Display: Default Auto_MDIX On] \r\n"));

		_PSTR(_T(" [PHY_REG20.4]= 0: En Auto, 1: Dis Auto \r\n"));

		if (i==AUTO_MDIX_MODE)
			_PSTR(_T(" 0: [Auto_MDIX_MODE twice] \r\n"));
		else
			_PSTR(_T(" 1: [Enum to MDIX & MDI -Individually] \r\n"));
		*/

		//Mdix_Ctrl_Enum 
		if (i==MDIX_CNTL_MODE_ENUM)
		{
			WPrintf(_T(" [LinkUp: MDIX_Ctrl_Enum] \r\n"));
			
			//WORD rData;
			//rData= DeviceReadPhy(0, 1);
			//WPrintf(_T("FIX-TXRX:BMSR= %04x for A.N. - LkUp \r\n"), rData);

			if ( !(MYLinkProcess=ISA_LinkUpProcess(MDIX_MODE)) ){
				_PSTR(_T(" [Restart Auto-Negotiation] \r\n"));
			#ifdef IMPL_TST_FORCE_100H
			  DeviceWritePhy(0, 0, PARAM_100H/*PARAM_10H*/);
			#else
				DeviceWritePhy(0, 0, DEV_LSMode(LINKSPEED_AUTO)
					/*0x3300*//*0x1200*/); //(OP_SetLinkMode()) 1000 or 3100(default) AUTO (N-WAY)+Auto_Restart
			#endif
				MYLinkProcess= ISA_LinkUpProcess(MDI_MODE);
			}
		}
		//AutoMDIX
		if (i==AUTO_MDIX_MODE)
		{
			WPrintf(_T(" [LinkUp: AUTO_MDIX_MODE] \r\n"));

			//rData= DeviceReadPhy(0, 1);
			//WPrintf(_T("AUTO-MDIX:BMSR= %04x for A.N. - LkUp \r\n"), rData);

			if ( !(MYLinkProcess= ISA_LinkUpProcess(AUTO_MDIX_MODE)) ){
				_PSTR(_T(" [Restart Auto-Negotiation] \r\n"));
			#ifdef IMPL_TST_FORCE_100H
			  DeviceWritePhy(0, 0, PARAM_100H/*PARAM_10H*/);
			#else
				DeviceWritePhy(0, 0, DEV_LSMode(LINKSPEED_AUTO)
					/*0x3300*//*0x1200*/); //(OP_SetLinkMode()) 1000 or 3100(default) AUTO (N-WAY)+Auto_Restart
			#endif
				MYLinkProcess= ISA_LinkUpProcess(AUTO_MDIX_MODE);
			}
		}

		// [Final MDI or MDIX mode! PHY-Reg(20.7) ]
		bool mdix_cntl_status_flgb= (DeviceReadPhy(0, MIIADDR_SCFG)&MAKE_MASK1(7))? 1:0; 
		if (mdix_cntl_status_flgb)
		{
				WPrintf(_T(" 1= MDIX (readPHY) \r\n"));
				DeviceWritePhy(0, MIIADDR_SCFG, 0x0030);	
							//* 20.5|20.4=11 MDIX mode // force_mdix_fix_to_mdix
				if (MYLinkProcess)
					WPrintf(_T(" 1 Set MDIX= [Link OK] \r\n"));
				else
					WPrintf(_T(" 1 Set MDIX= [Un-Link] \r\n"));
		}
		else
		{
				WPrintf(_T(" 0= MDI (readPHY) \r\n"));
				DeviceWritePhy(0, MIIADDR_SCFG, MAKE_UNMASK1(5)|MAKE_MASK1(4));  
							//* 20.bit[5:4]= 0x0010= 01 MDI mode //force_mdix_fix_to_mdi
				if (MYLinkProcess)
					WPrintf(_T(" 0 Set MDI= [Link OK] \r\n"));
				else
					WPrintf(_T(" 0 Set MDI= [Un-Link] \r\n"));
		}
	}

	return MYLinkProcess; //TRUE; 
}

BOOL DM9ISA::ISA_LinkUpProcess(int i) // [ORG=LinkState_LinkUp()]
{
	int Ret;
	BOOL Lm;

	if (m_nMaxTxPending==1) //DM9000E
	{
		//i:PAD_FIX_MODE
	}
	else
	{
		/* [Enter: LinkSpeed_Auto] */		

		if (i==MDI_MODE){
			DeviceWritePhy(0, MIIADDR_SCFG, MAKE_UNMASK1(5)|MAKE_MASK1(4));  //force_mdix_fix_to_mdi
						//* 20.bit[5:4]= 0x0010= 01 MDI mode
			NdisMSleep(uSec500);
			_PSTR_REL(_T("===> LinkUp-ENTER: PHYReg00-0x%04X \r\n"), LinkState_GetBMCR(0x00));
			_PSTR_REL(ModeNameTbl[i]); 		
		}
		else if (i==MDIX_MODE){
			DeviceWritePhy(0, MIIADDR_SCFG, 0x0030);	// force_mdix_fix_to_mdix
						//* 20.5|20.4=11 MDIX mode
			NdisMSleep(uSec500);
			_PSTR_REL(_T("===> LinkUp-ENTER: PHYReg00-0x%04X \r\n"), LinkState_GetBMCR(0x00));
			_PSTR_REL(ModeNameTbl[i]); 		
		}
		else if (i==AUTO_MDIX_MODE){
			DeviceWritePhy(0, MIIADDR_SCFG, 0x0000);    // enable_auto_mdix_mode
						// 20.5|20.4=x0 Auto-MDIX mode
			NdisMSleep(uSec500);
			_PSTR_REL(_T("===> LinkUp-ENTER: PHYReg00-0x%04X \r\n"), LinkState_GetBMCR(0x00));
			_PSTR_REL(ModeNameTbl[i]); 		
		}
		NdisMSleep(mSec10); // 10 ms
	}
	 
	Ret= LnkStat_WaitLinkUp(); // [Wait LinkUp]
	OP_ShowLinkMode(); // [status now: not exactly here!]
	if ( Ret )
		return TRUE;

	// [Not link yet]
		  Lm= LnkStat_SetLinkMode(LINKSPEED_HALF100BASE, ModNameT[i]);
		  OP_ShowLinkMode();
		  if (Lm) { //100M Half
			  WPrintf(WSTR(" Done: [LINKSPEED_HALF100BASE] \r\n"));
			  Lm= LnkStat_SetLinkMode(LINKSPEED_AUTO, ModNameT[i]);
			  OP_ShowLinkMode(); // not exactly here!
			  if (Lm){
				WPrintf(WSTR(" Done: [LINKSPEED_AUTO] \r\n"));
				return 104; //TRUE;
			  }
			  WPrintf(_T("[-set].[%s].[LINK 100M Half]\r\n"), ModNameT[i]);

#ifdef IMPL_TST_FORCE_100H
			DeviceWritePhy(0, 0, PARAM_100H);
#else
			  DeviceWritePhy(0, 0, DEV_LSMode(LINKSPEED_HALF100BASE)); //100M Half
			  /*0x2000*/
#endif
			  NdisMSleep(mSec5); // 5 ms
			  return 102; //TRUE;
		  }

		  /*
		  //============
		  //Found connect to Corega FSW-8,
		  //Corega FSW-8 power off.
		  //The 10 M Half can link,
		  //So remove 10 M detect.
		  //LINKSPEED_Auto can do for it!
		  //JJ::2008.03.06
		  //============
		  if (_LnkStat_SetLinkMode(LINKSPEED_HALF10BASE, ModNameT[i])) //10M Half
		  {
			  if (_LnkStat_SetLinkMode(LINKSPEED_AUTO, ModNameT[i]))
				return 104; //TRUE;
			  
			  _PSTR(_T("[-set].[%s].[LINK 10M Half]\r\n"), ModNameT[i]);
			  _DeviceWritePhy(0, 0, 0x0000); //10M Half
			  NdisMSleep(mSec5); // 5 ms
			  return 102; //TRUE;
		  }
		  */

#ifdef IMPL_TST_FORCE_100H
		DeviceWritePhy(0, 0, PARAM_100H/*PARAM_10H*/);
#else
		  DeviceWritePhy(0, 0, (DEV_LSMode(LINKSPEED_AUTO) & 0xFDFF) | 0x2100); //Bad & Leave: 1000 or 3100(default) A.N.
		  /*0x3100*/
#endif
		  NdisMSleep(mSec5); // 5 ms

	return 0; //FALSE;
}

WORD DM9ISA::LinkState_Op(int i) // [DISCARD]
{
  WORD wLinkState;

//Auto(= N-Way)
  DeviceWritePhy(0, 0, 0x3100); // En Auto-neg
//_DeviceWritePhy(0, 0, _0x1200); // Restart Auto-neg
  NdisMSleep(mSec25); // 25 ms
	wLinkState= LinkState_Get_BMSR(0x01);
	if (wLinkState&0x0004){
		
	  _PSTR(_T("N-WAY--------------------------------------\r\n"));
	  return wLinkState;
	}
//100M Half
  DeviceWritePhy(0, 0, 0x2000); // Set 100M Half
  NdisMSleep(mSec5); // 5 ms

	wLinkState= LinkState_Get_BMSR(0x01);
	if (wLinkState&0x0004){
		  _PSTR(_T("100M-Half--------------------------------------\r\n"));
	  //return wLinkState;
		//Auto(= N-Way)
		  DeviceWritePhy(0, 0, 0x3100); // En Auto-neg
//		  _DeviceWritePhy(0, 0, _0x1200); // Restart Auto-neg
		  NdisMSleep(mSec25); // 25 ms
			wLinkState= LinkState_Get_BMSR(0x01);
			if (wLinkState&0x0004){
				
				_PSTR(_T("N-WAY--------------------------------------\r\n"));
				return wLinkState;
			}
		//100M Half
		  DeviceWritePhy(0, 0, 0x2000); // Set 100M Half
		  NdisMSleep(mSec5); // 5 ms
			wLinkState = LinkState_Get_BMSR(0x01);
			return wLinkState;
	}
//10M Half
  DeviceWritePhy(0, 0, 0x0000); // Set 10M Half
  NdisMSleep(mSec5); // 5 ms
	wLinkState= LinkState_Get_BMSR(0x01);
	if (wLinkState&0x0004){
/*
		  _PSTR(_T("10M-Half--------------------------------------\r\n"));
*/
	  //return wLinkState;
		//Auto(= N-Way)
		  DeviceWritePhy(0, 0, 0x3100); // En Auto-neg
//		  _DeviceWritePhy(0, 0, _0x1200); // Restart Auto-neg
		  NdisMSleep(mSec25); // 25 ms
			wLinkState= LinkState_Get_BMSR(0x01);
			if (wLinkState&0x0004){
				
				_PSTR(_T("N-WAY--------------------------------------\r\n"));
				return wLinkState;
			}
/*
		//10M Half
		  _DeviceWritePhy(0, 0, 0x0000); // Set 10M Half
		  NdisMSleep(mSec5); // 5 ms
			wLinkState = DeviceReadPhy(0, 0x1);
			wLinkState = DeviceReadPhy(0, 0x1);
			return wLinkState;
*/
	}

/*
	wLinkState = DeviceReadPhy(0, 0x1);
	wLinkState = DeviceReadPhy(0, 0x1);
*/

	return wLinkState;
}

/*
WORD DM9ISA::GetLinkState_init()
{
#if 0
  WORD wLinkState;

 //[Already Link-On]
  if (m_wLinkState&0x0004) // In Link-On state
  {
	wLinkState = DeviceReadPhy(0, 0x1);
	wLinkState = DeviceReadPhy(0, 0x1);
	return wLinkState;
  }
#endif

  return _LinkState_Op();
}
*/

WORD DM9ISA::LinkState_GetBMCR(int i)
{
	WORD wBMCRState;
	wBMCRState = DeviceReadPhy(0, 0);
	wBMCRState = DeviceReadPhy(0, 0);
	return wBMCRState;
}

WORD DM9ISA::LinkState_Get_BMSR(int i)
{
	WORD wLinkState;
	wLinkState= DeviceReadPhy(0, 0x1);
	wLinkState= DeviceReadPhy(0, 0x1);
	return wLinkState;
}

WORD DM9ISA::LinkState_Get_DSCSR(LPWSTR head, int i)
{
	WORD wData;
	wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
	wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
    _PSTR(_T("%s-------------------[0x%04X]\r\n"),head,wData);
	return wData;
}
WORD DM9ISA::LinkState_Get_DSCSR_EX(LPWSTR head, LPWSTR regname, int i)
{
	WORD wData;
	wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
	wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17
  //_PSTR(_T("[%s].[%s]-------------------[0x%04X]\r\n"), head,regname,wData);
  //_PSTR(_T("[%s].[%s]-------------------[0x%04X]\r\n"), head,regname,wData);
	return wData;
}

WORD DM9ISA::LinkState_Get_SCFG(LPWSTR head, int i)
{
	WORD wData;

	wData= DeviceReadPhy(0, MIIADDR_SCFG); // 20
	wData= DeviceReadPhy(0, MIIADDR_SCFG); // 20

	_PSTR(_T("%s-------------------[0x%04X]\r\n"),head,wData);
	return wData;
}

WORD DM9ISA::GetLinkState()
{
	WORD wLinkState;
#if 0
	wLinkState = DeviceReadPhy(0, 0x1);
	wLinkState = DeviceReadPhy(0, 0x1);
#endif
#if 0
//[DeviceCheckForHang], wLinkState= LinkState_Op(TTL_COUNT);
#endif
	wLinkState= LinkState_Get_BMSR(TTL_COUNT);
	  
	return wLinkState;
}


WORD DM9ISA::DeviceCheckLink(void) //  Device-Check-For-Link() ;'BMSR'
{
	WORD wLinkState,  wData;
	U32 nsr,  ncr;

	BOOL PHY, MAC;

	wLinkState= LinkState_Get_BMSR(0x01);
	nsr= DeviceReadPort(DM9_NSR);

	PHY= (wLinkState&0x0004); 
	MAC= (nsr & MAKE_MASK(6));

	SetConnectionStatus(PHY && MAC); //(true);
	if (PHY && MAC)
	{
		m_Counter++;
	}
	else if (!PHY && !MAC)
	{
		m_Counter_Fail++;
	}
	else
		m_Counter_Mix++;
	
//	if (PHY && MAC)
//		_PSTR(_T("LnkOn-     "));
//	else
//		_PSTR(_T("Lnk-Fail-  "));
	
	ncr= DeviceReadPort(DM9_NCR); 
	wData= DeviceReadPhy(0, MIIADDR_SPSTAT); // 17

//	_PSTR(_T("[NCNSPHY17:%02X,%02X,%04X] "), 
//					ncr,
//					nsr,
//					wData);

//	if (PHY) // 0x01:dummy for BMSR-01
//		_PSTR(_T("On(PHY@ %d, %d) &&"),m_Counter,m_Counter_Fail);
//	else
//		_PSTR(_T("Fail(PHY@ %d, %d) &&"),m_Counter,m_Counter_Fail);


//	if(MAC)
//		_PSTR(_T("On(NSR@ %d,%d,[neq:%d])\r\n"),m_Counter,m_Counter_Fail,m_Counter_Mix);
//	else
//		_PSTR(_T("Fail(NSR@ %d,%d,[NEQ:%d])\r\n"),m_Counter,m_Counter_Fail,m_Counter_Mix);


	if (PHY && MAC){
		int linkStatus= DEV_LinkStatus( DeviceReadPort(DM9_NCR), DeviceReadPort(DM9_NSR) );
#if 0
		_PSTR_REL(_T("[9ISA-On(NSR@ %d,%d,[neq:%d]) [%s] \r\n"),
			m_Counter,
			m_Counter_Fail,
			m_Counter_Mix,
			SpeedNameTbl[linkStatus]);
#endif
	}

	return wLinkState;
}

void DM9ISA::Pnt_Dot_MsgCtrl(WORD wLinkState)
{
	//m_JJ_PrintMessage_control++;
	//m_JJ_PrintMessage_control &= _0x1f; // JJ(+)
	//if (!m_JJ_PrintMessage_control)
	//  DEBUG_PRINTF(TEXT("[Device/DM9ISA]DeviceCheckForHang: Link=%d\r\n"), (wLinkState&0x4));

	int qsize= m_pUpper->GetQueueSize();

	if (!m_JJ_PrintMessage_control){
		WPrintf(WSTR(" .")); 

		//DEBUG_PRINTF(TEXT("[9ISA_Ck4Hng]: Link= %d (TxPendings=%d, QueueSize=%d)\r\n"), wLinkState, m_nTxPendings, qsize);
		  DEBUG_PRINTF(TEXT(" (TxPdngs=%d, QSiz=%d)\r\n"), m_nTxPendings, qsize);

	}

	m_JJ_PrintMessage_control++;
	m_JJ_PrintMessage_control &= 0x03;
}

⌨️ 快捷键说明

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