📄 2410loader.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.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
--*/
/************************************************
* NAME : 2410loader.C *
* DESC : *
* History : 2002.02.25 ver 0.0 *
************************************************/
#include <stdlib.h>
#include <string.h>
#include "option.h"
#include "def.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h"
#include "2410addr.h"
#include "nand.h"
#include "loader.h"
#include "lcdlib.h"
#define SIGN_ON "\nWinCE NAND Boot v1.00\n" __DATE__ " " __TIME__ "\n"
// HMSEO : Please check UUID memory location from inc\drv_glob.h file.
unsigned char * pbUUID = ((unsigned char *) (0x30030000 + 0x4608));
U32 (*frameBuffer16BitTft640480)[SCR_XSIZE_TFT_640480/2];
//
// Globals
//
DWORD JumpAddr;
TOC toc; // made global because it's too big for our tiny stack
void _PutTft16Bit_640480(U32 x,U32 y,U32 c)
{
if(x<SCR_XSIZE_TFT_640480 && y<SCR_YSIZE_TFT_640480)
frameBuffer16BitTft640480[(y)][(x)/2]=( frameBuffer16BitTft640480[(y)]
[x/2]
& ~(0xffff0000>>((x)%2)*16) ) | ( (c&0x0000ffff)<<((2-1-((x)%2))*16) );
}
// -----------------------------------------------------------------------------
// ReadImageFromNand:
// Reads nk.nb0 off NAND
// Returns ERR_Xxx
// -----------------------------------------------------------------------------
void LcdDisplayPic(void)
{
int i,j;
BYTE Image_Buf[512];
rGPCUP=0xffffffff; // Disable Pull-up register
rGPCCON=0xaaaaaaaa; //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
rGPDUP=0xffffffff; // Disable Pull-up register
rGPDCON=0xaaaaaaaa; //Initialize VD[23:8]
frameBuffer16BitTft640480=(U32 (*)[SCR_XSIZE_TFT_640480/2])LCDFRAMEBUFFER;
rLCDCON1=(CLKVAL_TFT_640480<<8)|(MVAL_USED<<7)|(3<<5)|(12<<1)|0;
// TFT LCD panel,16bpp TFT,ENVID=off
rLCDCON2=(VBPD_640480<<24)|(LINEVAL_TFT_640480<<14)|(VFPD_640480<<6)|(VSPW_640480);
rLCDCON3=(HBPD_640480<<19)|(HOZVAL_TFT_640480<<8)|(HFPD_640480);
rLCDCON4=(MVAL<<8)|(HSPW_640480);
rLCDCON5=(1<<11)|(1<<9)|(1<<8); //FRM5:6:5,HSYNC and VSYNC are inverted
rLCDSADDR1=(((U32)frameBuffer16BitTft640480>>22)<<21)|M5D((U32)frameBuffer16BitTft640480>>1);
rLCDSADDR2=M5D( ((U32)frameBuffer16BitTft640480+(SCR_XSIZE_TFT_640480*LCD_YSIZE_TFT_640480*2))>>1 );
rLCDSADDR3=(((SCR_XSIZE_TFT_640480-LCD_XSIZE_TFT_640480)/1)<<11)|(LCD_XSIZE_TFT_640480/1);
rLCDINTMSK|=(3); // MASK LCD Sub Interrupt
rLPCSEL&=(~7); // Disable LPC3600
rTPAL=0; // Disable Temp Palette
//GPG4 is setted as LCD_PWREN
rGPGUP=rGPGUP&(~(1<<4))|(1<<4); // Pull-up disable
rGPGCON=rGPGCON&(~(3<<8))|(3<<8); //GPG4=LCD_PWREN
//Enable LCD POWER ENABLE Function
rLCDCON5=rLCDCON5&(~(1<<3))|(1<<3); // PWREN
rLCDCON5=rLCDCON5&(~(1<<5))|(0<<5); // INVPWREN
rLCDCON1|=1; // ENVID=ON
for(j=0;j<SCR_YSIZE_TFT_640480;j++)
for(i=0;i<SCR_XSIZE_TFT_640480;i++)
_PutTft16Bit_640480(i,j,0);
for (i=PIC_BASE_SECTOR;i<PIC_END_SECTOR;i++)
{
FMD_ReadSector(0+i, (LPBYTE)&Image_Buf, NULL , 1);
for (j=0;j<SECTOR_SIZE;j=j+2)
{
_PutTft16Bit_640480(((((i-PIC_BASE_SECTOR)*512+j)%512)/2)+192,96-(((i-PIC_BASE_SECTOR)*512+j)/512)+192,(Image_Buf[j+1]*256+Image_Buf[j]));
}
}
}
// -----------------------------------------------------------------------------
// ReadImageFromNand:
// Reads nk.nb0 off NAND
// Returns ERR_Xxx
// -----------------------------------------------------------------------------
void ReadImageFromNand(void)
{
BYTE Image_Buf[512];
DWORD Sram_Space;
DWORD i,j,k;
int isbad;
//Load image from Nand Flash
Uart_SendString("Loading");
Sram_Space=0;
k=0;
for (i=IMAGE_SECTOR_BASE;i<IMAGE_SECTOR_SIZE;i++)
{
isbad=0;
nextblock:
if ((i+k)%32==0)
{
isbad=NF_IsBadBlock((i+k)>>5);
if (isbad)
{
k+=32;
Uart_SendString("\nBad block \n");
goto nextblock;
}
}
FMD_ReadSector(0+i+k, (LPBYTE)&Image_Buf, NULL , 1);
for (j=0;j<SECTOR_SIZE;j++)
{
*((LPBYTE)(IMAGE_BASE+Sram_Space+j))=Image_Buf[j];
}
if (!(i&0x00000fff))
Uart_SendString(".");
Sram_Space=Sram_Space+SECTOR_SIZE;
}
//Uart_SendString("\nCopy Image Finished , Set up system...\n");
//Check Loaded data
/*Sram_Space=0;
for (i=IMAGE_SECTOR_BASE;i<IMAGE_SECTOR_SIZE;i++)
{
FMD_ReadSector(0+i, (LPBYTE)&Image_Buf, NULL , 1);
for (j=0;j<SECTOR_SIZE;j++)
{
if (*(IMAGE_BASE+(LPBYTE)(Sram_Space+j))!=Image_Buf[j])
{
err=ERR_IMAGE_CHKSUM;
return ERR_IMAGE_CHKSUM;
}
}
if (!(i&0x00000fff))
Uart_SendString(".");
Sram_Space=Sram_Space+SECTOR_SIZE;
}
if (err==ERR_SUCCESS)
Uart_SendString("\nCheck Summary OK\n");
else
Uart_SendString("\nCheck Summary Failed\n");*/
}
void Main(void)
{
// By default, we launch image CE image. If you want to launch
// Eboot, you need to hold down APP4 button (sw803) when it boots.
JumpAddr=0x30200000;
MMU_EnableICache();
Uart_Init();
Uart_SendString(SIGN_ON);
NF_Init();
LcdDisplayPic();
ReadImageFromNand();
Launch(JumpAddr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -