* YAFFS: Yet another FFS. A NAND-flash specific file system.\r
* ynandif.c: NAND interface functions for the WinCE port of YAFFS.\r
*\r
- * Copyright (C) 2002 Trimble Navigation Ltd.\r
+ * Copyright (C) 2002-2003 Trimble Navigation Ltd.\r
*\r
* Created by Brad Beveridge <brad.beveridge@trimble.co.nz>\r
+ * Modified for CE 4.x by Steve Fogle <stevef@atworkcom.com>\r
*\r
* This program is free software; you can redistribute it and/or modify\r
* it under the terms of the GNU General Public License version 2 as\r
* if not, write to the Free Software Foundation, Inc., \r
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. \r
*\r
- * $Id: ynandif.c,v 1.1 2002-11-08 07:30:00 charles Exp $\r
+ * $Id: ynandif.c,v 1.2 2003-01-31 00:52:53 charles Exp $\r
*/\r
-#include "ynandif.h"\r
#include <windows.h>\r
+#include <fsdmgr.h>\r
+#include "ynandif.h"\r
\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER < 400\r
+// For Win'CE 4.0 FSDMGR instead of direct access.\r
HANDLE devHandle = 0;\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
\r
/*\r
* Functions that need to be provided for YAFFS\r
*/\r
int ynandif_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,const __u8 *data, yaffs_Spare *spare)\r
{\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (dev)\r
+#else\r
if (devHandle)\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
{\r
ynandif_data writeData;\r
int result;\r
writeData.data = (__u8 *)data;\r
writeData.spare = (char *)spare;\r
\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,\r
+#else\r
if (!DeviceIoControl(devHandle,\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
YNANDIF_WRITE,\r
&writeData,\r
sizeof(ynandif_data),\r
\r
int ynandif_ReadChunkFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaffs_Spare *spare)\r
{\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (dev)\r
+#else\r
if (devHandle)\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
{\r
ynandif_data readData;\r
int result;\r
readData.data = data;\r
readData.spare = (char *)spare;\r
\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,\r
+#else\r
if (!DeviceIoControl(devHandle,\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
YNANDIF_READ,\r
&readData,\r
sizeof(ynandif_data),\r
\r
int ynandif_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)\r
{\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (dev)\r
+#else\r
if (devHandle)\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
{\r
int result;\r
\r
- if (!DeviceIoControl(devHandle,\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,\r
+#else\r
+ if (!DeviceIoControl(devHandle,\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
YNANDIF_ERASE,\r
&blockNumber,\r
sizeof(int),\r
\r
int ynandif_InitialiseNAND(yaffs_Device *dev)\r
{\r
+\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER < 400\r
+// For Win'CE 4.0 FSDMGR instead of direct access.\r
RETAILMSG(1, (L"ynandif_InitialiseNAND\r\n"));\r
devHandle = CreateFile(L"YND1:",\r
GENERIC_READ|GENERIC_WRITE,\r
0,\r
0);\r
\r
- if (!devHandle)\r
+//slf021220d Begin CreateFile returns INVALID_HANDLE_VALUE not null fix.\r
+ if (INVALID_HANDLE_VALUE == devHandle)\r
+ {\r
+ devHandle = NULL;\r
return 0;\r
+ }\r
+// if (!devHandle)\r
+// return 0;\r
+//slf021220d end CreateFile returns INVALID_HANDLE_VALUE not null fix.\r
\r
RETAILMSG(1, (L"devhandle open\r\n"));\r
+#endif\r
+//slf021220a Begin Cleanup block driver interface\r
\r
RETAILMSG(1, (L"DeviceIo INIT\r\n"));\r
- if (!DeviceIoControl(devHandle,\r
+//slf021220a Begin Cleanup block driver interface\r
+ if (dev)\r
+ {\r
+#if _WINCEOSVER >= 400\r
+ if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,\r
+#else\r
+ if (!DeviceIoControl(devHandle,\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
YNANDIF_INIT,\r
NULL,\r
0,\r
0,\r
NULL,\r
NULL))\r
- return 0;\r
-\r
+ return 0;\r
+//slf021220a Begin Cleanup block driver interface\r
+ }\r
+//slf021220a end Cleanup block driver interface\r
\r
if (dev)\r
{\r
- int nBlocks = ynandif_GetChipSize(0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);\r
+//slf021220a Begin Cleanup block driver interface\r
+// int nBlocks = ynandif_GetChipSize(0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);\r
+ int nBlocks = ynandif_GetChipSize(dev,0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);\r
+//slf021220a end Cleanup block driver interface\r
dev->startBlock = 1; // Don't use block 0\r
dev->endBlock = nBlocks - 1;\r
}\r
return 1;\r
}\r
\r
+//slf021220a Begin Cleanup block driver interface\r
+void ynandif_DeinitialiseNAND(yaffs_Device *dev)\r
+{\r
+ RETAILMSG(1, (L"ynandif_DeinitialiseNAND\r\n"));\r
+#if _WINCEOSVER < 400\r
+ if (devHandle)\r
+ {\r
+ CloseHandle(devHandle);\r
+ devHandle = NULL;\r
+ }\r
+#endif\r
+}\r
+//slf021220a end Cleanup block driver interface\r
+\r
int ynandif_EraseAllBlocks(yaffs_Device *dev)\r
{\r
int numBlocks, counter;\r
- numBlocks = ynandif_GetChipSize(0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);\r
+//slf021220a Begin Cleanup block driver interface\r
+// numBlocks = ynandif_GetChipSize(0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);\r
+ numBlocks = ynandif_GetChipSize(dev,0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);\r
+//slf021220a end Cleanup block driver interface\r
for (counter = 0; counter < numBlocks; counter++)\r
{\r
ynandif_EraseBlockInNAND(dev, counter);\r
return YAFFS_OK;\r
}\r
\r
-int ynandif_GetChipSize(unsigned char chipNumber)\r
+//slf021220a Begin Cleanup block driver interface\r
+//int ynandif_GetChipSize(unsigned char chipNumber)\r
+int ynandif_GetChipSize(yaffs_Device *dev, unsigned char chipNumber)\r
+//slf021220a end Cleanup block driver interface\r
{\r
int ret = 0;\r
RETAILMSG(1, (L"DeviceIo GETSIZE\r\n"));\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ if (dev)\r
+#else\r
if (devHandle)\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
{\r
RETAILMSG(1, (L"DeviceIo GETSIZE - getting ret\r\n"));\r
+//slf021220a Begin Cleanup block driver interface\r
+#if _WINCEOSVER >= 400\r
+ FSDMGR_DiskIoControl((HDSK)dev->genericDevice,\r
+#else\r
DeviceIoControl(devHandle,\r
+#endif\r
+//slf021220a end Cleanup block driver interface\r
YNANDIF_GETSIZE,\r
NULL,\r
0,\r