亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? imgboot.c

?? 老外的一個開源項目
?? C
?? 第 1 頁 / 共 2 頁
字號:
// Copyright (c) David Vescovi.  All rights reserved.
// Part of Project DrumStix
// Windows Embedded Developers Interest Group (WE-DIG) community project.
// http://www.we-dig.org
// Copyright (c) Microsoft Corporation.  All rights reserved.
// Portions Copyright (c) SanDisk Corporation.  All rights reserved.
// Portions Copyright (c) BSQUARE Corporation.  All rights reserved.
//------------------------------------------------------------------------------
//
//  File:  imgboot.c
//
//  Storage device based image boot routines for the bootloader.
//
//------------------------------------------------------------------------------

#include <windows.h>
#include <oal_memory.h>
#include <ceddk.h>
#include "bsp.h"
#include "loader.h"
#include "mmcapi.h"
#include "mmcfldr.h"
#include "fat.h"


MMCF_DEVICE  BootDisk;


#include <pshpack1.h>		// byte packing
typedef struct _BINFILE_HEADER {
    UCHAR       SyncBytes[7];
    ULONG       ImageAddress;
    ULONG       ImageLength;
} BINFILE_HEADER, *PBINFILE_HEADER;

typedef struct _BINFILE_RECORD_HEADER {
    ULONG       LoadAddress;
    ULONG       Length;
    ULONG       CheckSum;
} BINFILE_RECORD_HEADER, *PBINFILE_RECORD_HEADER;
#include <poppack.h>

ULONG ReadSectors(IN ULONG Sector, IN ULONG Count,OUT PUCHAR SectorBuf);

static
void msWait(UINT32 msVal) 
{
    OALStall(msVal*1000);
}


static
void transposeString(PUCHAR pucIn, PUCHAR pucOut, ULONG size)
{	// swap odd and even bytes
	while(size > 1)
	{
		*pucOut++ = *(pucIn+1);
		*pucOut++ = *(pucIn);
		pucIn++;
		pucIn++;
		size--;
		size--;
	}
	if(size == 1)
	{ // pad
		*pucOut++ = 0x20;
		*pucOut++ = *pucIn;
	}
}


static
ULONG CFWaitForDisk( IN UCHAR WaitMask )
{
ULONG i;
UCHAR Status;
ATA_CMDREG *CmdReg = (ATA_CMDREG *)BootDisk.CmdBase;

//
// Poll the status register 100000 times with a 10 us retry interval
// before giving up.
//
	for (i = 0; i < 100000; i++)
	{
		OALStall(10);
		Status = CmdReg->Status;
		if (!(Status & ATA_STATUS_BUSY) && (Status & WaitMask))
		{
			return Status;
		}
	}

    DEBUGMSG(1, (L"CFWaitForDisk timeout.\r\n"));
	DEBUGMSG(1, (L"    Status = 0x%.2x\r\n",Status));
	DEBUGMSG(1, (L"    Error = 0x%.2x\r\n",CmdReg->Error));
	DEBUGMSG(1, (L"    SecCount = 0x%.2x\r\n",CmdReg->SecCount));
	DEBUGMSG(1, (L"    SecNum = 0x%.2x\r\n",CmdReg->SecNum));
	DEBUGMSG(1, (L"    CylinderLo = 0x%.2x\r\n",CmdReg->CylinderLo));
	DEBUGMSG(1, (L"    CylinderHi = 0x%.2x\r\n",CmdReg->CylinderHi));
	DEBUGMSG(1, (L"    Head = 0x%.2x\r\n",CmdReg->Head));

	return Status | 0x80000000;
}


ULONG CFIdend( void )
{
PUSHORT pIDData;
UCHAR ucMsg[128];
ULONG i;
IDENTIFY_DATA cfIdentifyData;
ULONG ulWaitStatus;
ATA_CMDREG *CmdReg = (ATA_CMDREG *)BootDisk.CmdBase;

// Identify the drive by writing 0xEC to the command register
// and 0xA0 to the drive/head register.
	*((PUSHORT)&CmdReg->Head) = 0xECA0;
	ulWaitStatus = CFWaitForDisk(ATA_STATUS_DATA_REQ);
	if((ulWaitStatus & 0x80000000) != 0)
	{
		DEBUGMSG(1, (L"CFIdent: Status reg is stuck busy or has no data: 0x%8.8X\r\n", ulWaitStatus));
		return(ulWaitStatus);
	}
    if((ulWaitStatus & 0x00000001) != 0)
    {
		DEBUGMSG(1, (L"CFIdent: error 0x%8.8X\r\n", ulWaitStatus));
		return(ulWaitStatus);
    }
    pIDData = (PUSHORT)&cfIdentifyData;
    for(i=0; i < (sizeof(IDENTIFY_DATA)/2); i++)
    {
		*(pIDData++) = *((PUSHORT)&CmdReg->Data);
		OALStall(5);
    }

    DEBUGMSG(1,(L"i=%d\r\n",i));
    DEBUGMSG(1, (L"CFIdent: [00]ID.GeneralConfiguration        : 0x%4.4X\r\n", cfIdentifyData.GeneralConfiguration        ));
    DEBUGMSG(1, (L"CFIdent: [01]ID.NumberOfCylinders           : 0x%4.4X\r\n", cfIdentifyData.NumberOfCylinders           ));
    DEBUGMSG(1, (L"CFIdent: [02]ID.Reserved1                   : 0x%4.4X\r\n", cfIdentifyData.Reserved1                   ));
    DEBUGMSG(1, (L"CFIdent: [03]ID.NumberOfHeads               : 0x%4.4X\r\n", cfIdentifyData.NumberOfHeads               ));
    DEBUGMSG(1, (L"CFIdent: [04]ID.UnformattedBytesPerTrack    : 0x%4.4X\r\n", cfIdentifyData.UnformattedBytesPerTrack    ));
    DEBUGMSG(1, (L"CFIdent: [05]ID.UnformattedBytesPerSector   : 0x%4.4X\r\n", cfIdentifyData.UnformattedBytesPerSector   ));
    DEBUGMSG(1, (L"CFIdent: [06]ID.SectorsPerTrack             : 0x%4.4X\r\n", cfIdentifyData.SectorsPerTrack             ));
    DEBUGMSG(1, (L"CFIdent: [07]ID.VendorUnique1[0]            : 0x%4.4X\r\n", cfIdentifyData.VendorUnique1[0]            ));
    DEBUGMSG(1, (L"CFIdent: [08]ID.VendorUnique1[1]            : 0x%4.4X\r\n", cfIdentifyData.VendorUnique1[1]            ));
    DEBUGMSG(1, (L"CFIdent: [09]ID.VendorUnique1[2]            : 0x%4.4X\r\n", cfIdentifyData.VendorUnique1[2]            ));
	transposeString((PUCHAR)cfIdentifyData.SerialNumber, ucMsg, sizeof(cfIdentifyData.SerialNumber));
	DEBUGMSG(1, (L"CFIdent: [10]ID.SerialNumber[10]            : %20.20S\r\n", ucMsg                                      ));
    DEBUGMSG(1, (L"CFIdent: [20]ID.BufferType                  : 0x%4.4X\r\n", cfIdentifyData.BufferType                  ));
    DEBUGMSG(1, (L"CFIdent: [21]ID.BufferSectorSize            : 0x%4.4X\r\n", cfIdentifyData.BufferSectorSize            ));
    DEBUGMSG(1, (L"CFIdent: [22]ID.NumberOfEccBytes            : 0x%4.4X\r\n", cfIdentifyData.NumberOfEccBytes            ));
	transposeString((PUCHAR)cfIdentifyData.FirmwareRevision, ucMsg, sizeof(cfIdentifyData.FirmwareRevision));
	DEBUGMSG(1, (L"CFIdent: [23]ID.FirmwareRevision[4]         : %8.8S\r\n",ucMsg                                         ));
	transposeString((PUCHAR)cfIdentifyData.ModelNumber, ucMsg, sizeof(cfIdentifyData.ModelNumber));
	DEBUGMSG(1, (L"CFIdent: [27]ID.ModelNumber[20]             : %40.40S\r\n", ucMsg                                      ));
    DEBUGMSG(1, (L"CFIdent: [47]ID.MaximumBlockTransfer        : 0x%2.2X\r\n", cfIdentifyData.MaximumBlockTransfer        ));
    DEBUGMSG(1, (L"CFIdent: [47]ID.VendorUnique2               : 0x%2.2X\r\n", cfIdentifyData.VendorUnique2               ));
    DEBUGMSG(1, (L"CFIdent: [48]ID.DoubleWordIo                : 0x%4.4X\r\n", cfIdentifyData.DoubleWordIo                ));
    DEBUGMSG(1, (L"CFIdent: [49]ID.Capabilities                : 0x%4.4X\r\n", cfIdentifyData.Capabilities                ));
    DEBUGMSG(1, (L"CFIdent: [50]ID.Reserved2                   : 0x%4.4X\r\n", cfIdentifyData.Reserved2                   ));
    DEBUGMSG(1, (L"CFIdent: [51]ID.VendorUnique3               : 0x%2.2X\r\n", cfIdentifyData.VendorUnique3               ));
    DEBUGMSG(1, (L"CFIdent: [51]ID.PioCycleTimingMode          : 0x%2.2X\r\n", cfIdentifyData.PioCycleTimingMode          ));
    DEBUGMSG(1, (L"CFIdent: [52]ID.VendorUnique4               : 0x%2.2X\r\n", cfIdentifyData.VendorUnique4               ));
    DEBUGMSG(1, (L"CFIdent: [52]ID.DmaCycleTimingMode          : 0x%2.2X\r\n", cfIdentifyData.DmaCycleTimingMode          ));
    DEBUGMSG(1, (L"CFIdent: [53]ID.TranslationFieldsValid      : 0x%4.4X\r\n", cfIdentifyData.TranslationFieldsValid      ));
    DEBUGMSG(1, (L"CFIdent: [54]ID.NumberOfCurrentCylinders    : 0x%4.4X\r\n", cfIdentifyData.NumberOfCurrentCylinders    ));
    DEBUGMSG(1, (L"CFIdent: [55]ID.NumberOfCurrentHeads        : 0x%4.4X\r\n", cfIdentifyData.NumberOfCurrentHeads        ));
    DEBUGMSG(1, (L"CFIdent: [56]ID.CurrentSectorsPerTrack      : 0x%4.4X\r\n", cfIdentifyData.CurrentSectorsPerTrack      ));
    DEBUGMSG(1, (L"CFIdent: [57]ID.CurrentSectorCapacity       : 0x%8.8X\r\n", cfIdentifyData.CurrentSectorCapacity       ));
    DEBUGMSG(1, (L"CFIdent: [59]ID.MultiSectorCount            : 0x%2.2X\r\n", cfIdentifyData.MultiSectorCount            ));
    DEBUGMSG(1, (L"CFIdent: [59]ID.MultiSectorSettingValid     : 0x%2.2X\r\n", cfIdentifyData.MultiSectorSettingValid     ));
    DEBUGMSG(1, (L"CFIdent: [60]ID.TotalUserAddressableSectors : 0x%8.8X\r\n", cfIdentifyData.TotalUserAddressableSectors ));
    DEBUGMSG(1, (L"CFIdent: [62]ID.SingleDmaModesSupported     : 0x%2.2X\r\n", cfIdentifyData.SingleDmaModesSupported     ));
    DEBUGMSG(1, (L"CFIdent: [62]ID.SingleDmaTransferActive     : 0x%2.2X\r\n", cfIdentifyData.SingleDmaTransferActive     ));
    DEBUGMSG(1, (L"CFIdent: [63]ID.MultiDmaModesSupported      : 0x%2.2X\r\n", cfIdentifyData.MultiDmaModesSupported      ));
    DEBUGMSG(1, (L"CFIdent: [63]ID.MultiDmaTransferActive      : 0x%2.2X\r\n", cfIdentifyData.MultiDmaTransferActive      ));
	return 0;
}


ULONG CFReadSectors(
	IN ULONG Sector,
	IN ULONG Count,
	OUT PUCHAR SectorBuf
	)
{
ULONG RetVal = 0;
ULONG WaitResult;
ULONG i;
UCHAR Status;
USHORT CFData;
ATA_CMDREG *CmdReg = (ATA_CMDREG *)BootDisk.CmdBase;

	if (Count == 0 || Count > 256)
	{
		return( ATA_ERROR_GENERAL );
	}

	CmdReg->SecNum = LOBYTE(Sector);
	CmdReg->CylinderLo = LOBYTE(Sector >> 8);
	CmdReg->CylinderHi = LOBYTE(Sector >> 16);
	CmdReg->Head = LOBYTE(0xE0 | (Sector>>24));
	CmdReg->SecCount = (UCHAR)(Count == 256 ? 0 : Count);
	CmdReg->Command = ATA_CMD_READ;

	WaitResult = CFWaitForDisk(ATA_STATUS_DATA_REQ);

	if (WaitResult & 0x80000000)
	{
		OALMSG(1, (L"CFReadSectors: error waiting for DRQ. 1\r\n"));
	}

	Status = (UCHAR)(WaitResult & 0xFF);
	if (Status & ATA_STATUS_ERROR) 
	{
		DEBUGMSG(1, (L"CF Command Status = 0x%B\r\n", Status));
		RetVal = CmdReg->Error;
		OALMSG(1, (L"Error During Read: 0x%B\r\n", RetVal));
	}
	else 
	{
		if (Count == 0) 
		{
			Count = 256;
		}

        while (Count--)
		{
			WaitResult = CFWaitForDisk(ATA_STATUS_DATA_REQ);

			if (WaitResult & 0x8000000)
			{
				OALMSG(1, (L"CFReadSectors: error waiting for DRQ.\r\n"));
			}

			if (Status & ATA_STATUS_ERROR)
			{
				DEBUGMSG(1, (L"CF Command Status = 0x%B\r\n", Status));
				RetVal = CmdReg->Error;
				OALMSG(1, (L"Error During Read: 0x%B\r\n", RetVal));
				break;
			}
//
// If the sector buffer is not aligned on a USHORT boundary, the
// data must be copied one byte at a time to prevent alignment
// exceptions on certain platforms.
//
			for (i=0;i<(ULONG)BootDisk.BytesPerSec/2;i+=1)
			{
				CFData = *((PUSHORT)&CmdReg->Data);
				*SectorBuf++ = LOBYTE(CFData);
				*SectorBuf++ = HIBYTE(CFData);
			}
		}
	}
	return(RetVal);
}




//******************************************************************************
//*  This routine accepts a filename from the calling program.
//*  If the named file is found on the storage device, this routine
//*  will assume that the file is in Microsoft BIN format, attempt to load
//*  the file to RAM and return the jump address.
//*
//******************************************************************************
BOOL FATReadBin(IN PUCHAR FileName,
                  OUT PULONG JumpAddress,
                  OUT PULONG pulSize,
                  OUT PULONG pulImageAddress)
{
BINFILE_HEADER BinFileHeader;
BINFILE_RECORD_HEADER BinRecordHeader;
FILEINFO fnFileInfo;
ULONG Destination;
ULONG BytesToRead;
ULONG BytesRead;
ULONG BytesProcessed;
ULONG FileSize;
LONG  CheckSum;
PUCHAR pData;
ULONG count=1;
int i=0;
int loops=0;
int retry;

ULONG StartAddress;
ULONG ImageLength;

	DEBUGMSG(1, (L"FATReadBin: Entry\r\n"));
//  ****************************************************************************
//  * The filename sent to us is a null terminated string.
//  * Attempt to open the file.
//  * 
//  ****************************************************************************
	if(!FATOpenFile(&fnFileInfo, FileName))
	{
		OALMSG(1, (L"FATReadBin: FatFileHandle == 0\r\n"));
		return FALSE;
	}

//  ****************************************************************************
//  * The file was found and opened.
//  * Determine the file size.
//  * 
//  ****************************************************************************
	OALMSG(1, (L"INFO: NK.BIN found.\r\n"));

	FileSize = FATGetFileSize(&fnFileInfo);
	DEBUGMSG(1, (L"FATReadBin: BIN file size:  %u bytes\r\n", FileSize));

	if(FileSize < sizeof(BINFILE_HEADER) + 2*sizeof(BINFILE_RECORD_HEADER))
	{
		OALMSG(1, (L"FATReadBin: BIN file size: %u bytes is too small.\r\n", FileSize));
		return FALSE;
	}

//  ****************************************************************************
//  * Read the BIN file header.
//  * Extract the image start address and length.
//  * 
//  ****************************************************************************
	DEBUGMSG(1, (L"\r\nFATReadBin: Read the BIN file header\r\n"));
	BytesToRead = sizeof(BINFILE_HEADER);
	BytesRead =FATReadFile(&fnFileInfo, (PUCHAR)&BinFileHeader, BytesToRead);
	if (BytesRead != BytesToRead)
	{
		OALMSG(1, (L"FATReadBin: Failed to read the BIN file header.\r\n"));
		return FALSE;
	}

	OALMSG(1, (L"INFO: Image Address = : %8.8X\r\n", BinFileHeader.ImageAddress));
	OALMSG(1, (L"INFO: Image Size =    : %8.8X\r\n", BinFileHeader.ImageLength));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品在线观看网站| 欧美国产精品一区| 欧美日免费三级在线| 欧美日韩国产经典色站一区二区三区| 久久久www免费人成精品| 综合中文字幕亚洲| 国产一区二区三区观看| 日韩一区二区精品葵司在线| 九九久久精品视频| 精品伦理精品一区| 久久99日本精品| 日韩精品最新网址| 欧美不卡一二三| 国产日本亚洲高清| 国产精品卡一卡二卡三| 亚洲乱码日产精品bd| 1024亚洲合集| 国产在线精品一区在线观看麻豆| 成熟亚洲日本毛茸茸凸凹| 成人黄色免费短视频| 日韩写真欧美这视频| 日韩欧美国产wwwww| 日韩欧美国产高清| 亚洲视频资源在线| 亚洲制服丝袜在线| 欧美人体做爰大胆视频| 91精品免费在线观看| 91麻豆精品国产无毒不卡在线观看| 精品在线播放免费| 日韩欧美国产一区二区三区| 欧美激情综合五月色丁香小说| 亚洲欧美自拍偷拍色图| 欧美三级日韩在线| 欧美午夜精品久久久久久孕妇| 欧美一级欧美三级| 日韩码欧中文字| 岛国精品一区二区| 国产视频一区二区在线| 国产高清精品在线| 亚洲精品一区二区精华| 色综合天天狠狠| 久久精品72免费观看| 中文字幕一区不卡| 国产日韩欧美激情| 久久久精品黄色| 日韩三级视频中文字幕| 国产一区二区三区综合| 奇米色777欧美一区二区| 国产精品每日更新| 成人高清视频在线观看| 亚洲精品在线免费播放| 国产精品77777| 亚洲免费观看视频| 欧美日韩高清影院| 午夜成人免费视频| www亚洲一区| voyeur盗摄精品| 亚洲人成伊人成综合网小说| 国产乱色国产精品免费视频| 中文子幕无线码一区tr| 国产成人自拍网| 欧美日本视频在线| 国内精品嫩模私拍在线| 丁香啪啪综合成人亚洲小说| 国产午夜精品福利| 国产成人综合在线观看| 国产欧美一区二区精品久导航| 99v久久综合狠狠综合久久| 久久99久久精品欧美| 午夜视频在线观看一区二区 | 高潮精品一区videoshd| 亚洲国产视频a| 亚洲一区自拍偷拍| 国产麻豆精品在线观看| 成人一区二区三区在线观看| av电影在线不卡| 欧美视频在线不卡| 日韩欧美亚洲一区二区| 国产精品久久网站| 日韩高清中文字幕一区| 国产成人鲁色资源国产91色综 | 欧美午夜一区二区| 国产二区国产一区在线观看| 久久精品av麻豆的观看方式| 亚洲三级在线免费观看| 日韩一区二区三区三四区视频在线观看| www.欧美日韩| 日本91福利区| 久久99热国产| 首页综合国产亚洲丝袜| 婷婷一区二区三区| 香蕉久久夜色精品国产使用方法| 国产精品水嫩水嫩| 久久免费电影网| 一区二区三区免费观看| 午夜精品一区在线观看| 欧美一区二区在线看| 91免费看视频| 午夜精品久久久久久久久久久| 日韩理论在线观看| 天涯成人国产亚洲精品一区av| 久久精品国产99久久6| 成人污污视频在线观看| 日韩欧美亚洲国产精品字幕久久久| 欧美影视一区二区三区| 日本一区二区视频在线观看| 国产一区二区三区在线观看免费| 91精品久久久久久蜜臀| 国产嫩草影院久久久久| 不卡的av中国片| 亚洲欧洲日韩在线| 91麻豆swag| 亚洲一区二区不卡免费| 欧美色涩在线第一页| 亚洲成a天堂v人片| 色婷婷综合久色| 欧美在线一二三四区| 日韩视频不卡中文| 中文字幕国产一区| 亚洲午夜久久久| 国产麻豆视频精品| 91精品国产全国免费观看| 国产无一区二区| 免费成人深夜小野草| 91视频免费观看| 欧美激情在线一区二区| 亚洲国产精品人人做人人爽| 日日欢夜夜爽一区| 国产成人在线视频网站| 欧美日韩一区在线观看| 欧美tk—视频vk| 国产久卡久卡久卡久卡视频精品| 亚洲少妇屁股交4| 亚洲欧美一区二区三区国产精品| 亚洲成人777| 色综合亚洲欧洲| 亚洲国产婷婷综合在线精品| 欧美日韩夫妻久久| 国产一区二区三区综合| 中日韩av电影| 精品欧美乱码久久久久久 | 91影视在线播放| 精品在线免费观看| 亚洲男人的天堂网| 成人免费在线播放视频| 精品国产乱码久久| 欧美人牲a欧美精品| 色哟哟在线观看一区二区三区| 国产伦精一区二区三区| 奇米亚洲午夜久久精品| 亚洲欧美电影一区二区| 91视频你懂的| 国产精品国产馆在线真实露脸 | 综合久久久久久久| 久久精品国产在热久久| 欧美精品一区二区蜜臀亚洲| 麻豆精品在线播放| 国产在线播精品第三| 日韩女优电影在线观看| 日日骚欧美日韩| 欧美国产亚洲另类动漫| 七七婷婷婷婷精品国产| 欧美影视一区二区三区| 亚洲视频电影在线| 欧美精品一区二区三区蜜臀| 欧美一级久久久| 国产精品伦理一区二区| 亚洲午夜免费福利视频| www成人在线观看| 91福利精品视频| 国产成人啪午夜精品网站男同| 欧洲一区二区三区免费视频| 91精品欧美综合在线观看最新 | 欧美天堂亚洲电影院在线播放| 中文字幕一区二区三区乱码在线| 欧美精品自拍偷拍| 欧美日韩精品欧美日韩精品| 成人综合婷婷国产精品久久| 久久国产免费看| 国产不卡视频一区| 色吧成人激情小说| 国产高清精品久久久久| 久久99精品久久久久婷婷| 亚洲成av人在线观看| 国产一区二区三区免费看 | 91麻豆精东视频| 欧美视频你懂的| 制服视频三区第一页精品| 国产日产精品1区| 午夜不卡在线视频| 国产一区三区三区| 欧美色爱综合网| 91精品91久久久中77777| 日韩av网站免费在线| 日韩欧美成人午夜| 久久九九久久九九| 久久精品夜色噜噜亚洲aⅴ| 国产乱码一区二区三区| 亚洲午夜视频在线| 亚洲不卡在线观看|