?? main.c
字號:
// 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(OAL_INFO, (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(OAL_INFO, (TEXT("Eboot image\r\n")));
g_ImageType = IMAGE_TYPE_LOADER; // Eboot 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;
}
// 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);
}
//***************************[ PORTS ]****************************************************
void Port_Init(void)
{
volatile S3C2440A_IOPORT_REG *s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
//CAUTION:Follow the configuration order for setting the ports.
// 1) setting value(GPnDAT)
// 2) setting control register (GPnCON)
// 3) configure pull-up resistor(GPnUP)
//32bit data bus configuration
//*** PORT A GROUP
//Ports : GPA22 GPA21 GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12
//Signal : nFCE nRSTOUT nFRE nFWE ALE CLE nGCS5 nGCS4 nGCS3 nGCS2 nGCS1
//Binary : 1 1 1 , 1 1 1 1 , 1 1 1 1
//Ports : GPA11 GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
//Binary : 1 1 1 1 , 1 1 1 1 , 1 1 1 1
s2440IOP->GPACON = 0x7fffff;
//**** PORT B GROUP
//Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
//Setting: INPUT OUTPUT INPUT OUTPUT INPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT
//Binary : 00 , 01 00 , 01 00 , 01 01 , 01 01 , 01 01
s2440IOP->GPBDAT |= 1<<3;
s2440IOP->GPBCON = 0x044555;
s2440IOP->GPBDN= 0x7ff; // The pull up function is disabled GPB[10:0]
//*** PORT C GROUP
//Ports : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7 GPC6 GPC5 GPC4 GPC3 GPC2 GPC1 GPC0
//Signal : VD7 VD6 VD5 VD4 VD3 VD2 VD1 VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10
s2440IOP->GPCCON = 0xaaaaaaaa;
s2440IOP->GPCDN= 0xffff; // The pull up function is disabled GPC[15:0]
s2440IOP->GPCCON |= (1<<16); //LED IO init
s2440IOP->GPCCON &= ~(1<<17);
//*** PORT D GROUP
//Ports : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
//Signal : VD23 VD22 VD21 VD20 VD19 VD18 VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9 VD8
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 ,10 10
s2440IOP->GPDCON = 0xaaaaaaaa;
s2440IOP->GPDDN = 0xffff; // The pull up function is disabled GPD[15:0]
//*** PORT E GROUP
//Ports : GPE15 GPE14 GPE13 GPE12 GPE11 GPE10 GPE9 GPE8 GPE7 GPE6 GPE5 GPE4
//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK IN
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 00 ,
//-------------------------------------------------------------------------------------------------------
//Ports : GPE3 GPE2 GPE1 GPE0
//Signal : IN IN IN IN
//Binary : 00 00 , 00 00
//rGPECON = 0xaaaaaaaa;
//rGPEUP = 0xffff; // The pull up function is disabled GPE[15:0]
s2440IOP->GPECON = 0xaaaaa800; // For added AC97 setting
s2440IOP->GPEDN = 0xffff;
//*** PORT F GROUP
//Ports : GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0
//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
//Setting: Output Output Output Output EINT3 EINT2 EINT1 EINT0
//Binary : 01 01 , 01 01 , 10 10 , 10 10
s2440IOP->GPFCON = 0x55a9; // 0x55aa
s2440IOP->GPFDN = 0xff; // The pull up function is disabled GPF[7:0]
//*** PORT G GROUP
//Ports : GPG15 GPG14 GPG13 GPG12 GPG11 GPG10 GPG9 GPG8 GPG7 GPG6
//Signal : nYPON YMON nXPON XMON EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
//Setting: nYPON YMON nXPON XMON EINT19 Output Output Output SPICLK1 SPIMOSI1
//Binary : 11 11 , 11 11 , 10 01 , 01 01 , 11 11
//-----------------------------------------------------------------------------------------
//Ports : GPG5 GPG4 GPG3 GPG2 GPG1 GPG0
//Signal : KBDSPIMISO LCD_PWREN EINT11 nSS_SPI IRQ_LAN IRQ_PCMCIA
//Setting: SPIMISO1 LCD_PWRDN EINT11 nSS0 EINT9 EINT8
//Binary : 11 11 , 10 11 , 10 10
s2440IOP->GPGCON = 0xff95ffba;
s2440IOP->GPGDN= 0xffff; // The pull up function is disabled GPG[15:0]
//*** PORT H GROUP
//Ports : GPH10 GPH9 GPH8 GPH7 GPH6 GPH5 GPH4 GPH3 GPH2 GPH1 GPH0
//Signal : CLKOUT1 CLKOUT0 UCLK nCTS1 nRTS1 RXD1 TXD1 RXD0 TXD0 nRTS0 nCTS0
//Binary : 10 , 10 10 , 11 11 , 10 10 , 10 10 , 10 10
s2440IOP->GPHCON = 0x2afaaa;
s2440IOP->GPHDN= 0x7ff; // The pull up function is disabled GPH[10:0]
s2440IOP->GPHCON &=~(3<<14);
s2440IOP->GPHCON |= (1<<14);
s2440IOP->GPHDN |= (1<<7);
s2440IOP->GPHDAT |= (1<<7);
s2440IOP->GPHCON =0x002A7AAA;
s2440IOP->GPHDN = 0x000007FF;
s2440IOP->GPHDAT =0xFFFFFFFF ;
// Added for S3C2442X, DonGo
//*** PORT J GROUP
//Ports : GPJ12 GPJ11 GPJ10 GPJ9 GPJ8 GPJ7 GPJ6 GPJ5 GPJ4 GPJ3 GPJ2 GPJ1 GPJ0
//Signal : CAMRESET CAMPCLKOUT CAMHREF CAMVSYNC CAMPCLKIN CAMDAT[7] CAMDAT[6] CAMDAT[5] CAMDAT[4] CAMDAT[3] CAMDAT[2] CAMDAT[1] CAMDAT[0]
//Binary : 10 10 10 10 10 10 10 10 10 10 10 10 10
s2440IOP->GPJCON = 0x02aaaaaa;
s2440IOP->GPJDN= 0x1fff; // The pull up function is disabled GPH[10:0]
//External interrupt will be falling edge triggered.
s2440IOP->EXTINT0 = 0x22222222; // EINT[7:0]
s2440IOP->EXTINT1 = 0x22222222; // EINT[15:8]
s2440IOP->EXTINT2 = 0x22222222; // EINT[23:16]
}
void Led_Display(int data)
{
// Active is low.(LED On)
// GPF7 GPF6 GPF5 GPF4
// nLED_8 nLED4 nLED_2 nLED_1
//
// rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
volatile S3C2440A_IOPORT_REG *s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
if (data)
{
s2440IOP->GPCDAT |= (1<<8);
}
else
{
s2440IOP->GPCDAT &= ~(1<<8);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -