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

📄 fat32_dep_nand.c

📁 fs_lib,arm9的fat文件系统
💻 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 + -