xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/uffs/src/emu/uffs_fileem.c (revision 104654410c56c573564690304ae786df310c91fc)
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