2 * YAFFS: Yet another FFS. A NAND-flash specific file system.
\r
3 * ynandif.c: NAND interface functions for the WinCE port of YAFFS.
\r
5 * Copyright (C) 2002-2003 Trimble Navigation Ltd.
\r
7 * Created by Brad Beveridge <brad.beveridge@trimble.co.nz>
\r
8 * Modified for CE 4.x by Steve Fogle <stevef@atworkcom.com>
\r
10 * This program is free software; you can redistribute it and/or modify
\r
11 * it under the terms of the GNU General Public License version 2 as
\r
12 * published by the Free Software Foundation.
\r
14 * This program is distributed in the hope that it will be useful,
\r
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
17 * General Public License for more details. You should have received a
\r
18 * copy of the GNU General Public License along with this program;
\r
19 * if not, write to the Free Software Foundation, Inc.,
\r
20 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
\r
22 * $Id: ynandif.c,v 1.2 2003-01-31 00:52:53 charles Exp $
\r
24 #include <windows.h>
\r
26 #include "ynandif.h"
\r
28 //slf021220a Begin Cleanup block driver interface
\r
29 #if _WINCEOSVER < 400
\r
30 // For Win'CE 4.0 FSDMGR instead of direct access.
\r
31 HANDLE devHandle = 0;
\r
33 //slf021220a end Cleanup block driver interface
\r
36 * Functions that need to be provided for YAFFS
\r
38 int ynandif_WriteChunkToNAND(yaffs_Device *dev, int chunkInNAND,const __u8 *data, yaffs_Spare *spare)
\r
40 //slf021220a Begin Cleanup block driver interface
\r
41 #if _WINCEOSVER >= 400
\r
46 //slf021220a end Cleanup block driver interface
\r
48 ynandif_data writeData;
\r
51 writeData.chunk = chunkInNAND;
\r
52 writeData.data = (__u8 *)data;
\r
53 writeData.spare = (char *)spare;
\r
55 //slf021220a Begin Cleanup block driver interface
\r
56 #if _WINCEOSVER >= 400
\r
57 if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,
\r
59 if (!DeviceIoControl(devHandle,
\r
61 //slf021220a end Cleanup block driver interface
\r
64 sizeof(ynandif_data),
\r
77 int ynandif_ReadChunkFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaffs_Spare *spare)
\r
79 //slf021220a Begin Cleanup block driver interface
\r
80 #if _WINCEOSVER >= 400
\r
85 //slf021220a end Cleanup block driver interface
\r
87 ynandif_data readData;
\r
90 readData.chunk = chunkInNAND;
\r
91 readData.data = data;
\r
92 readData.spare = (char *)spare;
\r
94 //slf021220a Begin Cleanup block driver interface
\r
95 #if _WINCEOSVER >= 400
\r
96 if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,
\r
98 if (!DeviceIoControl(devHandle,
\r
100 //slf021220a end Cleanup block driver interface
\r
103 sizeof(ynandif_data),
\r
116 int ynandif_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
\r
118 //slf021220a Begin Cleanup block driver interface
\r
119 #if _WINCEOSVER >= 400
\r
124 //slf021220a end Cleanup block driver interface
\r
128 //slf021220a Begin Cleanup block driver interface
\r
129 #if _WINCEOSVER >= 400
\r
130 if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,
\r
132 if (!DeviceIoControl(devHandle,
\r
134 //slf021220a end Cleanup block driver interface
\r
147 // if we return YAFFS_FAIL, then yaffs will retire this block & mark it bad, not exactly
\r
148 // what we want to do by default.
\r
152 int ynandif_InitialiseNAND(yaffs_Device *dev)
\r
155 //slf021220a Begin Cleanup block driver interface
\r
156 #if _WINCEOSVER < 400
\r
157 // For Win'CE 4.0 FSDMGR instead of direct access.
\r
158 RETAILMSG(1, (L"ynandif_InitialiseNAND\r\n"));
\r
159 devHandle = CreateFile(L"YND1:",
\r
160 GENERIC_READ|GENERIC_WRITE,
\r
167 //slf021220d Begin CreateFile returns INVALID_HANDLE_VALUE not null fix.
\r
168 if (INVALID_HANDLE_VALUE == devHandle)
\r
175 //slf021220d end CreateFile returns INVALID_HANDLE_VALUE not null fix.
\r
177 RETAILMSG(1, (L"devhandle open\r\n"));
\r
179 //slf021220a Begin Cleanup block driver interface
\r
181 RETAILMSG(1, (L"DeviceIo INIT\r\n"));
\r
182 //slf021220a Begin Cleanup block driver interface
\r
185 #if _WINCEOSVER >= 400
\r
186 if (!FSDMGR_DiskIoControl((HDSK)dev->genericDevice,
\r
188 if (!DeviceIoControl(devHandle,
\r
190 //slf021220a end Cleanup block driver interface
\r
199 //slf021220a Begin Cleanup block driver interface
\r
201 //slf021220a end Cleanup block driver interface
\r
205 //slf021220a Begin Cleanup block driver interface
\r
206 // int nBlocks = ynandif_GetChipSize(0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
\r
207 int nBlocks = ynandif_GetChipSize(dev,0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
\r
208 //slf021220a end Cleanup block driver interface
\r
209 dev->startBlock = 1; // Don't use block 0
\r
210 dev->endBlock = nBlocks - 1;
\r
216 //slf021220a Begin Cleanup block driver interface
\r
217 void ynandif_DeinitialiseNAND(yaffs_Device *dev)
\r
219 RETAILMSG(1, (L"ynandif_DeinitialiseNAND\r\n"));
\r
220 #if _WINCEOSVER < 400
\r
223 CloseHandle(devHandle);
\r
228 //slf021220a end Cleanup block driver interface
\r
230 int ynandif_EraseAllBlocks(yaffs_Device *dev)
\r
232 int numBlocks, counter;
\r
233 //slf021220a Begin Cleanup block driver interface
\r
234 // numBlocks = ynandif_GetChipSize(0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
\r
235 numBlocks = ynandif_GetChipSize(dev,0xFF) / (YAFFS_CHUNKS_PER_BLOCK * YAFFS_BYTES_PER_CHUNK);
\r
236 //slf021220a end Cleanup block driver interface
\r
237 for (counter = 0; counter < numBlocks; counter++)
\r
239 ynandif_EraseBlockInNAND(dev, counter);
\r
244 //slf021220a Begin Cleanup block driver interface
\r
245 //int ynandif_GetChipSize(unsigned char chipNumber)
\r
246 int ynandif_GetChipSize(yaffs_Device *dev, unsigned char chipNumber)
\r
247 //slf021220a end Cleanup block driver interface
\r
250 RETAILMSG(1, (L"DeviceIo GETSIZE\r\n"));
\r
251 //slf021220a Begin Cleanup block driver interface
\r
252 #if _WINCEOSVER >= 400
\r
257 //slf021220a end Cleanup block driver interface
\r
259 RETAILMSG(1, (L"DeviceIo GETSIZE - getting ret\r\n"));
\r
260 //slf021220a Begin Cleanup block driver interface
\r
261 #if _WINCEOSVER >= 400
\r
262 FSDMGR_DiskIoControl((HDSK)dev->genericDevice,
\r
264 DeviceIoControl(devHandle,
\r
266 //slf021220a end Cleanup block driver interface
\r
275 RETAILMSG(1, (L"DeviceIo GETSIZE ret %X\r\n", ret));
\r