main.c

来自「SAMSUNG S3C6410 CPU BSP for winmobile6」· C语言 代码 · 共 1,638 行 · 第 1/4 页

C
1,638
字号
BOOL OEMVerifyMemory( DWORD dwStartAddr, DWORD dwLength )
{
    OALMSG(OAL_FUNC, (TEXT("+OEMVerifyMemory.\r\n")));
    OALMSG(TRUE, (TEXT("dwStartAddr = 0x%x \r\n"), dwStartAddr));
    OALMSG(TRUE, (TEXT("dwLength = 0x%x \r\n"), dwLength));

    // 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(TRUE, (TEXT("Stepldr image\r\n")));
        g_ImageType = IMAGE_TYPE_STEPLDR;     // Stepldr image.
        return TRUE;
    }
    // Is the image being downloaded the block0 image?
	if ((dwStartAddr >= BLOCK0_RAM_IMAGE_BASE) &&
        ((dwStartAddr + dwLength - 1) < (BLOCK0_RAM_IMAGE_BASE + BLOCK0_RAM_IMAGE_SIZE)))
    {
        OALMSG(TRUE, (TEXT("Block0 image\r\n")));
        g_ImageType = IMAGE_TYPE_STEPLDR;     // block0 image.
        return TRUE;
    }
	// Is the image being downloaded the IPL?
	else if ((dwStartAddr >= IPL_RAM_IMAGE_BASE) &&
		((dwStartAddr + dwLength - 1) < (IPL_RAM_IMAGE_BASE + IPL_RAM_IMAGE_SIZE)))
	{
		OALMSG(TRUE, (TEXT("Ipl image\r\n")));
		g_ImageType = IMAGE_TYPE_IPL;     // Ipl image.
		return TRUE;
	}
    // Is the image being downloaded the superipl?
	if ((dwStartAddr >= SUPERIPL_RAM_IMAGE_BASE) &&
        ((dwStartAddr + dwLength - 1) < (SUPERIPL_RAM_IMAGE_BASE + SUPERIPL_RAM_IMAGE_SIZE)))
    {
        OALMSG(TRUE, (TEXT("SuperIpl image\r\n")));
        g_ImageType = IMAGE_TYPE_SUPERIPL;     // 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(TRUE, (TEXT("Eboot image\r\n")));
		g_ImageType = IMAGE_TYPE_LOADER;     // Eboot image.
		return TRUE;
	}
    // Is the image being downloaded the dio.nb0?
//	else if (dwStartAddr == 0)
//    {
//        OALMSG(TRUE, (TEXT("dio.nb0 image\r\n")));
//        g_ImageType = IMAGE_TYPE_DIONB0;     // dio.nb0 image.
//        return TRUE;
//    }
	// Is it a dio image?
//	else if ((dwStartAddr >= NAND_ROM_IMAGE_BASE) &&
//		((dwStartAddr + dwLength - 1) < (NAND_ROM_IMAGE_BASE + NAND_ROM_IMAGE_SIZE)))
//	{
//		OALMSG(OAL_INFO, (TEXT("DIO image\r\n")));
//		g_ImageType = IMAGE_TYPE_DIO;     // dio image.
//		return TRUE;
//	}
	// Is it a ram image?
//	else if ((dwStartAddr >= ROM_RAMIMAGE_START) &&
//		((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE)))
//	{
//		OALMSG(OAL_INFO, (TEXT("RAM image\r\n")));
//		g_ImageType = IMAGE_TYPE_RAMIMAGE;
//		return TRUE;
//	}
	else if (!dwStartAddr && !dwLength)
	{
		OALMSG(TRUE, (TEXT("Don't support raw image\r\n")));
		g_ImageType = IMAGE_TYPE_RAWBIN;
		return FALSE;
	}
	else
	{
		OALMSG(TRUE, (TEXT("Flash bin image\r\n")));
		g_ImageType = IMAGE_TYPE_FLASHBIN;
		return TRUE;
	}

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

    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 collects the information and uses it when temporarily caching a flash image in RAM prior to final storage.
    @rdesc  N/A.
    @comm
    @xref
*/
void OEMMultiBINNotify(const PMultiBINInfo pInfo)
{
    BYTE nCount;
	DWORD g_dwMinImageStart;

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

    if (!pInfo || !pInfo->dwNumRegions)
    {
        OALMSG(OAL_WARN, (TEXT("WARNING: OEMMultiBINNotify: Invalid BIN region descriptor(s).\r\n")));
        return;
    }

	if (!pInfo->Region[0].dwRegionStart && !pInfo->Region[0].dwRegionLength)
	{
    	return;
	}

    g_dwMinImageStart = pInfo->Region[0].dwRegionStart;

    OALMSG(TRUE, (TEXT("\r\nDownload BIN file information:\r\n")));
    OALMSG(TRUE, (TEXT("-----------------------------------------------------\r\n")));
    for (nCount = 0 ; nCount < pInfo->dwNumRegions ; nCount++)
    {
        OALMSG(TRUE, (TEXT("[%d]: Base Address=0x%x  Length=0x%x\r\n"),
            nCount, pInfo->Region[nCount].dwRegionStart, pInfo->Region[nCount].dwRegionLength));
        if (pInfo->Region[nCount].dwRegionStart < g_dwMinImageStart)
        {
            g_dwMinImageStart = pInfo->Region[nCount].dwRegionStart;
            if (g_dwMinImageStart == 0)
            {
                OALMSG(OAL_WARN, (TEXT("WARNING: OEMMultiBINNotify: Bad start address for region (%d).\r\n"), nCount));
                return;
            }
        }
    }

    memcpy((LPBYTE)&g_BINRegionInfo, (LPBYTE)pInfo, sizeof(MultiBINInfo));

    OALMSG(TRUE, (TEXT("-----------------------------------------------------\r\n")));
    OALMSG(OAL_FUNC, (TEXT("_OEMMultiBINNotify.\r\n")));
}

/////////////////////// START - Stubbed functions - START //////////////////////////////
/*
    @func   void | SC_WriteDebugLED | Write to debug LED.
    @rdesc  N/A.
    @comm
    @xref
*/

void SC_WriteDebugLED(USHORT wIndex, ULONG dwPattern)
{
    // Stub - needed by NE2000 EDBG driver...
    //
}


ULONG HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
                            IN ULONG BusNumber,
                            IN ULONG SlotNumber,
                            IN PVOID Buffer,
                            IN ULONG Offset,
                            IN ULONG Length)
{
    return(0);
}


ULONG
HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
                      IN ULONG BusNumber,
                      IN ULONG SlotNumber,
                      IN PVOID Buffer,
                      IN ULONG Offset,
                      IN ULONG Length)
{
    return(0);
}


BOOLEAN HalTranslateBusAddress(IN INTERFACE_TYPE  InterfaceType,
                               IN ULONG BusNumber,
                               IN PHYSICAL_ADDRESS BusAddress,
                               IN OUT PULONG AddressSpace,
                               OUT PPHYSICAL_ADDRESS TranslatedAddress)
{

    // All accesses on this platform are memory accesses...
    //
    if (AddressSpace)
        *AddressSpace = 0;

    // 1:1 mapping...
    //
    if (TranslatedAddress)
    {
        *TranslatedAddress = BusAddress;
        return(TRUE);
    }

    return(FALSE);
}


PVOID MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress,
                   IN ULONG NumberOfBytes,
                   IN BOOLEAN CacheEnable)
{
    DWORD dwAddr = PhysicalAddress.LowPart;

    if (CacheEnable)
        dwAddr &= ~CACHED_TO_UNCACHED_OFFSET;
    else
        dwAddr |= CACHED_TO_UNCACHED_OFFSET;

    return((PVOID)dwAddr);
}


VOID MmUnmapIoSpace(IN PVOID BaseAddress,
                    IN ULONG NumberOfBytes)
{
}

VOID WINAPI SetLastError(DWORD dwErrCode)
{
}
/////////////////////// END - Stubbed functions - END //////////////////////////////


/*
    @func   PVOID | GetKernelExtPointer | Locates the kernel region's extension area pointer.
    @rdesc  Pointer to the kernel's extension area.
    @comm
    @xref
*/
PVOID GetKernelExtPointer(DWORD dwRegionStart, DWORD dwRegionLength)
{
    DWORD dwCacheAddress = 0;
    ROMHDR *pROMHeader;
    DWORD dwNumModules = 0;
    TOCentry *pTOC;

    if (dwRegionStart == 0 || dwRegionLength == 0)
        return(NULL);

    if (*(LPDWORD) OEMMapMemAddr (dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET) != ROM_SIGNATURE)
        return NULL;

    // A pointer to the ROMHDR structure lives just past the ROM_SIGNATURE (which is a longword value).  Note that
    // this pointer is remapped since it might be a flash address (image destined for flash), but is actually cached
    // in RAM.
    //
    dwCacheAddress = *(LPDWORD) OEMMapMemAddr (dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET + sizeof(ULONG));
    pROMHeader     = (ROMHDR *) OEMMapMemAddr (dwRegionStart, dwCacheAddress);

    // Make sure sure are some modules in the table of contents.
    //
    if ((dwNumModules = pROMHeader->nummods) == 0)
        return NULL;

    // Locate the table of contents and search for the kernel executable and the TOC immediately follows the ROMHDR.
    //
    pTOC = (TOCentry *)(pROMHeader + 1);

    while(dwNumModules--) {
        LPBYTE pFileName = OEMMapMemAddr(dwRegionStart, (DWORD)pTOC->lpszFileName);
        if (!strcmp((const char *)pFileName, "nk.exe")) {
            return ((PVOID)(pROMHeader->pExtensions));
        }
        ++pTOC;
    }
    return NULL;
}


/*
    @func   BOOL | OEMDebugInit | Initializes the serial port for debug output message.
    @rdesc  TRUE == Success and FALSE == Failure.
    @comm
    @xref
*/
BOOL OEMDebugInit(void)
{

    // Set up function callbacks used by blcommon.
    //
    g_pOEMVerifyMemory   = OEMVerifyMemory;      // Verify RAM.
    g_pOEMMultiBINNotify = OEMMultiBINNotify;

    // Call serial initialization routine (shared with the OAL).
    //
    OEMInitDebugSerial();

    return(TRUE);
}

static void InitializeDisplay(void)
{
	tDevInfo RGBDevInfo;

	volatile S3C6410_GPIO_REG *pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
	volatile S3C6410_DISPLAY_REG *pDispReg = (S3C6410_DISPLAY_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_DISPLAY, FALSE);
	volatile S3C6410_SPI_REG *pSPIReg = (S3C6410_SPI_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SPI0, FALSE);
	volatile S3C6410_MSMIF_REG *pMSMIFReg = (S3C6410_MSMIF_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_MSMIF_SFR, FALSE);

#if	(CPU_NAME == S3C6410)
	volatile S3C6410_SYSCON_REG *pSysConReg = (S3C6410_SYSCON_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_SYSCON, FALSE);
#endif
	EdbgOutputDebugString("[Eboot] ++InitializeDisplay()\r\n");
#if	(CPU_NAME == S3C6410)
	// Initialize Display Power Gating
	if(!(pSysConReg->BLK_PWR_STAT & (1<<4))) {
		pSysConReg->NORMAL_CFG |= (1<<14);
		while(!(pSysConReg->BLK_PWR_STAT & (1<<4)));
		}
#endif

	// Initialize Virtual Address
	LDI_initialize_register_address((void *)pSPIReg, (void *)pDispReg, (void *)pGPIOReg);
	Disp_initialize_register_address((void *)pDispReg, (void *)pMSMIFReg, (void *)pGPIOReg);

	// Set LCD Module Type
#if		(SMDK6410_LCD_MODULE == LCD_MODULE_LTS222)
	LDI_set_LCD_module_type(LDI_LTS222QV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_LTV350)
	LDI_set_LCD_module_type(LDI_LTV350QV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_LTE480)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_EMUL48_D1)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_EMUL48_QV)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_EMUL48_PQV)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_EMUL48_ML)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_EMUL48_MP)
	LDI_set_LCD_module_type(LDI_LTE480WV_RGB);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_LTP700)
	LDI_set_LCD_module_type(LDI_LTP700WV_RGB);
#else
	EdbgOutputDebugString("[Eboot:ERR] InitializeDisplay() : Unknown Module Type [%d]\r\n", SMDK6410_LCD_MODULE);
#endif

	// Get RGB Interface Information from LDI Library
	LDI_fill_output_device_information(&RGBDevInfo);
	// Setup Output Device Information
	Disp_set_output_device_information(&RGBDevInfo);

	// Initialize Display Controller
	Disp_initialize_output_interface(DISP_VIDOUT_RGBIF);

#if		(LCD_BPP == 16)
	Disp_set_window_mode(DISP_WIN1_DMA, DISP_16BPP_565, LCD_WIDTH, LCD_HEIGHT, 0, 0);
#elif	(LCD_BPP == 32)	// XRGB format (RGB888)
	Disp_set_window_mode(DISP_WIN1_DMA, DISP_24BPP_888, LCD_WIDTH, LCD_HEIGHT, 0, 0);
#else
	EdbgOutputDebugString("[Eboot:ERR] InitializeDisplay() : Unknown Color Depth %d bpp\r\n", LCD_BPP);
#endif

	Disp_set_framebuffer(DISP_WIN1, IMAGE_FRAMEBUFFER_PA_START);
	Disp_window_onfoff(DISP_WIN1, DISP_WINDOW_ON);

#if	(SMDK6410_LCD_MODULE == LCD_MODULE_LTS222)
	// This type of LCD need MSM I/F Bypass Mode to be Disabled
	pMSMIFReg->MIFPCON &= ~(0x1<<3);	// SEL_BYPASS -> Normal Mode
#endif

	// Initialize LCD Module
	LDI_initialize_LCD_module();

	// Video Output Enable
	Disp_envid_onoff(DISP_ENVID_ON);

	// Fill Framebuffer
#if	(SMDK6410_LCD_MODULE == LCD_MODULE_LTV350)
	memcpy((void *)IMAGE_FRAMEBUFFER_UA_START, (void *)InitialImage_rgb16_320x240, 320*240*2);
#elif	(SMDK6410_LCD_MODULE == LCD_MODULE_EMULQV)
	memcpy((void *)IMAGE_FRAMEBUFFER_UA_START, (void *)InitialImage_rgb16_320x240, 320*240*2);
#elif	(LCD_BPP == 16)
	{
		int i;
		unsigned short *pFB;
		pFB = (unsigned short *)IMAGE_FRAMEBUFFER_UA_START;

		for (i=0; i<LCD_WIDTH*LCD_HEIGHT; i++)
			*pFB++ = 0x001F;		// Blue
	}
#elif	(LCD_BPP == 32)
	{
		int i;
		unsigned int *pFB;
		pFB = (unsigned int *)IMAGE_FRAMEBUFFER_UA_START;

		for (i=0; i<LCD_WIDTH*LCD_HEIGHT; i++)
			*pFB++ = 0x000000FF;		// Blue
	}
#endif

	// TODO:
	// Backlight Power On
	//Set PWM GPIO to control Back-light  Regulator  Shotdown Pin (GPF[15])
	pGPIOReg->GPFDAT |= (1<<15);
	pGPIOReg->GPFCON = (pGPIOReg->GPFCON & ~(3<<30)) | (1<<30);	// set GPF[15] as Output

	EdbgOutputDebugString("[Eboot] --InitializeDisplay()\r\n");
}

⌨️ 快捷键说明

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