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

📄 2410loader.c

📁 arm s3c2410的nboot源码,用于启动2410
💻 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 + -