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

📄 main.c

📁 支持三星原产的S3C2413开发板
💻 C
📖 第 1 页 / 共 5 页
字号:
		switch (g_ImageType) {
			case IMAGE_TYPE_STEPLDR:
				OALMSG(TRUE, (TEXT("Don't support launch STEPLDR.bin\r\n")));
				break;
			
			case IMAGE_TYPE_EBOOT:
				OALMSG(TRUE, (TEXT("Don't support launch EBOOT.bin\r\n")));
				break;

			case IMAGE_TYPE_NKBIN:
				OALMSG(TRUE, (TEXT("OEMPlatformInit: IMAGE_TYPE_NKBIN\r\n")));
				if ( !ReadOSImageFromBootMedia( ) ) 
				{
					OALMSG(OAL_ERROR, (TEXT("OEMPlatformInit ERROR: Failed to load kernel region into RAM.\r\n")));
					return FALSE;
				}
				break;

			default:
				OALMSG(OAL_ERROR, (TEXT("OEMPlatformInit ERROR: unknown image type: 0x%x \r\n"), g_ImageType));
				return FALSE;
		}
	}

	
	// Configure Ethernet controller.
	//
	if ( g_bDownloadImage && (g_bUSBDownload ==FALSE) )
	{

		if (!InitEthDevice(g_pBootCfg))
		{
			OALMSG(OAL_ERROR, (TEXT("ERROR: OEMPlatformInit: Failed to initialize Ethernet controller.\r\n")));
			goto CleanUp;
		}
	}
	
	
	bResult = TRUE;

CleanUp:

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


/*
	@func   DWORD | OEMPreDownload | Complete pre-download tasks - get IP address, initialize TFTP, etc.
	@rdesc  BL_DOWNLOAD = Platform Builder is asking us to download an image, BL_JUMP = Platform Builder is requesting we jump to an existing image, BL_ERROR = Failure.
	@comm	
	@xref   
*/
DWORD OEMPreDownload(void)
{
	BOOL  bGotJump = FALSE;
	DWORD dwDHCPLeaseTime = 0;
	PDWORD pdwDHCPLeaseTime = &dwDHCPLeaseTime;
	DWORD dwBootFlags = 0;

	OALMSG(OAL_FUNC, (TEXT("+OEMPreDownload.\r\n")));

	// Create device name based on Ethernet address (this is how Platform Builder identifies this device).
	//
	OALKitlCreateName(BSP_DEVICE_PREFIX, pBSPArgs->kitl.mac, pBSPArgs->deviceId);
	OALMSG(OAL_INFO, (L"INFO: *** Device Name '%hs' ***\r\n", pBSPArgs->deviceId));

	if ( g_bUSBDownload == FALSE )
	{
		// If the user wants to use a static IP address, don't request an address 
		// from a DHCP server.  This is done by passing in a NULL for the DHCP 
		// lease time variable.  If user specified a static IP address, use it (don't use DHCP).
		//
		if (!(g_pBootCfg->ConfigFlags & CONFIG_FLAGS_DHCP))
		{
			// Static IP address.
			pBSPArgs->kitl.ipAddress = g_pBootCfg->EdbgAddr.dwIP;
			pBSPArgs->kitl.ipMask	 = g_pBootCfg->SubnetMask;
			pBSPArgs->kitl.flags	 &= ~OAL_KITL_FLAGS_DHCP;
			pdwDHCPLeaseTime = NULL;
			OALMSG(OAL_INFO, (TEXT("INFO: Using static IP address %s.\r\n"), inet_ntoa(pBSPArgs->kitl.ipAddress))); 
			OALMSG(OAL_INFO, (TEXT("INFO: Using subnet mask %s.\r\n"),	   inet_ntoa(pBSPArgs->kitl.ipMask))); 
		}
		else
		{
			pBSPArgs->kitl.ipAddress = 0;
			pBSPArgs->kitl.ipMask	= 0;
		}

		if ( !g_bDownloadImage)
		{
			return(BL_JUMP);
		}

		// Initialize the the TFTP transport.
		//
		g_DeviceAddr.dwIP = pBSPArgs->kitl.ipAddress;
		memcpy(g_DeviceAddr.wMAC, pBSPArgs->kitl.mac, (3 * sizeof(UINT16)));
		g_DeviceAddr.wPort = 0;

		if (!EbootInitEtherTransport(&g_DeviceAddr,
									 &pBSPArgs->kitl.ipMask,
									 &bGotJump,
									 pdwDHCPLeaseTime,
									 EBOOT_VERSION_MAJOR,
									 EBOOT_VERSION_MINOR,
									 BSP_DEVICE_PREFIX,
									 pBSPArgs->deviceId,
									 EDBG_CPU_ARM720,
									 dwBootFlags))
		{
			OALMSG(OAL_ERROR, (TEXT("ERROR: OEMPreDownload: Failed to initialize Ethernet connection.\r\n")));
			return(BL_ERROR);
		}


		// If the user wanted a DHCP address, we presumably have it now - save it for the OS to use.
		//
		if (g_pBootCfg->ConfigFlags & CONFIG_FLAGS_DHCP)
		{
			// DHCP address.
			pBSPArgs->kitl.ipAddress  = g_DeviceAddr.dwIP;
			pBSPArgs->kitl.flags	 |= OAL_KITL_FLAGS_DHCP;
		}
			
			OALMSG(1, (TEXT("_OEMPreDownload.\r\n")));
	}
	else
	{
		OALMSG(TRUE, (TEXT("Please send the Image through USB.\r\n"))); 
	}

	return(bGotJump ? BL_JUMP : BL_DOWNLOAD);
}


/*
	@func   BOOL | OEMReadData | Generically read download data (abstracts actual transport read call).
	@rdesc  TRUE = Success, FALSE = Failure.
	@comm	
	@xref   
*/
BOOL OEMReadData(DWORD dwData, PUCHAR pData)
{
/*
	OALMSG(OAL_FUNC, (TEXT("+OEMReadData.\r\n")));
	return(EbootEtherReadData(dwData, pData));
*/
// the following is from 2440 magneto. - 0106
	BOOL ret;
	int i;
	if ( g_bUSBDownload == FALSE )
	{
//		OALMSG(TRUE, (TEXT("\r\nINFO: dwData = %x, pData = %x\r\n"), dwData, pData));
		ret = EbootEtherReadData(dwData, pData);
//		OALMSG(TRUE, (TEXT("\r\n")));
//		for ( i = 0; i < dwData; i++ )
//		{
//			OALMSG(TRUE, (TEXT("<%x>"), *(pData+i)));
//			if ( i % 16 == 15 )
//				OALMSG(TRUE, (TEXT("\r\n")));
//		}
//		OALMSG(TRUE, (TEXT("\r\n")));

	    return(ret);
	}
	else
	{
//		OALMSG(TRUE, (TEXT("\r\nINFO: dwData = %x, pData = %x\r\n"), dwData, pData));
		ret = UbootReadData(dwData, pData);
//		OALMSG(TRUE, (TEXT("\r\n")));
//		for ( i = 0; i < dwData; i++ )
//		{
//			OALMSG(TRUE, (TEXT("<%x>"), *(pData+i)));
//			if ( i % 16 == 15 )
//				OALMSG(TRUE, (TEXT("\r\n")));
//		}
//		OALMSG(TRUE, (TEXT("\r\n")));
		return(ret);
	}
}


/*
	@func   void | OEMShowProgress | Displays download progress for the user.
	@rdesc  N/A.
	@comm	
	@xref   
*/
void OEMShowProgress(DWORD dwPacketNum)
{
	OALMSG(OAL_FUNC, (TEXT("+OEMShowProgress.\r\n")));
}


/*
	@func   void | OEMLaunch | Executes the stored/downloaded image.
	@rdesc  N/A.
	@comm	
	@xref   
*/

void OEMLaunch( DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr, const ROMHDR *pRomHdr )
{
	DWORD dwPhysLaunchAddr;
	EDBG_ADDR EshellHostAddr;
	EDBG_OS_CONFIG_DATA *pCfgData;	

	OALMSG(1, (TEXT("+OEMLaunch.\r\n")));
	//OALMSG(TRUE, (TEXT("+OEMLaunch.\r\n")));

	// If the user requested that a disk image (stored in RAM now) be written to the SmartMedia card, so it now.
	//
	if (g_bDownloadImage && (g_pBootCfg->ConfigFlags & TARGET_TYPE_NAND))
	{
		// Since this platform only supports RAM images, the image cache address is the same as the image RAM address.
		//

		switch (g_ImageType) 
		{
			case IMAGE_TYPE_STEPLDR:
				if (!WriteRawImageToBootMedia(dwImageStart, dwImageLength, dwLaunchAddr))
				{
					//OALMSG(OAL_ERROR, (TEXT("ERROR: OEMLaunch: Failed to store image to Smart Media.\r\n")));
					goto CleanUp;
				}

				// DonGo
				//Mark_BadBlock(NBOOT_BLOCK, NBOOT_BLOCK+NBOOT_BLOCK_SIZE-1);
				//Mark_BadBlock(TOC_BLOCK, TOC_BLOCK+TOC_BLOCK_SIZE-1);

				OALMSG(TRUE, (TEXT("INFO: Step loader image stored to Smart Media.  Please Reboot.  Halting...\r\n")));
				while(1)
				{
					// Wait...
				}
				break;
			
			case IMAGE_TYPE_EBOOT:
				g_pTOC->id[0].dwLoadAddress = dwImageStart;
				g_pTOC->id[0].dwTtlSectors = FILE_TO_SECTOR_SIZE(dwImageLength);
				if (!WriteRawImageToBootMedia(dwImageStart, dwImageLength, dwLaunchAddr))
				{
					OALMSG(OAL_ERROR, (TEXT("ERROR: OEMLaunch: Failed to store image to Smart Media.\r\n")));
					goto CleanUp;
				}
				if (dwLaunchAddr && (g_pTOC->id[0].dwJumpAddress != dwLaunchAddr))
				{
					g_pTOC->id[0].dwJumpAddress = dwLaunchAddr;
					if ( !TOC_Write() ) {
						EdbgOutputDebugString("*** OEMLaunch ERROR: TOC_Write failed! Next boot may not load from disk *** \r\n");
					}
					// DonGo
					//Mark_BadBlock(EBOOT_BLOCK, EBOOT_BLOCK+EBOOT_BLOCK_SIZE-1);
					//Mark_BadBlock(TOC_BLOCK, TOC_BLOCK+TOC_BLOCK_SIZE-1);
					
					TOC_Print();
				}
				
				OALMSG(TRUE, (TEXT("INFO: Eboot image stored to Smart Media.  Please Reboot.  Halting...\r\n")));
				while(1)
				{
					// Wait...
				}				
								
				break;

			case IMAGE_TYPE_NKBIN:
				g_pTOC->id[g_dwTocEntry].dwLoadAddress = dwImageStart;
				g_pTOC->id[g_dwTocEntry].dwTtlSectors = FILE_TO_SECTOR_SIZE(dwImageLength);
				if (!WriteOSImageToBootMedia(dwImageStart, dwImageLength, dwLaunchAddr))
				{
					OALMSG(OAL_ERROR, (TEXT("ERROR: OEMLaunch: Failed to store image to Smart Media.\r\n")));
					goto CleanUp;
				}

				if (dwLaunchAddr && (g_pTOC->id[g_dwTocEntry].dwJumpAddress != dwLaunchAddr))
				{
					g_pTOC->id[g_dwTocEntry].dwJumpAddress = dwLaunchAddr;
					if ( !TOC_Write() ) {
						EdbgOutputDebugString("*** OEMLaunch ERROR: TOC_Write failed! Next boot may not load from disk *** \r\n");
					}
					TOC_Print();
				}
				else
				{
					dwLaunchAddr= g_pTOC->id[g_dwTocEntry].dwJumpAddress;
					EdbgOutputDebugString("INFO: using TOC[%d] dwJumpAddress: 0x%x\r\n", g_dwTocEntry, dwLaunchAddr);
				}
								
				break;
		}
	}
	else if(g_bDownloadImage)
	{
		switch (g_ImageType) 
		{
			case IMAGE_TYPE_STEPLDR:
				//OALMSG(TRUE, (TEXT("Stepldr image can't launch from ram.\r\n")));
				//OALMSG(TRUE, (TEXT("You should program it into flash.\r\n")));
				SpinForever();
				break;
			case IMAGE_TYPE_EBOOT:
				//OALMSG(TRUE, (TEXT("Eboot image can't launch from ram.\r\n")));
				//OALMSG(TRUE, (TEXT("You should program it into flash.\r\n")));
				SpinForever();
				break;
			default:
				break;
		}
	}

	OALMSG(1, (TEXT("waitforconnect\r\n")));
	// Wait for Platform Builder to connect after the download and send us IP and port settings for service
	// connections - also sends us KITL flags.  This information is used later by the OS (KITL).
	//
	#if 1
	if (g_bDownloadImage && g_bWaitForConnect)
	{
		memset(&EshellHostAddr, 0, sizeof(EDBG_ADDR));

		g_DeviceAddr.dwIP  = pBSPArgs->kitl.ipAddress;
		memcpy(g_DeviceAddr.wMAC, pBSPArgs->kitl.mac, (3 * sizeof(UINT16)));
		g_DeviceAddr.wPort = 0;

		if (!(pCfgData = EbootWaitForHostConnect(&g_DeviceAddr, &EshellHostAddr)))
		{
			//OALMSG(1, (TEXT("ERROR: OEMLaunch: EbootWaitForHostConnect failed.\r\n")));
			goto CleanUp;
		}

		// If the user selected "passive" KITL (i.e., don't connect to the target at boot time), set the
		// flag in the args structure so the OS image can honor it when it boots.
		//
		if (pCfgData->KitlTransport & KTS_PASSIVE_MODE)
		{
			pBSPArgs->kitl.flags |= OAL_KITL_FLAGS_PASSIVE;
		}
	}
	#endif
	// If a launch address was provided, we must have downloaded the image, save the address in case we
	// want to jump to this image next time.  If no launch address was provided, retrieve the last one.
	//
	if (dwLaunchAddr && (g_pTOC->id[g_dwTocEntry].dwJumpAddress != dwLaunchAddr))
	{
		g_pTOC->id[g_dwTocEntry].dwJumpAddress = dwLaunchAddr;
	}
	else
	{
		dwLaunchAddr= g_pTOC->id[g_dwTocEntry].dwJumpAddress;
		OALMSG(OAL_INFO, (TEXT("INFO: using TOC[%d] dwJumpAddress: 0x%x\r\n"), g_dwTocEntry, dwLaunchAddr));
	}

	// Jump to downloaded image (use the physical address since we'll be turning the MMU off)...
	//
	dwPhysLaunchAddr = (DWORD)OALVAtoPA((void *)dwLaunchAddr);
	OALMSG(TRUE, (TEXT("INFO: OEMLaunch: Jumping to Physical Address 0x%Xh (Virtual Address 0x%Xh)...\r\n\r\n\r\n"), dwPhysLaunchAddr, dwLaunchAddr));

	// Jump...
	//
	Launch(dwPhysLaunchAddr);


CleanUp:

	OALMSG(TRUE, (TEXT("ERROR: OEMLaunch: Halting...\r\n")));
	SpinForever();
}


//------------------------------------------------------------------------------
//
//  Function Name:  OEMVerifyMemory( DWORD dwStartAddr, DWORD dwLength )
//  Description..:  This function verifies the passed address range lies
//				  within a valid region of memory. Additionally this function
//				  sets the g_ImageType if the image is a boot loader. 
//  Inputs.......:  DWORD		   Memory start address
//				  DWORD		   Memory length
//  Outputs......:  BOOL - true if verified, false otherwise
//
//------------------------------------------------------------------------------

BOOL OEMVerifyMemory( DWORD dwStartAddr, DWORD dwLength )
{

	OALMSG(OAL_FUNC, (TEXT("+OEMVerifyMemory.\r\n")));

	// Is the image being downloaded the stepldr?
	if ((dwStartAddr >= STEPLDR_RAM_IMAGE_BASE) &&
		((dwStartAddr + dwLength - 1) < (STEPLDR_RAM_IMAGE_BASE + STEPLDR_RAM_IMAGE_SIZE)))
	{
		OALMSG(1, (TEXT("Stepldr image\r\n")));
		g_ImageType = IMAGE_TYPE_STEPLDR;	 // Stepldr image.
		return TRUE;
	}
	// Is the image being downloaded the bootloader?
	else if ((dwStartAddr >= EBOOT_STORE_ADDRESS) &&
		((dwStartAddr + dwLength - 1) < (EBOOT_STORE_ADDRESS + EBOOT_STORE_MAX_LENGTH)))
	{
		OALMSG(1, (TEXT("Eboot image\r\n")));
		g_ImageType = IMAGE_TYPE_EBOOT;	 // Eboot image.
		return TRUE;
	}

	// Is it a ram image?
	else if ((dwStartAddr >= ROM_RAMIMAGE_START) &&
		((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE  + 0x10000000)))
	{
		OALMSG(1, (TEXT("RAM image\r\n")));
		g_ImageType = IMAGE_TYPE_NKBIN;
		return TRUE;
	}
	else if (!dwStartAddr && !dwLength)
	{
		OALMSG(TRUE, (TEXT("Don't support raw image\r\n")));
		g_ImageType = IMAGE_TYPE_RAWBIN;
		return FALSE;
	}

	// HACKHACK: get around MXIP images with funky addresses
	OALMSG(TRUE, (TEXT("BIN image type unknow\r\n")));

#if 1
	OALMSG(TRUE, (TEXT("dwStartAddr, dwLength=%xh,%xh\r\n"), dwStartAddr, dwLength));
#endif

	OALMSG(OAL_FUNC, (TEXT("_OEMVerifyMemory.\r\n")));

	return FALSE;
}

/*
	@func   void | OEMMultiBINNotify | Called by blcommon to nofity the OEM code of the number, size, and location of one or more BIN regions,
									   this routine

⌨️ 快捷键说明

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