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

📄 hal.c

📁 这个是好记星608的AP源代码,他的主要是是GUI,还有对字典的操作
💻 C
字号:
// HAL.cpp: implementation of the HAL class.
//
//////////////////////////////////////////////////////////////////////

#define __OS_SOURCE_FILE__

#ifndef _WIN32

#include "Kernel.h"
#include "HAL.h"

BOOL g_bCardConnect = FALSE;
PTABLE_ENTRY USB_PTABLE[4] = {0};

/* MBR table on UDisk */
const UINT8 USB_MBR[512] = {
	0x33, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C, 0xFB, 0x50, 0x07, 0x50, 0x1F, 0xFC, 0xBE, 0x1B, 0x7C, 
	0xBF, 0x1B, 0x06, 0x50, 0x57, 0xB9, 0xE5, 0x01, 0xF3, 0xA4, 0xCB, 0xBD, 0xBE, 0x07, 0xB1, 0x04, 
	0x38, 0x6E, 0x00, 0x7C, 0x09, 0x75, 0x13, 0x83, 0xC5, 0x10, 0xE2, 0xF4, 0xCD, 0x18, 0x8B, 0xF5, 
	0x83, 0xC6, 0x10, 0x49, 0x74, 0x19, 0x38, 0x2C, 0x74, 0xF6, 0xA0, 0xB5, 0x07, 0xB4, 0x07, 0x8B, 
	0xF0, 0xAC, 0x3C, 0x00, 0x74, 0xFC, 0xBB, 0x07, 0x00, 0xB4, 0x0E, 0xCD, 0x10, 0xEB, 0xF2, 0x88, 
	0x4E, 0x10, 0xE8, 0x46, 0x00, 0x73, 0x2A, 0xFE, 0x46, 0x10, 0x80, 0x7E, 0x04, 0x0B, 0x74, 0x0B, 
	0x80, 0x7E, 0x04, 0x0C, 0x74, 0x05, 0xA0, 0xB6, 0x07, 0x75, 0xD2, 0x80, 0x46, 0x02, 0x06, 0x83, 
	0x46, 0x08, 0x06, 0x83, 0x56, 0x0A, 0x00, 0xE8, 0x21, 0x00, 0x73, 0x05, 0xA0, 0xB6, 0x07, 0xEB, 
	0xBC, 0x81, 0x3E, 0xFE, 0x7D, 0x55, 0xAA, 0x74, 0x0B, 0x80, 0x7E, 0x10, 0x00, 0x74, 0xC8, 0xA0, 
	0xB7, 0x07, 0xEB, 0xA9, 0x8B, 0xFC, 0x1E, 0x57, 0x8B, 0xF5, 0xCB, 0xBF, 0x05, 0x00, 0x8A, 0x56, 
	0x00, 0xB4, 0x08, 0xCD, 0x13, 0x72, 0x23, 0x8A, 0xC1, 0x24, 0x3F, 0x98, 0x8A, 0xDE, 0x8A, 0xFC, 
	0x43, 0xF7, 0xE3, 0x8B, 0xD1, 0x86, 0xD6, 0xB1, 0x06, 0xD2, 0xEE, 0x42, 0xF7, 0xE2, 0x39, 0x56, 
	0x0A, 0x77, 0x23, 0x72, 0x05, 0x39, 0x46, 0x08, 0x73, 0x1C, 0xB8, 0x01, 0x02, 0xBB, 0x00, 0x7C, 
	0x8B, 0x4E, 0x02, 0x8B, 0x56, 0x00, 0xCD, 0x13, 0x73, 0x51, 0x4F, 0x74, 0x4E, 0x32, 0xE4, 0x8A, 
	0x56, 0x00, 0xCD, 0x13, 0xEB, 0xE4, 0x8A, 0x56, 0x00, 0x60, 0xBB, 0xAA, 0x55, 0xB4, 0x41, 0xCD, 
	0x13, 0x72, 0x36, 0x81, 0xFB, 0x55, 0xAA, 0x75, 0x30, 0xF6, 0xC1, 0x01, 0x74, 0x2B, 0x61, 0x60, 
	0x6A, 0x00, 0x6A, 0x00, 0xFF, 0x76, 0x0A, 0xFF, 0x76, 0x08, 0x6A, 0x00, 0x68, 0x00, 0x7C, 0x6A, 
	0x01, 0x6A, 0x10, 0xB4, 0x42, 0x8B, 0xF4, 0xCD, 0x13, 0x61, 0x61, 0x73, 0x0E, 0x4F, 0x74, 0x0B, 
	0x32, 0xE4, 0x8A, 0x56, 0x00, 0xCD, 0x13, 0xEB, 0xD6, 0x61, 0xF9, 0xC3, 0x49, 0x6E, 0x76, 0x61, 
	0x6C, 0x69, 0x64, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x61, 
	0x62, 0x6C, 0x65, 0x00, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x69, 0x6E, 
	0x67, 0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6E, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 
	0x65, 0x6D, 0x00, 0x4D, 0x69, 0x73, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x70, 0x65, 0x72, 0x61, 
	0x74, 0x69, 0x6E, 0x67, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x44, 0x63, 0xC3, 0x02, 0x74, 0x82, 0x00, 0x00, 0x00, 0x01, 
	0x01, 0x00, 0x04, 0xFE, 0xFD, 0xFE, 0x3F, 0x00, 0x00, 0x00, 0x80, 0xFB, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
};

VOID __UsbCreatePartitionTable(BOOL bFlashOnly);
UINT HAL_Init(void)
{
	//NU_Printf("HAL Initing...\r\n");
	/* Open flash */
	FlashOpen(NULL);
#ifdef __FOR_BOOT__
	/* Create Default Partition Table */
	__UsbCreatePartitionTable(TRUE);
#endif
	return 0;
}

INT32 HAL_Read(DWORD uLN, UINT16 uLen, BYTE *pData)
{
	INT32 ret;
	MFlashInfo flashInfo;

	FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &flashInfo);
	ret = flashInfo.uPageSize * uLen;

	if (uLN < SEC_PER_TRACK) {
		/* Flush the buffer*/
		memset(pData,0,ret);
		if (0 == uLN) {				
			/* Copy MBR */
			memmove(pData,USB_MBR,sizeof(USB_MBR));
			/* Rewrite the partition table*/
			memmove((pData+0x1BE),USB_PTABLE,sizeof(USB_PTABLE));
		}
		/* Fill the buffer,if uLen is over the range. */
		if ((uLN + uLen) > SEC_PER_TRACK) {
			FlashIo(NULL,0,(pData+((SEC_PER_TRACK-uLN)*flashInfo.uPageSize)),
				(UINT16)(uLN+uLen-SEC_PER_TRACK),1);
		}
	}
	else if (uLN < (flashInfo.uPageSum+SEC_PER_TRACK)) {	
		/* Reading NFlash */
		if ((uLN + uLen) > (SEC_PER_TRACK+flashInfo.uPageSum)) {
			ret = FlashIo(NULL,uLN-SEC_PER_TRACK,pData,
				(UINT16)(SEC_PER_TRACK+flashInfo.uPageSum-uLN),1);
			if (ret < 0) {
				return ret;
			}
			ret += CardIo(NULL,0,pData+ret,
				(UINT16)(uLN+uLen-SEC_PER_TRACK-flashInfo.uPageSum),1);
		}
		else {
			ret = FlashIo(NULL, uLN-SEC_PER_TRACK, pData, uLen, 1);
		}
	}
	else {						
		/* Reading SDCard */
		ret = CardIo(NULL, uLN-flashInfo.uPageSum-SEC_PER_TRACK, pData, uLen, 1);
	}
	return ret;		
}

DWORD HAL_Write(DWORD uLN, UINT16 uLen, BYTE *pData)
{
	//NU_Printf("write %d %d\r\n", uLN, uLen);
	DWORD ret;
	MFlashInfo flashInfo;
	
	FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &flashInfo);
	if (uLN < SEC_PER_TRACK) {	
		/* Track 0 can't be changed. */
		ret = uLen * flashInfo.uPageSize;
	}
	else if (uLN < (flashInfo.uPageSum+SEC_PER_TRACK)) {	
		/* Writing NFlash */
		ret = FlashIo(NULL, uLN-SEC_PER_TRACK, pData, uLen, 0);
	}
	else {						
		/* Writing SDCard */
		ret = CardIo(NULL, uLN-SEC_PER_TRACK-flashInfo.uPageSum, pData, uLen, 0);
	}
	return ret;		
}

UINT __SectorToHSC(UINT32 dwSecNo,UINT8 *head,UINT8 *sec,UINT8 *cyl)
{
	UINT uCylNum,uSecNum,uHeadNum,uCylSum;

	uCylSum = dwSecNo / SEC_PER_TRACK;
	if (dwSecNo % SEC_PER_TRACK) {
		uCylSum ++;
	}

	uCylNum = uCylSum / NUM_OF_HEADS;
	if (uCylSum % NUM_OF_HEADS) {
		uCylNum ++;
	}

	uSecNum = SEC_PER_TRACK;
	uHeadNum = NUM_OF_HEADS - 1;
	uCylNum --;
	/* Head */ 
	*head = (UINT8)uHeadNum;
	/* Sector(Bit0-5) Bit6 and 7 are cylinder number */
	*sec = (UINT8)((uCylNum >> 2) & 0xC0) + (UINT8)(uSecNum & 0x3F);
	/* Cylinder Upper two bit of starting clyinder number are in StartSector field. */
	*cyl = (UINT8)uCylNum;
	return uCylNum;
}

VOID __UsbCreatePartitionTable(BOOL bFlashOnly)
{
	MFlashInfo flashInfo;
	UINT uCylNum;
	
	/* Initialize the table. */
	memset(USB_PTABLE,0,sizeof(USB_PTABLE));
	/* Get flash infomation. */
	FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &flashInfo);

	/* BootSignature 0x80 = active partition*/
	USB_PTABLE[0].boot = 0;			
		/* Partition Type,04 = FAT16 < 32M  06 = FAT16 > 32M*/
	USB_PTABLE[0].p_typ = 06;
	/* Relativity sector */
	USB_PTABLE[0].r_sec = SEC_PER_TRACK;
	/* Size of partition */
	USB_PTABLE[0].p_size = flashInfo.uPageSum;
	/* Start HSC(1,1,0) */
	USB_PTABLE[0].s_head = 1;
	USB_PTABLE[0].s_sec = 1;
	USB_PTABLE[0].s_cyl = 0;
	/* End HSC */
	uCylNum = __SectorToHSC(USB_PTABLE[0].r_sec + USB_PTABLE[0].p_size,
		&USB_PTABLE[0].e_head,&USB_PTABLE[0].e_sec,&USB_PTABLE[0].e_cyl);
	if (bFlashOnly) {
		return;
	}

	/* Check card connection. */
	g_bCardConnect = FALSE;
if (CardOpen(1))
 {
//#ifndef __FOR_BOOT__
//		StatusBoxStart(NULL,"正在读取扩展卡...");
//#endif

		if ( (NU_SUCCESS == CardCheck(0)) && CardOpen(NULL)
			&& CardIoCtrl(NULL,FLASH_COMMAND_GETINFO, &flashInfo) )
		 {
			if(IsCardPasswordIn())
			{
    			g_bCardConnect = FALSE;
			}
			else
			{
    			g_bCardConnect = TRUE;
    	}
		}
	}
	if (g_bCardConnect) {
		/* BootSignature */
		USB_PTABLE[1].boot = 0;			
		/* Partition Type,04 = FAT16 < 32M  06 = FAT16 > 32M*/
		USB_PTABLE[1].p_typ = 06;
		/* Relativity sector */
		USB_PTABLE[1].r_sec = USB_PTABLE[0].r_sec + USB_PTABLE[0].p_size;
		/* Size of partition */
		USB_PTABLE[1].p_size = flashInfo.uPageSum;
		/* Start HSC */
		uCylNum ++;
		USB_PTABLE[1].s_head = 0;
		USB_PTABLE[1].s_sec = (UINT8)((uCylNum >> 2) & 0xC0) + 1;
		USB_PTABLE[1].s_cyl = (UINT8)uCylNum;
		/* End HSC*/
		__SectorToHSC(USB_PTABLE[1].r_sec + USB_PTABLE[1].p_size,
			&USB_PTABLE[1].e_head,&USB_PTABLE[1].e_sec,&USB_PTABLE[1].e_cyl);
	}
	return;
}
#endif

⌨️ 快捷键说明

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