xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/uffs/src/example/static-mem-allocate.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 static-mem-allocate.c
35*10465441SEvalZero  * \brief demostrate how to use static memory allocation. This example use
36*10465441SEvalZero  *        file emulated NAND flash, one partition only.
37*10465441SEvalZero  * \author Ricky Zheng
38*10465441SEvalZero  */
39*10465441SEvalZero 
40*10465441SEvalZero #include <stdio.h>
41*10465441SEvalZero #include <string.h>
42*10465441SEvalZero #include <stdlib.h>
43*10465441SEvalZero #include "uffs_config.h"
44*10465441SEvalZero #include "uffs/uffs_public.h"
45*10465441SEvalZero #include "uffs/uffs_fs.h"
46*10465441SEvalZero #include "uffs/uffs_utils.h"
47*10465441SEvalZero #include "uffs/uffs_core.h"
48*10465441SEvalZero #include "uffs/uffs_mtb.h"
49*10465441SEvalZero #include "cmdline.h"
50*10465441SEvalZero #include "uffs_fileem.h"
51*10465441SEvalZero 
52*10465441SEvalZero #define PFX "sexp: "
53*10465441SEvalZero 
54*10465441SEvalZero #if CONFIG_USE_STATIC_MEMORY_ALLOCATOR == 0
main()55*10465441SEvalZero int main()
56*10465441SEvalZero {
57*10465441SEvalZero 	uffs_Perror(UFFS_MSG_NORMAL, "This example need CONFIG_USE_STATIC_MEMORY_ALLOCATOR = 1");
58*10465441SEvalZero 	return 0;
59*10465441SEvalZero }
60*10465441SEvalZero #else
61*10465441SEvalZero 
62*10465441SEvalZero extern struct cli_commandset * get_helper_cmds(void);
63*10465441SEvalZero extern struct cli_commandset * get_test_cmds(void);
64*10465441SEvalZero 
65*10465441SEvalZero #define PAGE_DATA_SIZE    512
66*10465441SEvalZero #define PAGE_SPARE_SIZE   16
67*10465441SEvalZero #define PAGES_PER_BLOCK   32
68*10465441SEvalZero #define TOTAL_BLOCKS      128
69*10465441SEvalZero 
70*10465441SEvalZero #define PAGE_SIZE					(PAGE_DATA_SIZE + PAGE_SPARE_SIZE)
71*10465441SEvalZero #define BLOCK_DATA_SIZE				(PAGES_PER_BLOCK * PAGE_DATA_SIZE)
72*10465441SEvalZero #define TOTAL_DATA_SIZE				(TOTAL_BLOCKS * BLOCK_DATA_SIZE)
73*10465441SEvalZero #define BLOCK_SIZE					(PAGES_PER_BLOCK * PAGE_SIZE)
74*10465441SEvalZero #define TOTAL_SIZE					(BLOCK_SIZE * TOTAL_BLOCKS)
75*10465441SEvalZero 
76*10465441SEvalZero #define MAX_MOUNT_TABLES		10
77*10465441SEvalZero #define MAX_MOUNT_POINT_NAME	32
78*10465441SEvalZero 
79*10465441SEvalZero static uffs_Device demo_device = {0};
80*10465441SEvalZero static struct uffs_MountTableEntrySt demo_mount = {
81*10465441SEvalZero 	&demo_device,
82*10465441SEvalZero 	0,    /* start from block 0 */
83*10465441SEvalZero 	-1,   /* use whole chip */
84*10465441SEvalZero 	"/",  /* mount point */
85*10465441SEvalZero 	NULL
86*10465441SEvalZero };
87*10465441SEvalZero 
88*10465441SEvalZero /* static alloc the memory */
89*10465441SEvalZero static int static_buffer_pool[UFFS_STATIC_BUFF_SIZE(PAGES_PER_BLOCK, PAGE_SIZE, TOTAL_BLOCKS) / sizeof(int)];
90*10465441SEvalZero 
91*10465441SEvalZero 
setup_storage(struct uffs_StorageAttrSt * attr)92*10465441SEvalZero static void setup_storage(struct uffs_StorageAttrSt *attr)
93*10465441SEvalZero {
94*10465441SEvalZero 	attr->total_blocks = TOTAL_BLOCKS;			/* total blocks */
95*10465441SEvalZero 	attr->page_data_size = PAGE_DATA_SIZE;		/* page data size */
96*10465441SEvalZero 	attr->spare_size = PAGE_SPARE_SIZE;		  	/* page spare size */
97*10465441SEvalZero 	attr->pages_per_block = PAGES_PER_BLOCK;	/* pages per block */
98*10465441SEvalZero 	attr->block_status_offs = 4;				/* block status offset is 5th byte in spare */
99*10465441SEvalZero     attr->ecc_opt = UFFS_ECC_SOFT;              /* use UFFS software ecc */
100*10465441SEvalZero     attr->layout_opt = UFFS_LAYOUT_UFFS;        /* let UFFS do the spare layout */
101*10465441SEvalZero }
102*10465441SEvalZero 
setup_device(uffs_Device * dev)103*10465441SEvalZero static void setup_device(uffs_Device *dev)
104*10465441SEvalZero {
105*10465441SEvalZero 	// using file emulator device
106*10465441SEvalZero 	dev->Init = femu_InitDevice;
107*10465441SEvalZero 	dev->Release = femu_ReleaseDevice;
108*10465441SEvalZero 	dev->attr = femu_GetStorage();
109*10465441SEvalZero }
110*10465441SEvalZero 
init_uffs_fs(void)111*10465441SEvalZero static int init_uffs_fs(void)
112*10465441SEvalZero {
113*10465441SEvalZero 	struct uffs_MountTableEntrySt *mtbl = &demo_mount;
114*10465441SEvalZero 
115*10465441SEvalZero 	/* setup flash storage attributes */
116*10465441SEvalZero 	setup_storage(femu_GetStorage());
117*10465441SEvalZero 
118*10465441SEvalZero 	/* setup memory allocator */
119*10465441SEvalZero 	uffs_MemSetupStaticAllocator(&mtbl->dev->mem, static_buffer_pool, sizeof(static_buffer_pool));
120*10465441SEvalZero 
121*10465441SEvalZero 	/* setup device: init, release, attr */
122*10465441SEvalZero 	setup_device(mtbl->dev);
123*10465441SEvalZero 
124*10465441SEvalZero 	/* register mount table */
125*10465441SEvalZero 	uffs_RegisterMountTable(mtbl);
126*10465441SEvalZero 
127*10465441SEvalZero 	/* mount it */
128*10465441SEvalZero 	uffs_Mount("/");
129*10465441SEvalZero 
130*10465441SEvalZero 	return uffs_InitFileSystemObjects() == U_SUCC ? 0 : -1;
131*10465441SEvalZero }
132*10465441SEvalZero 
release_uffs_fs(void)133*10465441SEvalZero static int release_uffs_fs(void)
134*10465441SEvalZero {
135*10465441SEvalZero 	uffs_UnMount("/");
136*10465441SEvalZero 
137*10465441SEvalZero 	return uffs_ReleaseFileSystemObjects();
138*10465441SEvalZero }
139*10465441SEvalZero 
main(int argc,char * argv[])140*10465441SEvalZero int main(int argc, char *argv[])
141*10465441SEvalZero {
142*10465441SEvalZero 	int ret;
143*10465441SEvalZero 
144*10465441SEvalZero 	uffs_SetupDebugOutput(); 	// setup debug output as early as possible
145*10465441SEvalZero 
146*10465441SEvalZero 	ret = init_uffs_fs();
147*10465441SEvalZero 
148*10465441SEvalZero 	if (ret != 0) {
149*10465441SEvalZero 		printf ("Init file system fail: %d\n", ret);
150*10465441SEvalZero 		return -1;
151*10465441SEvalZero 	}
152*10465441SEvalZero 
153*10465441SEvalZero 	cli_add_commandset(get_helper_cmds());
154*10465441SEvalZero 	cli_add_commandset(get_test_cmds());
155*10465441SEvalZero 	cli_main_entry();
156*10465441SEvalZero 
157*10465441SEvalZero 	release_uffs_fs();
158*10465441SEvalZero 
159*10465441SEvalZero 	return 0;
160*10465441SEvalZero }
161*10465441SEvalZero 
162*10465441SEvalZero #endif
163*10465441SEvalZero 
164