oemboot.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 125 行

C
125
字号
/*

  Copyright(c) 1998,1999 SIC/Hitachi,Ltd.

	Module Name:

		OEMBOOT.C

	Revision History:

		26th April 1999		Released
		25th June  1999		Modified for Controlling Eboot.bin size

*/
#include <windows.h>
#include <nkintr.h>
#include <memory.h>
#include "rev.h"

#include "shx.h"
#include "s1.h"
#include "drv_glob.h"

// include debug serial support from hal
#define BOOT_LOADER  // To avoid including debug ethernet support
#include "..\..\kernel\hal\shx\debug.c"

// include parallel port support from hal
volatile unsigned int *PtrCurMSec;      /* current millisecond counter */
typedef volatile DWORD *PVDWORD;    /* pointer to a volatile dword */

unsigned int CurMSec_dummy=0;			// dummy curmsec variable
										// kernel is not running, but some of the included hal functions
										// rely on curmsec for timeouts.

#define REG(base,off) (*(volatile unsigned int*)(base+off))

const char Dummy[0x100000] = {0};

/*
 * Initialize the display HW.  Assume we are in an unknown state, power the
 * display down, initialize the frame buffer, and power back up.  Display
 * ALDER bitmap image while kernel is booting.
 */
static void
InitDisplay()
{
}

//***************************************************************************
// PowerOnSelfTest
//
//
//***************************************************************************
unsigned int PowerOnSelfTest(void) {

    EdbgOutputDebugString("Microsoft Windows CE Ethernet Bootloader %d.%d\n",
                       EBOOT_VERSION_MAJOR,EBOOT_VERSION_MINOR);
    EdbgOutputDebugString("Copyright(c) 1998,1999 SIC/Hitachi,Ltd.\n");

	PtrCurMSec=&CurMSec_dummy;			// setup pointer to curmsec so hal functions will work

	return 1;
}

#define BCD(X) (((X)%10) | (((X)/10)<<4))
#define DEC(X) (((X)&0xf) + (((X)>>4)*10))
#define BCD2(X) ( (((X)/1000)<<12) | (((X%1000)/100)<<8) | (((X%100)/10)<<4) | ((X)%10) )
#define DEC2(X) (((X)&0xf) + ((((X)&0x00f0)>>4)*10) + ((((X)&0x0f00)>>8)*100) + ((((X)&0xf000)>>12)*1000) )

/*
	@func	BOOL | OEMGetRealTime | Get the time from the realtime clock
	@rdesc	none
	@comm 	OEMGetRealTime is called by the Kernel to get the time from the
			real time clock.  This function can be called reentrantly, and
			thus must protect the hardware from multiple accesses.
*/
BOOL OEMGetRealTime(
    LPSYSTEMTIME lpst	// @parm pointer to memory to return current time
)
{
	WRITE_REGISTER_UCHAR(RTC_RCR1, READ_REGISTER_UCHAR(RTC_RCR1) & (~RTC_RCR1_CIE));		// clear CIE flag
	
	do {
		WRITE_REGISTER_UCHAR(RTC_RCR1, READ_REGISTER_UCHAR(RTC_RCR1) & (~RTC_RCR1_CF));	// clear carry flag
		lpst->wMilliseconds = 0;
		lpst->wSecond = DEC(READ_REGISTER_UCHAR(RTC_RSECCNT));
		lpst->wMinute = DEC(READ_REGISTER_UCHAR(RTC_RMINCNT));
		lpst->wHour = DEC(READ_REGISTER_UCHAR(RTC_RHRCNT));
		lpst->wDayOfWeek = READ_REGISTER_UCHAR(RTC_RWKCNT);
		lpst->wDay = DEC(READ_REGISTER_UCHAR(RTC_RDAYCNT));
		lpst->wMonth = DEC(READ_REGISTER_UCHAR(RTC_RMONCNT));
		lpst->wYear = DEC2(READ_REGISTER_USHORT(RTC_RYRCNT));
	} while (READ_REGISTER_UCHAR(RTC_RCR1) & RTC_RCR1_CF);								// carry occurred

	return TRUE;
}

/*
	@func	BOOL | OEMSetRealTime | Set the realtime clock
	@rdesc	none
	@comm 	OEMSetRealTime is called by the Kernel to set the real time clock.
			This function can be called reentrantly, and thus must protect the
			hardware from multiple accesses.
*/
BOOL OEMSetRealTime(
    LPSYSTEMTIME lpst	// @parm pointer to new time
)
{
	WRITE_REGISTER_UCHAR(RTC_RCR2, READ_REGISTER_UCHAR(RTC_RCR2) & (~RTC_RCR2_START));	// stop clock
	WRITE_REGISTER_UCHAR(RTC_RCR2, READ_REGISTER_UCHAR(RTC_RCR2) | RTC_RCR2_RESET);	// reset clock

	WRITE_REGISTER_UCHAR(RTC_RSECCNT, BCD(lpst->wSecond));
	WRITE_REGISTER_UCHAR(RTC_RMINCNT, BCD(lpst->wMinute));
	WRITE_REGISTER_UCHAR(RTC_RHRCNT, BCD(lpst->wHour));
	WRITE_REGISTER_UCHAR(RTC_RWKCNT, (BYTE)lpst->wDayOfWeek);
	WRITE_REGISTER_UCHAR(RTC_RDAYCNT, BCD(lpst->wDay));
	WRITE_REGISTER_UCHAR(RTC_RMONCNT, BCD(lpst->wMonth));
	WRITE_REGISTER_USHORT(RTC_RYRCNT, BCD2(lpst->wYear));

	WRITE_REGISTER_UCHAR(RTC_RCR2, READ_REGISTER_UCHAR(RTC_RCR2) | RTC_RCR2_START);	// start clock

	return TRUE;
}

⌨️ 快捷键说明

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