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

📄 ether.c

📁 支持三星原产的S3C2413开发板
💻 C
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//

#include <windows.h>
#include <halether.h>
#define __OAL_ETHDRV_H	// Temporary: clean up build warning until EDBG prototypes are moved.
#include <bsp.h>
#include "loader.h"

#define FROM_BCD(n)	((((n) >> 4) * 10) + ((n) & 0xf))
#define TO_BCD(n)	  ((((n) / 10) << 4) | ((n) % 10))

// Function pointers to the support library functions of the currently installed debug ethernet controller.
//
PFN_EDBG_INIT			 pfnEDbgInit;
PFN_EDBG_ENABLE_INTS	  pfnEDbgEnableInts;
PFN_EDBG_DISABLE_INTS	 pfnEDbgDisableInts;
PFN_EDBG_GET_PENDING_INTS pfnEDbgGetPendingInts;
PFN_EDBG_GET_FRAME		pfnEDbgGetFrame;
PFN_EDBG_SEND_FRAME	   pfnEDbgSendFrame;
PFN_EDBG_READ_EEPROM	  pfnEDbgReadEEPROM;
PFN_EDBG_WRITE_EEPROM	 pfnEDbgWriteEEPROM;
PFN_EDBG_SET_OPTIONS	  pfnEDbgSetOptions;

// Function prototypes.
//
BOOL	CS8900DBG_Init(PBYTE iobase, DWORD membase, USHORT MacAddr[3]);
UINT16  CS8900DBG_GetFrame(PBYTE pbData, UINT16 *pwLength);
UINT16  CS8900DBG_SendFrame(PBYTE pbData, DWORD dwLength);


/*
	@func   BOOL | InitEthDevice | Initializes the Ethernet device to be used for download.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL InitEthDevice(PBOOT_CFG pBootCfg)
{
	PBYTE  pBaseIOAddress = NULL;
	UINT32 MemoryBase = 0;  
	BOOL bResult = FALSE;
	volatile S3C2413_EBI_REG *s2413EBI = (S3C2413_EBI_REG *)OALPAtoVA(S3C2413_BASE_REG_PA_EBICTRL, FALSE);
	volatile S3C2413_SSMCCTRL_REG *s2413SSMC = (S3C2413_SSMCCTRL_REG *)OALPAtoVA(S3C2413_BASE_REG_PA_SSMCCTRL, FALSE);
	volatile S3C2413_CLKPWR_REG *s2413CLKPWR = (S3C2413_CLKPWR_REG *)OALPAtoVA(S3C2413_BASE_REG_PA_CLOCK_POWER, FALSE);
	
	OALMSG(TRUE, (TEXT("+InitEthDevice.\r\n")));

	s2413CLKPWR->CLKDIVN = s2413CLKPWR->CLKDIVN | (1<<5);
	// EBI set for SROM
	s2413EBI->BANK_CFG = s2413EBI->BANK_CFG & ~((1<<4)|(1<<5));

	s2413SSMC->SMBIDCYR5 = 0x0;
	s2413SSMC->SMBWSTWRR5= 0xe;
	s2413SSMC->SMBWSTOENR5=0x4;
	s2413SSMC->SMBWSTWENR5=0x4;
	
	s2413SSMC->SMBWSTRDR5 = 0xe;
	s2413SSMC->SMBCR5 |= ((1<<2)|(1<<0));
	//rSMBCR5 |= ((1<<2));
	s2413SSMC->SMBCR5 &= ~((3<<20)|(3<<20)|(3<<12));
	s2413SSMC->SMBCR5 &= ~(3<<4);
	s2413SSMC->SMBCR5 |= (1<<4);
	//s2413SSMC->SMBCR5 = 0x15;
	/*
	RETAILMSG(1, (TEXT("s2413SSMC->SMBWSTRDR5=%x\r\n"), s2413SSMC->SMBWSTRDR5));
	RETAILMSG(1, (TEXT("s2413SSMC->SMBIDCYR5=%x\r\n"), s2413SSMC->SMBIDCYR5));
	RETAILMSG(1, (TEXT("s2413SSMC->SMBWSTWRR5=%x\r\n"), s2413SSMC->SMBWSTWRR5));	
	RETAILMSG(1, (TEXT("s2413SSMC->SMBWSTOENR5=%x\r\n"), s2413SSMC->SMBWSTOENR5));
	RETAILMSG(1, (TEXT("s2413SSMC->SMBWSTWENR5=%x\r\n"), s2413SSMC->SMBWSTWENR5));	
	RETAILMSG(1, (TEXT("s2413SSMC->SMBWSTRDR5=%x\r\n"), s2413SSMC->SMBWSTRDR5));
	RETAILMSG(1, (TEXT("s2413SSMC->SMBCR5=%x\r\n"), s2413SSMC->SMBCR5));

	RETAILMSG(1, (TEXT("s2413EBI->BANK_CFG=%x\r\n"), s2413EBI->BANK_CFG));
	RETAILMSG(1, (TEXT("s2413CLKPWR->CLKDIVN=%x\r\n"), s2413CLKPWR->CLKDIVN));
	*/
	// Use the MAC address programmed into flash by the user.
	//
	memcpy(pBSPArgs->kitl.mac, pBootCfg->EdbgAddr.wMAC, 6);

	// Use the CS8900A Ethernet controller for download.
	//
	pfnEDbgInit	  = CS8900DBG_Init;
	pfnEDbgGetFrame  = CS8900DBG_GetFrame;
	pfnEDbgSendFrame = CS8900DBG_SendFrame;

	pBaseIOAddress   = (PBYTE)OALPAtoVA(pBSPArgs->kitl.devLoc.LogicalLoc, FALSE);
	MemoryBase	   = (UINT32)OALPAtoVA(BSP_BASE_REG_PA_CS8900A_MEMBASE, FALSE);

	OALMSG(TRUE, (TEXT("+InitEthDevice pBaseIOAddress = %x(%x).\r\n"), pBaseIOAddress, pBSPArgs->kitl.devLoc.LogicalLoc));
	OALMSG(TRUE, (TEXT("+InitEthDevice MemoryBase = %x(%x)\r\n"), MemoryBase, BSP_BASE_REG_PA_CS8900A_MEMBASE));

	// Initialize the Ethernet controller.
	//
	if (!pfnEDbgInit((PBYTE)pBaseIOAddress, MemoryBase, pBSPArgs->kitl.mac))
	{
		OALMSG(OAL_ERROR, (TEXT("ERROR: InitEthDevice: Failed to initialize Ethernet controller.\r\n")));
		goto CleanUp;
	}

	// Make sure MAC address has been programmed.
	//
	if (!pBSPArgs->kitl.mac[0] && !pBSPArgs->kitl.mac[1] && !pBSPArgs->kitl.mac[2])
	{
		OALMSG(OAL_ERROR, (TEXT("ERROR: InitEthDevice: Invalid MAC address.\r\n")));
		goto CleanUp;
	}

	bResult = TRUE;

CleanUp:

	OALMSG(OAL_FUNC, (TEXT("-InitEthDevice.\r\n")));
	return(bResult);
}


/*
	@func   BOOL | OEMGetRealTime | Returns the current wall-clock time from the RTC.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
static BOOL OEMGetRealTime(LPSYSTEMTIME lpst) 
{
	volatile S3C2413_RTC_REG *s2413RTC = (S3C2413_RTC_REG *)OALPAtoVA(S3C2413_BASE_REG_PA_RTC, FALSE);

	do
	{
		lpst->wYear		 = FROM_BCD(s2413RTC->BCDYEAR) + 2000 ;
		lpst->wMonth		= FROM_BCD(s2413RTC->BCDMON   & 0x1f);
		lpst->wDay		  = FROM_BCD(s2413RTC->BCDDAY   & 0x3f);

		lpst->wDayOfWeek	= (s2413RTC->BCDDATE - 1);

		lpst->wHour		 = FROM_BCD(s2413RTC->BCDHOUR  & 0x3f);
		lpst->wMinute	   = FROM_BCD(s2413RTC->BCDMIN   & 0x7f);
		lpst->wSecond	   = FROM_BCD(s2413RTC->BCDSEC   & 0x7f);
		lpst->wMilliseconds = 0;
	}
	while (!(lpst->wSecond));

	return(TRUE);
}


/*
	@func   DWORD | OEMEthGetSecs | Returns a free-running seconds count.
	@rdesc  Number of elapsed seconds since last roll-over.
	@comm	
	@xref   
*/
DWORD OEMEthGetSecs(void)
{
	SYSTEMTIME sTime;

	OEMGetRealTime(&sTime);
	return((60UL * (60UL * (24UL * (31UL * sTime.wMonth + sTime.wDay) + sTime.wHour) + sTime.wMinute)) + sTime.wSecond);
}


/*
	@func   BOOL | OEMEthGetFrame | Reads data from the Ethernet device.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL OEMEthGetFrame(PUCHAR pData, PUSHORT pwLength)
{
	return(pfnEDbgGetFrame(pData, pwLength));
}


/*
	@func   BOOL | OEMEthSendFrame | Writes data to an Ethernet device.
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL OEMEthSendFrame(PUCHAR pData, DWORD dwLength)
{
	BYTE Retries = 0;

	while (Retries++ < 4)
	{
		if (!pfnEDbgSendFrame(pData, dwLength))
			return(TRUE);

		EdbgOutputDebugString("INFO: OEMEthSendFrame: retrying send (%u)\r\n", Retries);
	}

	return(FALSE);
}

⌨️ 快捷键说明

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