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

📄 lan91c96_init.c

📁 ARM9基于WINDOWSCE的BSP源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	RETAILMSG(1, (TEXT("-%02X-%02X\r\n"), LOBYTE(temp), HIBYTE(temp)));


	//Reset the card
    if(!AdapterReset(Adapter))
    {
		RETAILMSG(1, (TEXT("LAN91C96: ERROR Can't Reset the Adapter!\r\n")));
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:<== MiniPort Initialize\r\n")));
        BackOut(Adapter);
        return(NDIS_STATUS_FAILURE);
    }

    //Link Established
    Adapter->LinkStatus = MEDIA_CONNECTED;
	//Enable the interrupts !!
	LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
	LAN91C96_Write( Adapter->IOBase + BANK2_INT_STS,(USHORT)(ENABLED_INTS << 8));

	{
//initialize GPIO8_1 as NIC IRQ pin		
		PHYSICAL_ADDRESS PhysicalIoBase;
		volatile unsigned long *GPIO_ADD;
		PhysicalIoBase.HighPart = 0;
		PhysicalIoBase.LowPart = 0x2002f400;
		GPIO_ADD = (unsigned long *)MmMapIoSpace( PhysicalIoBase, 0x100 ,FALSE );
		RETAILMSG(0,(TEXT("GPIO_ADD = 0x%x\r\n"),GPIO_ADD));
/*
		*(volatile long *)(GPIO_ADD + GPIOIS)	|= 0x2;			//level int	
		*(volatile long *)(GPIO_ADD + GPIOIBE)	= 0x0;	
		*(volatile long *)(GPIO_ADD + GPIOIEV)	|= 0x2;			//high level
		*(volatile long *)(GPIO_ADD + GPIOIE)	|= 0x2;			//enable GPIO INT 
*/
		*(volatile long *)(GPIO_ADD + 1)	|= 0x2;			//level int	
		*(volatile long *)(GPIO_ADD + 2)	= 0x0;	
		*(volatile long *)(GPIO_ADD + 3)	|= 0x2;			//high level
		*(volatile long *)(GPIO_ADD + 4)	|= 0x2;			//enable GPIO INT 
	}

	
	
/*test
{	USHORT DAT;
	USHORT	SavedBS;
	LAN91C96_Read(Adapter->IOBase + BANK_SELECT, &SavedBS);
	LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 0);
	LAN91C96_Read(Adapter->IOBase + BANK0_TCR, &DAT);
	RETAILMSG(1, (TEXT("		BANK0_TCR = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK0_STS, &DAT);
	RETAILMSG(1, (TEXT("		BANK0_STS = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK0_RCR, &DAT);
	RETAILMSG(1, (TEXT("		BANK0_RCR = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK0_CTR, &DAT);
	RETAILMSG(1, (TEXT("		BANK0_CTR = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK0_MIR, &DAT);
	RETAILMSG(1, (TEXT("		BANK0_MIR = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK0_MCR, &DAT);
	RETAILMSG(1, (TEXT("		BANK0_MCR = 0x%x\r\n"),DAT));

	LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 1);
	LAN91C96_Read(Adapter->IOBase + BANK1_CONFIG, &DAT);
	RETAILMSG(1, (TEXT("		BANK1_CONFIG = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK1_BASE, &DAT);
	RETAILMSG(1, (TEXT("		BANK1_BASE = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK1_IA0, &DAT);
	RETAILMSG(1, (TEXT("		BANK1_IA0 = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK1_GEN, &DAT);
	RETAILMSG(1, (TEXT("		BANK1_GEN = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK1_CTL, &DAT);
	RETAILMSG(1, (TEXT("		BANK1_CTL = 0x%x\r\n"),DAT));

	LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
	LAN91C96_Read(Adapter->IOBase + BANK2_MMUCMD, &DAT);
	RETAILMSG(1, (TEXT("		BANK2_MMU_CMD = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK2_PNR, &DAT);
	RETAILMSG(1, (TEXT("		BANK2_PNR = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK2_FIFOS, &DAT);
	RETAILMSG(1, (TEXT("		BANK2_FIFOS = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK2_INT_STS, &DAT);
	RETAILMSG(1, (TEXT("		BANK2_INT_STS = 0x%x\r\n"),DAT));


	LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 3);
	LAN91C96_Read(Adapter->IOBase + BANK3_MT01, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_MT01 = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK3_MT23, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_MT23 = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK3_MT45, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_MT45 = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK3_MT67, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_MT67 = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK3_MGMT, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_MGMT = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK3_REV, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_REV = 0x%x\r\n"),DAT));
	LAN91C96_Read(Adapter->IOBase + BANK3_ERCV, &DAT);
	RETAILMSG(1, (TEXT("		BANK3_ERCV = 0x%x\r\n"),DAT));
	
	LAN91C96_Write(Adapter->IOBase + BANK_SELECT, SavedBS);

}
	*/
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== MiniportInitialize  \r\n")));

	//Ready
	Adapter->State = NORMAL_STATE;
	return NDIS_STATUS_SUCCESS;
}

/*
 Function Name : 	GetRegistrySettings
 Description   :	
					Reads the registry values, and loads them into the adapter structure
 Parameters    :
					MINIPORT_ADAPTER *Adapter	- Pointer to the adapter structure
					NDIS_HANDLE       ConfigurationContext - Context handler, from the NDIS wrapper
			
 Return Value  :
					NDIS_STATUS		Status
*/

NDIS_STATUS GetRegistrySettings(MINIPORT_ADAPTER *Adapter,
							 NDIS_HANDLE       ConfigurationContext)
{
	NDIS_STATUS                   Status;
	NDIS_HANDLE                   ConfigurationHandle;
	PNDIS_CONFIGURATION_PARAMETER ConfigurationParameter;

	UCHAR                        * NewNetworkAddress=NULL;
    UINT                          NewNetworkAddressLength;

	NDIS_STRING                   BusTypeString		= NDIS_STRING_CONST("BusType");
	NDIS_STRING                   BusNumberString	= NDIS_STRING_CONST("BusNumber");
	NDIS_STRING                   DuplexString		= NDIS_STRING_CONST("FullDuplex");
	NDIS_STRING                   IOBase          = NDIS_STRING_CONST("IoBaseAddress");
    NDIS_STRING                   Interrupt       = NDIS_STRING_CONST("InterruptNumber");

	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 ==> GetRegistrySettings  \r\n")));

	//Set up the default values
	// First set up defaults.
	Adapter->InterruptVector =
	Adapter->InterruptLevel  = DEFAULT_IRQ;
	Adapter->InterruptType   = CM_RESOURCE_INTERRUPT_LATCHED;
    Adapter->IOBase          = DEFAULT_IO_BASE;
    Adapter->LookAhead       = MAX_LOOKAHEAD_SIZE;
	Adapter->LinkStatus		 = (USHORT)MEDIA_DISCONNECTED;
	Adapter->MACAddress[0] = 
		Adapter->MACAddress[1] = 
		Adapter->MACAddress[2] = 0;
		
	
	//Open the Registry tree for this adapter.
    NdisOpenConfiguration((PNDIS_STATUS) &Status,(PNDIS_HANDLE) &ConfigurationHandle,ConfigurationContext);
	if(Status != NDIS_STATUS_SUCCESS)
    {
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 : ERROR - No information for adapter!\r\n")));
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== Configure Adapter\r\n")));
        return(NDIS_STATUS_FAILURE);
    }

	//Get configured bus type value from registry,
	NdisReadConfiguration((PNDIS_STATUS) &Status,   
		&ConfigurationParameter,
		ConfigurationHandle,
		(PNDIS_STRING) &BusTypeString,
		NdisParameterInteger); 
	if(Status == NDIS_STATUS_SUCCESS)
	{
		Adapter->BusType = (USHORT) ConfigurationParameter->ParameterData.IntegerData;
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusType    = 0x%x\r\n"), Adapter->BusType));
	}
	else
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 : ERROR - BusType not in Registry!\r\n")));
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== Configure Adapter\r\n")));
		NdisCloseConfiguration(ConfigurationHandle);
		return(NDIS_STATUS_FAILURE);
	}

	//Get bus number value from registry.
	NdisReadConfiguration((PNDIS_STATUS) &Status,
		&ConfigurationParameter,
		ConfigurationHandle,
		(PNDIS_STRING) &BusNumberString,
		NdisParameterInteger);
	if(Status == NDIS_STATUS_SUCCESS)
	{
		Adapter->BusNumber = (USHORT) ConfigurationParameter->ParameterData.IntegerData;
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusNumber    = 0x%x\r\n"), Adapter->BusNumber));
	}	
	else
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96: ERROR - BusNumber not in Registry!\r\n")));
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96<== Configure Adapter\r\n")));
		NdisCloseConfiguration(ConfigurationHandle);
		return(NDIS_STATUS_FAILURE);
	}

	//Check for updates to IRQ value.
    NdisReadConfiguration((PNDIS_STATUS) &Status,
		&ConfigurationParameter,
		ConfigurationHandle,
		(PNDIS_STRING) &Interrupt,
		NdisParameterInteger);	
    if(Status == NDIS_STATUS_SUCCESS)
    {
        RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New IRQ Value found in register.. overiding the default value\r\n")));
		Adapter->InterruptVector	=
		Adapter->InterruptLevel		= (USHORT) (ConfigurationParameter->ParameterData.IntegerData);
		Adapter->InterruptType = CM_RESOURCE_INTERRUPT_LATCHED;		
	}
	else
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Unable to read Interrupt from Registry using default value!!!\r\n")));
	}	

	//Check for update IOBase address
	NdisReadConfiguration((PNDIS_STATUS) &Status,
		&ConfigurationParameter,
		ConfigurationHandle,
		(PNDIS_STRING) &IOBase,
		NdisParameterInteger);
	if (Status == NDIS_STATUS_SUCCESS)
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New IOBase address found in register.. overiding the default value\r\n")));
		Adapter->IOBase = (UINT) (ConfigurationParameter->ParameterData.IntegerData);
	}

	//Make sure we're still okay.
	if(Status != NDIS_STATUS_SUCCESS)
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:<== Configure Adapter\r\n")));
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:ERROR: Config Handler Failed!\n")));
		return(Status);
	}

	//Check for the Aneg
	//If the Duplex String = FULL then the FDSE bit i
	NdisReadConfiguration((PNDIS_STATUS) &Status,
		&ConfigurationParameter,
		ConfigurationHandle,
		(PNDIS_STRING) &DuplexString,
		NdisParameterInteger);
	if (Status == NDIS_STATUS_SUCCESS)
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New IOBase address found in register.. overiding the default value\r\n")));
		Adapter->Duplex = (UINT) (ConfigurationParameter->ParameterData.IntegerData);
	}
	else
		Adapter->Duplex = 0;
				
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusNumber  = %d\r\n"), Adapter->BusNumber));
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusType    = %d\r\n"), Adapter->BusType));
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:IoBase     = %04x\r\n"), Adapter->IOBase));
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Interrupt  = %d\r\n"), Adapter->InterruptLevel));
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Duplex		= %d\r\n"), Adapter->Duplex));
		
	//See if user has defined new MAC address.
	NdisReadNetworkAddress((PNDIS_STATUS) &Status,
		(PVOID *) &NewNetworkAddress,
		&NewNetworkAddressLength,
		ConfigurationHandle);
				
	if((Status == NDIS_STATUS_SUCCESS) && (NewNetworkAddressLength != 0))
	{
		RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:H/W MAC Address over-ride!\r\n")));
		if((NewNetworkAddressLength != ETH_LENGTH_OF_ADDRESS)) 
		{
			RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Invalid MAC address length!\r\n")));
		}
		else
		{
				USHORT temp;
				temp = NewNetworkAddress[1] << 8;
				temp |= NewNetworkAddress[0];
				Adapter->MACAddress[0] = temp;
				temp = NewNetworkAddress[3] << 8;
				temp |= NewNetworkAddress[2];
				Adapter->MACAddress[1] = temp;
				temp = NewNetworkAddress[5] << 8;
				temp |= NewNetworkAddress[4];
				Adapter->MACAddress[2] = temp;
				
				RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New MAC Address = %04X%04X%04X\r\n"),
							Adapter->MACAddress[0],
							Adapter->MACAddress[1],
							Adapter->MACAddress[2]));				
		}
	}
	else
	{
		Status = NDIS_STATUS_SUCCESS;
	}
	NdisCloseConfiguration(ConfigurationHandle);
				
	if(Status != NDIS_STATUS_SUCCESS)
	{
			RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:ERROR: Specific Configuration Handler Failed!\r\n")));
			RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:<== Configure Adapter\r\n")));
			return(Status);
	}
	
	RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== GetRegistrySettings  \r\n")));
	return(Status);


}

/*

⌨️ 快捷键说明

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