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

📄 blockdevice.c

📁 该工程是从ecos嵌入式系统下移植过来的一个小型的fat16文件系统
💻 C
字号:
#include "Blockdevice.h"
#include "codes.h"
#include "windows.h"
#include "stdio.h"

#define SET_BYTE(_data_, _val_, _off_) \    (*( ((cyg_uint8 *)_data_) + (_off_) ) = _val_)#define SET_WORD(_data_, _val_, _off_)                                   \    do {                                                                 \        *( ((cyg_uint8 *)_data_) + (_off_) )     = _val_         & 0xFF; \        *( ((cyg_uint8 *)_data_) + (_off_) + 1 ) = (_val_ >> 8)  & 0xFF; \    } while (0)#define SET_DWORD(_data_, _val_, _off_)                                  \    do {                                                                 \        *( ((cyg_uint8 *)_data_) + (_off_) )     = _val_         & 0xFF; \        *( ((cyg_uint8 *)_data_) + (_off_) + 1 ) = (_val_ >> 8)  & 0xFF; \        *( ((cyg_uint8 *)_data_) + (_off_) + 2 ) = (_val_ >> 16) & 0xFF; \        *( ((cyg_uint8 *)_data_) + (_off_) + 3 ) = (_val_ >> 24) & 0xFF; \    } while (0)#define SET_BYTES(_data_, _var_, _size_, _off_) \    memcpy((void *)(((cyg_uint8 *)_data_)+(_off_)), (void *)(_var_), _size_)


BYTE *FlashBuf;
LPVOID pVoid;
HANDLE hFilemap;
HANDLE hFile;

int ReadBlock(void *buf, cyg_uint32 *len, cyg_uint32  bnum, cyg_uint32  pos)
{
	if((pos + *len) >= 8*1024*1024)
		printf("Occor a error when reading block from the device\n");
	memcpy(buf,(FlashBuf+pos),*len);
	return ENOERR;
}


int WriteBlock(void *buf,cyg_uint32 *len, cyg_uint32  bnum, cyg_uint32  pos)
{
	if((pos + *len) >= 8*1024*1024)
		printf("Occor a error when writing block to the device\n");
	memcpy((FlashBuf+pos),buf,*len);
	return ENOERR;
}

int FormatDisk(void)
{
	unsigned char data[512];
	unsigned int len = 512;
	int err;

	memset(FlashBuf,0xff,512*(1+64+64+32));
	memset(data,0,512);
	
	SET_WORD(data,	0xEB,		0x00);
	SET_BYTES(data,	"ciitec",	8,		0x03);
    SET_WORD(data,  512,		0x0B);
	SET_BYTE(data,  1,			0x0D);    SET_WORD(data,  1,			0x0E);    SET_BYTE(data,  2,			0x10);    SET_WORD(data,  512,		0x11);    SET_WORD(data,  16384,		0x13);    SET_BYTE(data,  0xF8,		0x15);    SET_WORD(data,  64,			0x16);    SET_WORD(data,  1,			0x18);    SET_WORD(data,  1,			0x1A);    SET_DWORD(data, 0,			0x1C);    SET_DWORD(data, 0,			0x20);    SET_WORD(data,  0,			0x24);    SET_BYTE(data,  0x29,       0x26);    SET_DWORD(data, 0,			0x27);    SET_BYTES(data, "Conan",	11,		0x2B);    SET_BYTES(data, "Conan",	8,		0x36);    SET_WORD(data,  0x55AA,		0x1FE);    err = WriteBlock((void*)data, &len, 0, 0);	if(err != ENOERR)
	{
		printf("Write boot record occur a error!\n");
		return 1;
	}
	return ENOERR;
}

int InitialDevice(void)
{
		char path[] = "c:\\flash.dev";
		hFile=CreateFile(		path,
								GENERIC_READ|GENERIC_WRITE,

								FILE_SHARE_READ|FILE_SHARE_WRITE,

								NULL,

								OPEN_EXISTING,

								FILE_ATTRIBUTE_NORMAL,

								NULL);
//没有这个文件,就建立一个新的
		if(hFile == INVALID_HANDLE_VALUE)
		{
			hFile=CreateFile(		path,
									GENERIC_READ|GENERIC_WRITE,

									FILE_SHARE_READ|FILE_SHARE_WRITE,

									NULL,

									CREATE_NEW,

									FILE_ATTRIBUTE_NORMAL,

									NULL);
			if(hFile == INVALID_HANDLE_VALUE)
			{
				printf("this file have existed\n");
				return 0;
			}

			hFilemap = CreateFileMapping(hFile,

											NULL,

											PAGE_READWRITE,

											0,

											8*1024*1024, // 开辟FLASHSIZE

											NULL);
			if(hFilemap == NULL)
			{
				CloseHandle(hFile);
				return 0;
			}
			pVoid=MapViewOfFile(hFilemap,FILE_MAP_ALL_ACCESS,0,0,0);
			if(pVoid == NULL)
			{
				CloseHandle(hFile);
				CloseHandle(hFilemap);
				return 0;
			}
			FlashBuf=(unsigned char *)pVoid;

			memset(FlashBuf,0xff,8*1024*1024);
			//进行释放工作
			CloseHandle(hFile);
			CloseHandle(hFilemap);
			UnmapViewOfFile(pVoid);
//重新打开
			hFile=CreateFile(		path,
									GENERIC_READ|GENERIC_WRITE,

									FILE_SHARE_READ|FILE_SHARE_WRITE,

									NULL,

									OPEN_EXISTING,

									FILE_ATTRIBUTE_NORMAL,

									NULL);
			if(hFile == INVALID_HANDLE_VALUE)
			{
				return 0;
			}
		}

		hFilemap = CreateFileMapping(hFile,

											NULL,

											PAGE_READWRITE,

											0,

											8*1024*1024, // 开辟FLASHSIZE

											NULL);
		if(hFilemap == NULL)
		{
			CloseHandle(hFile);
			return 0;
		}
		pVoid=MapViewOfFile(hFilemap,FILE_MAP_ALL_ACCESS,0,0,0);
		if(pVoid == NULL)
		{
			CloseHandle(hFile);
			CloseHandle(hFilemap);
			return 0;
		}
		FlashBuf=(unsigned char *)pVoid;
		return 1;

}


void EndDevice(void)
{
	//进行释放工作
	CloseHandle(hFile);
	CloseHandle(hFilemap);
	UnmapViewOfFile(pVoid);

}

⌨️ 快捷键说明

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