📄 main.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.
//
//
//
// 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.
//
#include <windows.h>
#include <bsp.h>
#include <ethdbg.h>
#include <fmd.h>
#include "loader.h"
#include "display.h"
#include "DisplaySample_320_240.h"
// For USB Download function.
extern BOOL UbootReadData (DWORD cbData, LPBYTE pbData);
extern BOOL InitUSB ();
extern void Isr_Init();
#if 0
extern void Isr_SpiInit();
extern void SpiKeyboardTest();
#endif
// For USB Download function.
char *inet_ntoa(DWORD dwIP);
DWORD inet_addr( char *pszDottedD );
BOOL EbootInitEtherTransport (EDBG_ADDR *pEdbgAddr, LPDWORD pdwSubnetMask,
BOOL *pfJumpImg,
DWORD *pdwDHCPLeaseTime,
UCHAR VersionMajor, UCHAR VersionMinor,
char *szPlatformString, char *szDeviceName,
UCHAR CPUId, DWORD dwBootFlags);
BOOL EbootEtherReadData (DWORD cbData, LPBYTE pbData);
EDBG_OS_CONFIG_DATA *EbootWaitForHostConnect (EDBG_ADDR *pDevAddr, EDBG_ADDR *pHostAddr);
void SaveEthernetAddress();
// End ***************************************
// Globals
//
DWORD g_ImageType;
MultiBINInfo g_BINRegionInfo;
PBOOT_CFG g_pBootCfg;
UCHAR g_TOC[SECTOR_SIZE];
const PTOC g_pTOC = (PTOC)&g_TOC;
DWORD g_dwImageStartBlock;
DWORD g_dwTocEntry;
BOOL g_bBootMediaExist = FALSE;
BOOL g_bDownloadImage = TRUE;
BOOL g_bWaitForConnect = TRUE;
BOOLEAN g_bUSBDownload = FALSE;
EDBG_ADDR g_DeviceAddr; // NOTE: global used so it remains in scope throughout download process
// since eboot library code keeps a global pointer to the variable provided.
DWORD wNUM_BLOCKS;
// External definitions.
//
extern const BYTE ScreenBitmap[];
/*
@func void | SpinForever | Halts execution (used in error conditions).
@rdesc
@comm
@xref
*/
static void SpinForever(void)
{
EdbgOutputDebugString("SpinForever...\r\n");
while(1)
{
;
}
}
/*
@func void | main | Samsung bootloader C routine entry point.
@rdesc N/A.
@comm
@xref
*/
void MemoryTest_Function(void)
{
// UINT32 startaddress;
UINT32 addr;
// 1. 0x30100000 ~ 0x33ffffff : 0x0 => clear with 0x00 write -> read verify
for (addr = 0x30200000; addr <= 0x31200000 ; addr += 4)
{
*(UINT32 *)addr = 0x00;
}
for (addr = 0x30200000; addr <= 0x31200000 ; addr += 4)
{
if(*(UINT32 *)addr != 0x00)
{
//WriteDebugLED(0, 0x1);
while(1);
}
}
//while(1);
}
void main(void)
{
//MemoryTest_Function();
BootloaderMain();
// Should never get here.
//
SpinForever();
}
/*
@func void | InitDisplay | Initializes the LCD controller and displays a splashscreen image.
@rdesc N/A.
@comm
@xref
*/
#if 1
void delayLoop(int count)
{
volatile int j;
for(j = 0; j < count; j++) ;
}
void Write_LDI_LTV350(int address, int data)
{
volatile S3C2443_IOPORT_REG *s2443IOP = (S3C2443_IOPORT_REG *)OALPAtoVA(S3C2443_BASE_REG_PA_IOPORT, FALSE);
volatile S3C2443_LCD_REG *s2443LCD = (S3C2443_LCD_REG *)OALPAtoVA(S3C2443_BASE_REG_PA_LCD, FALSE);
UINT8 dev_id_code=0x1D;
int j;
unsigned char DELAY=50;
LCD_DEN_Hi; // EN = High CS high
LCD_DCLK_Hi; // SCL High
LCD_DSERI_Hi; // Data Low
delayLoop(DELAY);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
for (j = 5; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((dev_id_code >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
// RS = "0" : index data
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
// Write
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
for (j = 15; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((address >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
LCD_DSERI_Hi;
delayLoop(DELAY);
LCD_DEN_Hi; // EN = High
delayLoop(DELAY*10);
LCD_DEN_Lo; // EN = Low CS Low
delayLoop(DELAY);
for (j = 5; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((dev_id_code >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
// RS = "1" instruction data
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Hi;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
// Write
LCD_DCLK_Lo; // CLOCK = Low
LCD_DSERI_Lo;
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
for (j = 15; j >= 0; j--)
{
LCD_DCLK_Lo; // SCL Low
if ((data >> j) & 0x0001) // DATA HIGH or LOW
{
LCD_DSERI_Hi;
}
else
{
LCD_DSERI_Lo;
}
delayLoop(DELAY);
LCD_DCLK_Hi; // CLOCK = High
delayLoop(DELAY);
}
LCD_DEN_Hi; // EN = High
delayLoop(DELAY);
}
#define LTV350 (TRUE)
void InitLDI_LTV350(void)
{
volatile S3C2443_IOPORT_REG *s2443IOP = (S3C2443_IOPORT_REG *)OALPAtoVA(S3C2443_BASE_REG_PA_IOPORT, FALSE);
volatile S3C2443_LCD_REG *s2443LCD = (S3C2443_LCD_REG *)OALPAtoVA(S3C2443_BASE_REG_PA_LCD, FALSE);
// LCD module reset
s2443IOP->GPBDAT |= (1<<(LCD_nRESET*2));
s2443IOP->GPBDAT &= ~(1<<(LCD_nRESET*2)); // goes to LOW
// delay about 5ms
delayLoop(LCD_DELAY_1MS*10);
s2443IOP->GPBDAT |= (1<<(LCD_nRESET*2)); // goes to HIGH
//SET_CONFIG_PORT( spi1)
s2443IOP->GPLCON &= ~(((3<<(LCD_DEN_BIT*2))) | ((3<<(LCD_DCLK_BIT*2))) | ((3<<(LCD_DSERI_BIT*2))));
s2443IOP->GPLCON |= (((1<<(LCD_DEN_BIT*2))) | ((1<<(LCD_DCLK_BIT*2))) | ((1<<(LCD_DSERI_BIT*2))));
// pull-up pull-down disable
s2443IOP->GPLUDP &= ~(((3<<(LCD_DEN_BIT*2))) | ((3<<(LCD_DCLK_BIT*2))) | ((3<<(LCD_DSERI_BIT*2))));
s2443IOP->GPLUDP |= (((1<<(LCD_DEN_BIT*2))) | ((1<<(LCD_DCLK_BIT*2))) | ((1<<(LCD_DSERI_BIT*2))));
// delay about 5ms
delayLoop(LCD_DELAY_1MS*10);
LCD_DEN_Hi;
LCD_DCLK_Hi;
LCD_DSERI_Hi;
///////////////////////////////////////////////////////////////////
// Init_Lcd_Function
//////////////////////////////////////////////////////////////////
#if LTV350
Write_LDI_LTV350(0x01,0x001d);
Write_LDI_LTV350(0x02,0x0000);
Write_LDI_LTV350(0x03,0x0000);
Write_LDI_LTV350(0x04,0x0000);
Write_LDI_LTV350(0x05,0x50a3);
Write_LDI_LTV350(0x06,0x0000);
Write_LDI_LTV350(0x07,0x0000);
Write_LDI_LTV350(0x08,0x0000);
Write_LDI_LTV350(0x09,0x0000);
Write_LDI_LTV350(0x0a,0x0000);
Write_LDI_LTV350(0x10,0x0000);
Write_LDI_LTV350(0x11,0x0000);
Write_LDI_LTV350(0x12,0x0000);
Write_LDI_LTV350(0x13,0x0000);
Write_LDI_LTV350(0x14,0x0000);
Write_LDI_LTV350(0x15,0x0000);
Write_LDI_LTV350(0x16,0x0000);
Write_LDI_LTV350(0x17,0x0000);
Write_LDI_LTV350(0x18,0x0000);
Write_LDI_LTV350(0x19,0x0000);
#else
Write_LDI_LTV350(0x09,0x0000);
#endif
///////////////////////////////////////////////////////////////////
// Power On Reset Display off State
//////////////////////////////////////////////////////////////////
//Write_LDI_LTV350(0x09,0x0000);
// delay about 10ms
delayLoop(LCD_DELAY_1MS*10);
///////////////////////////////////////////////////////////////////
// Power Setting Function 1
//////////////////////////////////////////////////////////////////
#if LTV350
Write_LDI_LTV350(0x09,0x4055);
Write_LDI_LTV350(0x0a,0x0000);
#else
Write_LDI_LTV350(0x09,0x4055);
Write_LDI_LTV350(0x0a,0x2000);
#endif
// delay about 10ms
delayLoop(LCD_DELAY_1MS*10);
/////////////////////////////////////////////////////////////////////
// Power Setting 2
/////////////////////////////////////////////////////////////////////
#if LTV350
Write_LDI_LTV350(0x0a,0x2000);
#else
Write_LDI_LTV350(0x09,0x4055);
#endif
// delay about 50ms
delayLoop(LCD_DELAY_1MS*50);
///////////////////////////////////////////////////////////////////
// Instruction Setting
///////////////////////////////////////////////////////////////////
#if LTV350
Write_LDI_LTV350(0x01,0x409d);
Write_LDI_LTV350(0x02,0x0204);
Write_LDI_LTV350(0x03,0x2100);
Write_LDI_LTV350(0x04,0x1000);
Write_LDI_LTV350(0x05,0x5003);
Write_LDI_LTV350(0x06,0x0009); //vbp
Write_LDI_LTV350(0x07,0x000f); //hbp
Write_LDI_LTV350(0x08,0x0800);
Write_LDI_LTV350(0x10,0x0000);
Write_LDI_LTV350(0x11,0x0000);
Write_LDI_LTV350(0x12,0x000f);
Write_LDI_LTV350(0x13,0x1f00);
Write_LDI_LTV350(0x14,0x0000);
Write_LDI_LTV350(0x15,0x0000);
Write_LDI_LTV350(0x16,0x0000);
Write_LDI_LTV350(0x17,0x0000);
Write_LDI_LTV350(0x18,0x0000);
Write_LDI_LTV350(0x19,0x0000);
#else
Write_LDI_LTV350(0x01,0x409d);
Write_LDI_LTV350(0x02,0x0204);
Write_LDI_LTV350(0x03,0x0100);
Write_LDI_LTV350(0x04,0x3000);
Write_LDI_LTV350(0x05,0x4003);
Write_LDI_LTV350(0x06,0x0009); //vbp
Write_LDI_LTV350(0x07,0x000f); //hbp
Write_LDI_LTV350(0x08,0x0c00);
Write_LDI_LTV350(0x10,0x0103);
Write_LDI_LTV350(0x11,0x0301);
Write_LDI_LTV350(0x12,0x1f0f);
Write_LDI_LTV350(0x13,0x1f0f);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -