Fix blocks per chunk in resize
[yaffs/.git] / wince / ynandif.c
index 5e982b502ae7755c9ca19047d5ccf5a5a3eeaadb..2812549ac37b42dcf8e9a75faee77f4fc81a26a1 100644 (file)
@@ -2,9 +2,10 @@
  * 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
@@ -39,7 +52,13 @@ int ynandif_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,const __u8 *data
                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
@@ -57,7 +76,13 @@ int ynandif_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,const __u8 *data
 \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
@@ -66,7 +91,13 @@ int ynandif_ReadChunkFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaf
                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
@@ -84,11 +115,23 @@ int ynandif_ReadChunkFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaf
 \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
@@ -108,6 +151,10 @@ int ynandif_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
 \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
@@ -117,13 +164,30 @@ int ynandif_InitialiseNAND(yaffs_Device *dev)
                                                   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
@@ -131,12 +195,17 @@ int ynandif_InitialiseNAND(yaffs_Device *dev)
                                                 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
@@ -144,10 +213,27 @@ int ynandif_InitialiseNAND(yaffs_Device *dev)
        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
@@ -155,14 +241,29 @@ int ynandif_EraseAllBlocks(yaffs_Device *dev)
        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