📄 hal.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) ) {
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 + -