📄 fat32_dep_nand.c
字号:
/*
* @(#)nand.c
* @date 2005/12/25
* @version 1.0
* @author Zhou Shangpin.
* Copyright 2005 Anyka corporation, Inc. All rights reserved.
* ANYKA PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
//#include "nand.h"
#include "global.h"
#include "mem_port.h"
#include "Fat32_Dep_Nand.h"
#ifdef OS_WIN32
#include <windows.h>
#else
#include "nand_mtd.h"
#include "ram2medium.h"
#include "usb.h"
#endif
#define NAND_SECTOR_BIT 9
#define NAND_BYTES_SECCTOR (1 << NAND_SECTOR_BIT)
static T_U32 nand_bytes_sector;
//*****************nandflash mount********************************//
#ifdef OS_WIN32
static T_U8 NAND_DriverNo;
T_VOID Nand_SetEmulate(T_U8 DriverNo)
{
NAND_DriverNo = DriverNo;
}
#endif
T_PMEDIUM Nand_Initial()
{
T_U32 capacity, BytsPerSec, i;
T_PMEDIUM medium;
medium = (T_PMEDIUM)Fwl_Malloc(sizeof(T_MEDIUM));
if(medium == AK_NULL)
{
return AK_NULL;
}
#ifdef OS_WIN32
// 256M = 512 * 1000 * BytsPerSec
capacity = (512 * 1000);
BytsPerSec = NAND_BYTES_SECCTOR;
#else
if (!get_MediaInfo(NANDFLASH_DISK, &capacity, &BytsPerSec))
{
return AK_NULL;
}
#endif
nand_bytes_sector = BytsPerSec;
i = 0;
while (BytsPerSec > 1)
{
BytsPerSec >>= 1;
i++;
}
medium->SecBit = i;
((T_POBJECT)medium)->destroy = (F_DESTROY)Medium_Destroy;
((T_POBJECT)medium)->type = TYPE_MEDIUM;
medium->read = Nand_Read;
medium->write = Nand_Write;
medium->flush = Nand_Flush;
medium->capacity = capacity;
medium->type = MEDIUM_NANDFLASH;
medium->msg = AK_NULL;
return medium;
}
T_U32 Nand_Read(T_U8* buf, T_U32 sector, T_U32 size)
{
T_U32 ret;
#ifdef OS_WIN32
HANDLE hDev;
T_U32 dwCB;
T_S32 high;
T_BOOL bRet;
char devName[10]; //"\\\\.\\g:";
ret = 0;
devName[0] = '\\';
devName[1] = '\\';
devName[2] = '.';
devName[3] = '\\';
devName[4] = NAND_DriverNo;
devName[5] = ':';
devName[6] = 0;
hDev = CreateFile(devName, GENERIC_READ , FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE)
{
return 0;
}
high = sector >> (32 - NAND_SECTOR_BIT);
SetFilePointer(hDev, sector << NAND_SECTOR_BIT, &high, FILE_BEGIN);
bRet = ReadFile(hDev, buf, NAND_BYTES_SECCTOR * size, &dwCB, NULL);
CloseHandle(hDev);
if (bRet)
{
ret = size;;
}
#else
ret = 0;
while (size-- > 0)
{
if (!MTD_NAND_Read_Single(buf, sector + ret))
{
break;
}
buf += nand_bytes_sector;
ret++;
}
#endif
fgb.ReadCount++;
return ret;
}
T_U32 Nand_Write(T_U8* buf, T_U32 sector, T_U32 size)
{
T_U32 ret;
#ifdef OS_WIN32
DWORD dwCB;
T_S32 high;
HANDLE hDev;
char devName[10]; //"\\\\.\\g:";
ret = 0;
devName[0] = '\\';
devName[1] = '\\';
devName[2] = '.';
devName[3] = '\\';
devName[4] = NAND_DriverNo;
devName[5] = ':';
devName[6] = 0;
hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
high = sector >> (32 - NAND_SECTOR_BIT);
SetFilePointer(hDev, sector << NAND_SECTOR_BIT, &high, FILE_BEGIN);
if (WriteFile(hDev, buf, NAND_BYTES_SECCTOR * size, &dwCB, NULL))
{
ret = size;
}
CloseHandle(hDev);
#else
ret = 0;
while (size-- > 0)
{
if (!MTD_NAND_Write_Single(buf, sector + ret))
{
break;
}
buf += nand_bytes_sector;
ret++;
}
#endif
fgb.WriteCount++;
return ret;
}
//flush file data to medium.
T_BOOL Nand_Flush(T_VOID)
{
return AK_TRUE;
}
//***********************************end nand mount***************************************//
//********************************mount nandflash reserve zone*************************//
#ifdef OS_WIN32
static T_U8 NANDRes_DriverNo;
T_VOID NdRes_SetEmulate(T_U8 DriverNo)
{
NANDRes_DriverNo = DriverNo;
}
#endif
T_PMEDIUM NdRes_Initial()
{
T_U32 capacity, BytsPerSec, i;
T_PMEDIUM medium;
medium = (T_PMEDIUM)Fwl_Malloc(sizeof(T_MEDIUM));
if(medium == AK_NULL)
{
return AK_NULL;
}
#ifdef OS_WIN32
// 256M = 512 * 1000 * BytsPerSec
capacity = (512 * 1000);
BytsPerSec = NAND_BYTES_SECCTOR;
#else
if (!get_MediaInfo(NANDRESERVE_ZONE, &capacity, &BytsPerSec))
{
return AK_NULL;
}
#endif
nand_bytes_sector = BytsPerSec;
i = 0;
while (BytsPerSec > 1)
{
BytsPerSec >>= 1;
i++;
}
medium->SecBit = i;
((T_POBJECT)medium)->destroy = (F_DESTROY)Medium_Destroy;
((T_POBJECT)medium)->type = TYPE_MEDIUM;
medium->read = NdRes_Read;
medium->write = NdRes_Write;
medium->flush = Nand_Flush;
medium->capacity = capacity;
medium->type = MEDIUM_NANDRES;
medium->msg = AK_NULL;
return medium;
}
T_U32 NdRes_Read(T_U8* buf, T_U32 sector, T_U32 size)
{
T_U32 ret;
#ifdef OS_WIN32
HANDLE hDev;
T_U32 dwCB;
T_S32 high;
T_BOOL bRet;
char devName[10]; //"\\\\.\\g:";
ret = 0;
devName[0] = '\\';
devName[1] = '\\';
devName[2] = '.';
devName[3] = '\\';
devName[4] = NANDRes_DriverNo;
devName[5] = ':';
devName[6] = 0;
hDev = CreateFile(devName, GENERIC_READ , FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE)
{
return 0;
}
high = sector >> (32 - NAND_SECTOR_BIT);
SetFilePointer(hDev, sector << NAND_SECTOR_BIT, &high, FILE_BEGIN);
bRet = ReadFile(hDev, buf, NAND_BYTES_SECCTOR * size, &dwCB, NULL);
CloseHandle(hDev);
if (bRet)
{
ret = size;;
}
#else
ret = 0;
while (size-- > 0)
{
if (!MTD_RES_Read_Single(buf, sector + ret))
{
break;
}
buf += nand_bytes_sector;
ret++;
}
#endif
fgb.ReadCount++;
return ret;
}
T_U32 NdRes_Write(T_U8* buf, T_U32 sector, T_U32 size)
{
T_U32 ret;
#ifdef OS_WIN32
DWORD dwCB;
T_S32 high;
HANDLE hDev;
char devName[10]; //"\\\\.\\g:";
ret = 0;
devName[0] = '\\';
devName[1] = '\\';
devName[2] = '.';
devName[3] = '\\';
devName[4] = NANDRes_DriverNo;
devName[5] = ':';
devName[6] = 0;
hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
high = sector >> (32 - NAND_SECTOR_BIT);
SetFilePointer(hDev, sector << NAND_SECTOR_BIT, &high, FILE_BEGIN);
if (WriteFile(hDev, buf, NAND_BYTES_SECCTOR * size, &dwCB, NULL))
{
ret = size;
}
CloseHandle(hDev);
#else
ret = 0;
while (size-- > 0)
{
if (!MTD_RES_Write_Single(buf, sector + ret))
{
break;
}
buf += nand_bytes_sector;
ret++;
}
#endif
fgb.WriteCount++;
return ret;
}
//***********************************end mount nandflash reserve zone***************************************//
//***************************************************************************************************//
//********************************mount USB host( mass storage class device)*************************//
static T_U32 UHost_bytes_sector;
#ifdef OS_WIN32
static T_U8 UHost_DriverNo;
T_VOID UHost_SetEmulate(T_U8 DriverNo)
{
UHost_DriverNo = DriverNo;
}
#endif
T_PMEDIUM UHost_Initial()
{
T_U32 capacity, BytsPerSec, i;
T_PMEDIUM medium;
medium = (T_PMEDIUM)Fwl_Malloc(sizeof(T_MEDIUM));
if(medium == AK_NULL)
{
return AK_NULL;
}
#ifdef OS_WIN32
capacity = (512 * 1000);
BytsPerSec = 512;
#else
/* if (!get_MediaInfo(UHOST_DISK, &capacity, &BytsPerSec))
{
return AK_NULL;
}*/
#endif
UHost_bytes_sector = BytsPerSec;
i = 0;
while (BytsPerSec > 1)
{
BytsPerSec >>= 1;
i++;
}
medium->SecBit = i;
((T_POBJECT)medium)->destroy = (F_DESTROY)Medium_Destroy;
((T_POBJECT)medium)->type = TYPE_MEDIUM;
medium->read = UHost_Read;
medium->write = UHost_Write;
medium->flush = Nand_Flush;
medium->capacity = capacity;
medium->type = MEDIUM_USBHOST;
medium->msg = AK_NULL;
return medium;
}
T_U32 UHost_Read(T_U8* buf, T_U32 sector, T_U32 size)
{
T_U32 ret;
#ifdef OS_WIN32
HANDLE hDev;
T_U32 dwCB;
T_S32 high;
T_BOOL bRet;
char devName[10]; //"\\\\.\\g:";
ret = 0;
devName[0] = '\\';
devName[1] = '\\';
devName[2] = '.';
devName[3] = '\\';
devName[4] = UHost_DriverNo;
devName[5] = ':';
devName[6] = 0;
hDev = CreateFile(devName, GENERIC_READ , FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE)
{
return 0;
}
high = sector >> (32 - NAND_SECTOR_BIT);
SetFilePointer(hDev, sector << NAND_SECTOR_BIT, &high, FILE_BEGIN);
bRet = ReadFile(hDev, buf, NAND_BYTES_SECCTOR * size, &dwCB, NULL);
CloseHandle(hDev);
if (bRet)
{
ret = size;;
}
#else
/* if (ReadBlock(sector, size ,buf))
{
return size;
}
else
{
return 0;
}*/
#endif
fgb.ReadCount++;
return ret;
}
T_U32 UHost_Write(T_U8* buf, T_U32 sector, T_U32 size)
{
T_U32 ret;
#ifdef OS_WIN32
DWORD dwCB;
T_S32 high;
HANDLE hDev;
char devName[10]; //"\\\\.\\g:";
ret = 0;
devName[0] = '\\';
devName[1] = '\\';
devName[2] = '.';
devName[3] = '\\';
devName[4] = UHost_DriverNo;
devName[5] = ':';
devName[6] = 0;
hDev = CreateFile(devName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDev == INVALID_HANDLE_VALUE) return 0;
high = sector >> (32 - NAND_SECTOR_BIT);
SetFilePointer(hDev, sector << NAND_SECTOR_BIT, &high, FILE_BEGIN);
if (WriteFile(hDev, buf, NAND_BYTES_SECCTOR * size, &dwCB, NULL))
{
ret = size;
}
CloseHandle(hDev);
#else
/* if (WriteBlock(sector, size ,buf))
{
return size;
}
else
{
return 0;
}*/
#endif
fgb.WriteCount++;
return ret;
}
//***********************************end mount nandflash reserve zone***************************************//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -