1*10465441SEvalZero /*
2*10465441SEvalZero This file is part of UFFS, the Ultra-low-cost Flash File System.
3*10465441SEvalZero
4*10465441SEvalZero Copyright (C) 2005-2009 Ricky Zheng <[email protected]>
5*10465441SEvalZero
6*10465441SEvalZero UFFS is free software; you can redistribute it and/or modify it under
7*10465441SEvalZero the GNU Library General Public License as published by the Free Software
8*10465441SEvalZero Foundation; either version 2 of the License, or (at your option) any
9*10465441SEvalZero later version.
10*10465441SEvalZero
11*10465441SEvalZero UFFS is distributed in the hope that it will be useful, but WITHOUT
12*10465441SEvalZero ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*10465441SEvalZero FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14*10465441SEvalZero or GNU Library General Public License, as applicable, for more details.
15*10465441SEvalZero
16*10465441SEvalZero You should have received a copy of the GNU General Public License
17*10465441SEvalZero and GNU Library General Public License along with UFFS; if not, write
18*10465441SEvalZero to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19*10465441SEvalZero Boston, MA 02110-1301, USA.
20*10465441SEvalZero
21*10465441SEvalZero As a special exception, if other files instantiate templates or use
22*10465441SEvalZero macros or inline functions from this file, or you compile this file
23*10465441SEvalZero and link it with other works to produce a work based on this file,
24*10465441SEvalZero this file does not by itself cause the resulting work to be covered
25*10465441SEvalZero by the GNU General Public License. However the source code for this
26*10465441SEvalZero file must still be made available in accordance with section (3) of
27*10465441SEvalZero the GNU General Public License v2.
28*10465441SEvalZero
29*10465441SEvalZero This exception does not invalidate any other reasons why a work based
30*10465441SEvalZero on this file might be covered by the GNU General Public License.
31*10465441SEvalZero */
32*10465441SEvalZero
33*10465441SEvalZero /**
34*10465441SEvalZero * \file uffs_fileem.c
35*10465441SEvalZero * \brief emulate uffs file system
36*10465441SEvalZero * \author Ricky Zheng, created 9th May, 2005
37*10465441SEvalZero */
38*10465441SEvalZero
39*10465441SEvalZero
40*10465441SEvalZero #include <sys/types.h>
41*10465441SEvalZero #include <string.h>
42*10465441SEvalZero #include <stdio.h>
43*10465441SEvalZero #include <stdlib.h>
44*10465441SEvalZero #include "uffs_config.h"
45*10465441SEvalZero #include "uffs/uffs_device.h"
46*10465441SEvalZero #include "uffs_fileem.h"
47*10465441SEvalZero
48*10465441SEvalZero #define PFX "femu: "
49*10465441SEvalZero #define MSG(msg,...) uffs_PerrorRaw(UFFS_MSG_NORMAL, msg, ## __VA_ARGS__)
50*10465441SEvalZero #define MSGLN(msg,...) uffs_Perror(UFFS_MSG_NORMAL, msg, ## __VA_ARGS__)
51*10465441SEvalZero
52*10465441SEvalZero
53*10465441SEvalZero static struct uffs_StorageAttrSt g_femu_storage = {0};
54*10465441SEvalZero
55*10465441SEvalZero static struct uffs_FileEmuSt g_femu_private = {0};
56*10465441SEvalZero
57*10465441SEvalZero
femu_GetStorage()58*10465441SEvalZero struct uffs_StorageAttrSt * femu_GetStorage()
59*10465441SEvalZero {
60*10465441SEvalZero return &g_femu_storage;
61*10465441SEvalZero }
62*10465441SEvalZero
femu_GetPrivate()63*10465441SEvalZero struct uffs_FileEmuSt *femu_GetPrivate()
64*10465441SEvalZero {
65*10465441SEvalZero return &g_femu_private;
66*10465441SEvalZero }
67*10465441SEvalZero
femu_InitDevice(uffs_Device * dev)68*10465441SEvalZero URET femu_InitDevice(uffs_Device *dev)
69*10465441SEvalZero {
70*10465441SEvalZero uffs_FileEmu *emu = femu_GetPrivate();
71*10465441SEvalZero
72*10465441SEvalZero // setup device storage attr and private data structure.
73*10465441SEvalZero // all femu partition share one storage attribute
74*10465441SEvalZero
75*10465441SEvalZero dev->attr = femu_GetStorage();
76*10465441SEvalZero dev->attr->_private = (void *) emu;
77*10465441SEvalZero
78*10465441SEvalZero // setup flash driver operations, according to the ecc option.
79*10465441SEvalZero switch(dev->attr->ecc_opt) {
80*10465441SEvalZero case UFFS_ECC_NONE:
81*10465441SEvalZero case UFFS_ECC_SOFT:
82*10465441SEvalZero dev->ops = &g_femu_ops_ecc_soft;
83*10465441SEvalZero break;
84*10465441SEvalZero case UFFS_ECC_HW:
85*10465441SEvalZero dev->ops = &g_femu_ops_ecc_hw;
86*10465441SEvalZero break;
87*10465441SEvalZero case UFFS_ECC_HW_AUTO:
88*10465441SEvalZero dev->ops = &g_femu_ops_ecc_hw_auto;
89*10465441SEvalZero break;
90*10465441SEvalZero default:
91*10465441SEvalZero break;
92*10465441SEvalZero }
93*10465441SEvalZero
94*10465441SEvalZero #ifdef UFFS_FEMU_ENABLE_INJECTION
95*10465441SEvalZero // setup wrap functions, for inject ECC errors, etc.
96*10465441SEvalZero // check wrap_inited so that multiple devices can share the same driver
97*10465441SEvalZero if (!emu->wrap_inited) {
98*10465441SEvalZero femu_setup_wrapper_functions(dev);
99*10465441SEvalZero emu->wrap_inited = U_TRUE;
100*10465441SEvalZero }
101*10465441SEvalZero #endif
102*10465441SEvalZero
103*10465441SEvalZero return U_SUCC;
104*10465441SEvalZero }
105*10465441SEvalZero
106*10465441SEvalZero /* Nothing to do here */
femu_ReleaseDevice(uffs_Device * dev)107*10465441SEvalZero URET femu_ReleaseDevice(uffs_Device *dev)
108*10465441SEvalZero {
109*10465441SEvalZero return U_SUCC;
110*10465441SEvalZero }
111*10465441SEvalZero
112*10465441SEvalZero
113*10465441SEvalZero /////////////////////////////////////////////////////////////////////////////////
114