Mercurial > flash_v2
annotate packages/services/blib/current/src/blib.c @ 1777:c16341b1bac6 default tip
* Added execute permissions to files missed in conversion from CVS
| author | alexs |
|---|---|
| date | Mon, 12 Oct 2009 02:26:09 +0100 |
| parents | f240fdd6a1e7 |
| children |
| rev | line source |
|---|---|
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
1 //========================================================================== |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
2 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
3 // blib.c |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
4 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
5 // Block cache and access library |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
6 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
7 //========================================================================== |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
9 // ------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
11 // Copyright (C) 2003 Savin Zlobec |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
12 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later version. |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
16 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
20 // for more details. |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
21 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
22 // You should have received a copy of the GNU General Public License along |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
23 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
25 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
26 // As a special exception, if other files instantiate templates or use macros |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
27 // or inline functions from this file, or you compile this file and link it |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
28 // with other works to produce a work based on this file, this file does not |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
29 // by itself cause the resulting work to be covered by the GNU General Public |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
30 // License. However the source code for this file must still be made available |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
31 // in accordance with section (3) of the GNU General Public License. |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
32 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
33 // This exception does not invalidate any other reasons why a work based on |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
34 // this file might be covered by the GNU General Public License. |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
35 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
36 // ------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
37 //####ECOSGPLCOPYRIGHTEND#### |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
38 //========================================================================== |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
39 //#####DESCRIPTIONBEGIN#### |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
40 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
41 // Author(s): savin |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
42 // Date: 2003-08-29 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
43 // Description: |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
44 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
45 //####DESCRIPTIONEND#### |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
46 // |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
47 //========================================================================== |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
48 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
49 #include <cyg/io/io.h> |
| 1682 | 50 #include <cyg/infra/cyg_type.h> |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
51 #include <cyg/infra/cyg_ass.h> // assertion support |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
52 #include <cyg/infra/diag.h> // diagnostic output |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
53 #include <blib/blib.h> |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
54 |
| 1682 | 55 #include <string.h> // memcpy |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
56 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
57 #include <linux/rbtree.h> |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
58 #include <linux/list.h> |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
59 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
60 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
61 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
62 //#define DEBUG 1 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
63 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
64 #ifdef DEBUG |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
65 # define D(_args_) diag_printf _args_ |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
66 #else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
67 # define D(_args_) CYG_EMPTY_STATEMENT |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
68 #endif |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
69 |
| 1682 | 70 #define ALIGN(_x_) (((_x_) + (CYGARC_ALIGNMENT-1)) & ~(CYGARC_ALIGNMENT-1)) |
| 71 | |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
72 #ifdef CYGIMP_BLOCK_LIB_STATISTICS |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
73 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
74 #define STAT_INIT(_bl_) do { \ |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
75 bl->stat.n_gets = 0; \ |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
76 bl->stat.n_reads = 0; \ |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
77 bl->stat.n_writes = 0; \ |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
78 } while (0) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
79 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
80 #define STAT(_bl_, _group_) \ |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
81 ((_bl_)->stat._group_++) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
82 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
83 #else // CYGIMP_BLOCK_LIB_STATISTICS |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
84 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
85 #define STAT_INIT(_bl_) CYG_EMPTY_STATEMENT |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
86 #define STAT(_bl_, _group_) CYG_EMPTY_STATEMENT |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
87 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
88 #endif // not CYGIMP_BLOCK_LIB_STATISTICS |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
89 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
90 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
91 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
92 typedef struct { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
93 struct list_head list_node; // list node |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
94 struct rb_node rb_node; // red-black tree node |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
95 cyg_uint32 num; // block number |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
96 cyg_bool modified; // is this block data modified (needs write) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
97 cyg_uint8 data[0]; // block data |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
98 } blib_block_t; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
99 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
100 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
101 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
102 static blib_block_t * |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
103 rb_find_block(cyg_blib_t *bl, cyg_uint32 num) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
104 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
105 struct rb_node *node = bl->rb_root.rb_node; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
106 blib_block_t *block = NULL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
107 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
108 while (NULL != node) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
109 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
110 block = rb_entry(node, blib_block_t, rb_node); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
111 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
112 if (block->num == num) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
113 return block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
114 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
115 node = (block->num > num) ? node->rb_left : node->rb_right; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
116 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
117 return NULL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
118 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
119 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
120 static void |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
121 rb_add_block(cyg_blib_t *bl, blib_block_t *block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
122 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
123 struct rb_node *node = bl->rb_root.rb_node; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
124 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
125 if (NULL == node) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
126 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
127 rb_link_node(&block->rb_node, NULL, &bl->rb_root.rb_node); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
128 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
129 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
130 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
131 struct rb_node **link; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
132 blib_block_t *b = NULL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
133 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
134 while (NULL != node) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
135 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
136 b = rb_entry(node, blib_block_t, rb_node); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
137 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
138 CYG_ASSERTC(b->num != block->num); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
139 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
140 link = (b->num > block->num) ? &node->rb_left : &node->rb_right; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
141 node = *link; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
142 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
143 rb_link_node(&block->rb_node, &b->rb_node, link); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
144 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
145 rb_insert_color(&block->rb_node, &bl->rb_root); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
146 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
147 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
148 static __inline__ void |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
149 rb_del_block(cyg_blib_t *bl, blib_block_t *block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
150 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
151 rb_erase(&block->rb_node, &bl->rb_root); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
152 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
153 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
154 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
155 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
156 static __inline__ void |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
157 list_add_block(cyg_blib_t *bl, blib_block_t *block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
158 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
159 list_add(&block->list_node, &bl->list_head); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
160 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
161 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
162 static __inline__ void |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
163 list_del_block(cyg_blib_t *bl, blib_block_t *block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
164 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
165 list_del(&block->list_node); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
166 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
167 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
168 static __inline__ blib_block_t * |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
169 list_get_first_block(cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
170 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
171 return(list_entry(bl->list_head.next, blib_block_t, list_node)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
172 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
173 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
174 static __inline__ blib_block_t * |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
175 list_get_last_block(cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
176 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
177 return(list_entry(bl->list_head.prev, blib_block_t, list_node)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
178 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
179 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
180 static void |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
181 list_move_block_to_head(cyg_blib_t *bl, blib_block_t *block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
182 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
183 list_del(&block->list_node); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
184 list_add(&block->list_node, &bl->list_head); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
185 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
186 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
187 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
188 |
| 1682 | 189 static __inline__ void |
| 190 free_block(cyg_blib_t *bl, blib_block_t *block) | |
| 191 { | |
| 192 list_add(&block->list_node, &bl->free_list_head); | |
| 193 } | |
| 194 | |
| 195 static __inline__ blib_block_t * | |
| 196 alloc_block(cyg_blib_t *bl) | |
| 197 { | |
| 198 if ( !list_empty(&bl->free_list_head) ) | |
| 199 { | |
| 200 blib_block_t *new; | |
| 201 | |
| 202 new = list_entry(bl->free_list_head.next, blib_block_t, list_node); | |
| 203 list_del(bl->free_list_head.next); | |
| 204 | |
| 205 return new; | |
| 206 } | |
| 207 else | |
| 208 return NULL; | |
| 209 } | |
| 210 | |
| 211 static void | |
| 212 init_block_mem_pool(cyg_blib_t *bl) | |
| 213 { | |
| 214 cyg_uint8 *block_mem; | |
| 215 cyg_uint32 avail_mem_size, block_mem_size; | |
| 216 | |
| 217 INIT_LIST_HEAD(&bl->free_list_head); | |
| 218 | |
| 219 block_mem = bl->mem_base; | |
| 220 avail_mem_size = bl->mem_size; | |
| 221 block_mem_size = ALIGN(sizeof(blib_block_t) + bl->block_size); | |
| 222 | |
| 223 while (avail_mem_size >= block_mem_size) | |
| 224 { | |
| 225 blib_block_t *block = (blib_block_t *)block_mem; | |
| 226 | |
| 227 list_add(&block->list_node, &bl->free_list_head); | |
| 228 | |
| 229 block_mem += block_mem_size; | |
| 230 avail_mem_size -= block_mem_size; | |
| 231 } | |
| 232 } | |
| 233 | |
| 234 // -------------------------------------------------------------------- | |
| 235 | |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
236 static cyg_uint32 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
237 get_val_log2(cyg_uint32 val) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
238 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
239 cyg_uint32 i, log2; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
240 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
241 i = val; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
242 log2 = 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
243 while (0 == (i & 1)) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
244 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
245 i >>= 1; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
246 log2++; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
247 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
248 if (i != 1) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
249 return 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
250 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
251 return log2; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
252 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
253 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
254 static int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
255 blib_sync_block(cyg_blib_t *bl, blib_block_t *block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
256 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
257 int ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
258 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
259 if (block->modified) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
260 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
261 int len = 1; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
262 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
263 D(("blib writting block=%d\n", block->num)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
264 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
265 STAT(bl, n_writes); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
266 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
267 ret = bl->bwrite_fn(bl->priv, (void *)block->data, &len, block->num); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
268 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
269 if (ENOERR == ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
270 block->modified = false; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
271 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
272 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
273 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
274 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
275 static int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
276 blib_sync(cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
277 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
278 struct list_head *node = bl->list_head.next; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
279 blib_block_t *block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
280 int ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
281 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
282 D(("blib cache sync\n")); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
283 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
284 while (node != &bl->list_head) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
285 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
286 block = list_entry(node, blib_block_t, list_node); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
287 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
288 ret = blib_sync_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
289 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
290 break; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
291 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
292 node = node->next; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
293 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
294 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
295 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
296 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
297 static int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
298 blib_get_block(cyg_blib_t *bl, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
299 cyg_uint32 num, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
300 cyg_bool read_data, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
301 blib_block_t **dblock) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
302 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
303 blib_block_t *block = NULL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
304 int ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
305 int len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
306 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
307 D(("blib get block=%d\n", num)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
308 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
309 STAT(bl, n_gets); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
310 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
311 // first check if the most recently used block is the requested block, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
312 // this can improve performance when using byte access functions |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
313 if (!list_empty(&bl->list_head)) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
314 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
315 blib_block_t *first_block = list_get_first_block(bl); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
316 if (first_block->num == num) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
317 block = first_block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
318 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
319 block = rb_find_block(bl, num); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
320 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
321 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
322 if (NULL != block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
323 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
324 D(("blib block=%d found in cache\n", num)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
325 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
326 list_move_block_to_head(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
327 *dblock = block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
328 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
329 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
330 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
331 D(("blib block=%d NOT found in cache\n", num)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
332 |
| 1682 | 333 block = alloc_block(bl); |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
334 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
335 if (NULL == block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
336 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
337 CYG_ASSERTC(!list_empty(&bl->list_head)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
338 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
339 block = list_get_last_block(bl); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
340 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
341 D(("blib reusing block=%d space\n", block->num)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
342 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
343 ret = blib_sync_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
344 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
345 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
346 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
347 list_del_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
348 rb_del_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
349 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
350 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
351 block->num = num; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
352 block->modified = false; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
353 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
354 if (read_data) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
355 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
356 D(("blib reading block=%d\n", block->num)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
357 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
358 STAT(bl, n_reads); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
359 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
360 len = 1; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
361 ret = bl->bread_fn(bl->priv, (void *)block->data, &len, block->num); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
362 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
363 { |
| 1682 | 364 free_block(bl, block); |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
365 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
366 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
367 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
368 rb_add_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
369 list_add_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
370 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
371 *dblock = block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
372 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
373 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
374 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
375 static int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
376 blib_init_cache(cyg_blib_t *bl, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
377 void *mem_base, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
378 cyg_uint32 mem_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
379 cyg_uint32 block_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
380 cyg_bool reinit) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
381 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
382 int ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
383 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
384 if (reinit) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
385 { |
| 1682 | 386 ret = blib_sync(bl); |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
387 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
388 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
389 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
390 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
391 bl->rb_root = RB_ROOT; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
392 INIT_LIST_HEAD(&bl->list_head); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
393 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
394 bl->mem_base = mem_base; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
395 bl->mem_size = mem_size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
396 bl->block_size = block_size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
397 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
398 bl->block_size_log2 = get_val_log2(block_size); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
399 if (0 == bl->block_size_log2) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
400 return -EINVAL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
401 |
| 1682 | 402 init_block_mem_pool(bl); |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
403 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
404 STAT_INIT(bl); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
405 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
406 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
407 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
408 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
409 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
410 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
411 static int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
412 io_bread(void *priv, void *buf, cyg_uint32 *len, cyg_uint32 pos) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
413 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
414 return cyg_io_bread((cyg_io_handle_t)priv, buf, len, pos); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
415 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
416 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
417 static int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
418 io_bwrite(void *priv, const void *buf, cyg_uint32 *len, cyg_uint32 pos) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
419 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
420 return cyg_io_bwrite((cyg_io_handle_t)priv, buf, len, pos); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
421 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
422 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
423 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
424 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
425 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
426 cyg_blib_create(void *priv_data, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
427 void *mem_base, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
428 cyg_uint32 mem_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
429 cyg_uint32 block_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
430 cyg_blib_bread_fn bread_fn, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
431 cyg_blib_bwrite_fn bwrite_fn, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
432 cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
433 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
434 int ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
435 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
436 bl->priv = priv_data; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
437 bl->bread_fn = bread_fn; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
438 bl->bwrite_fn = bwrite_fn; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
439 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
440 ret = blib_init_cache(bl, mem_base, mem_size, block_size, false); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
441 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
442 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
443 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
444 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
445 cyg_blib_io_create(cyg_io_handle_t handle, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
446 void *mem_base, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
447 cyg_uint32 mem_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
448 cyg_uint32 block_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
449 cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
450 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
451 return cyg_blib_create((void *)handle, mem_base, mem_size, block_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
452 io_bread, io_bwrite, bl); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
453 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
454 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
455 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
456 cyg_blib_delete(cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
457 { |
| 1682 | 458 return blib_sync(bl); |
|
1476
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
459 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
460 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
461 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
462 cyg_blib_bread(cyg_blib_t *bl, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
463 void *buf, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
464 cyg_uint32 *len, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
465 cyg_uint32 pos) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
466 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
467 blib_block_t *block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
468 cyg_int32 size = *len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
469 cyg_int32 bnum = pos; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
470 cyg_uint8 *bbuf = buf; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
471 Cyg_ErrNo ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
472 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
473 D(("blib bread block=%d len=%d buf=%p\n", pos, *len, buf)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
474 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
475 while (size > 0) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
476 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
477 ret = blib_get_block(bl, bnum, true, &block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
478 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
479 break; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
480 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
481 memcpy((void *)bbuf, (void *)block->data, bl->block_size); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
482 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
483 bbuf += bl->block_size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
484 bnum++; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
485 size--; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
486 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
487 *len -= size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
488 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
489 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
490 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
491 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
492 cyg_blib_bwrite(cyg_blib_t *bl, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
493 const void *buf, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
494 cyg_uint32 *len, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
495 cyg_uint32 pos) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
496 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
497 blib_block_t *block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
498 cyg_int32 size = *len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
499 cyg_int32 bnum = pos; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
500 cyg_uint8 *bbuf = (cyg_uint8 * const) buf; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
501 Cyg_ErrNo ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
502 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
503 D(("blib bwrite block=%d len=%d buf=%p\n", pos, *len, buf)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
504 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
505 while (size > 0) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
506 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
507 ret = blib_get_block(bl, bnum, false, &block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
508 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
509 break; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
510 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
511 memcpy((void *)block->data, (void *)bbuf, bl->block_size); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
512 block->modified = true; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
513 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
514 bbuf += bl->block_size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
515 bnum++; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
516 size--; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
517 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
518 *len -= size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
519 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
520 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
521 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
522 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
523 cyg_blib_read(cyg_blib_t *bl, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
524 void *buf, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
525 cyg_uint32 *len, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
526 cyg_uint32 bnum, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
527 cyg_uint32 pos) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
528 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
529 blib_block_t *block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
530 cyg_uint8 *bbuf = buf; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
531 cyg_int32 size = *len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
532 Cyg_ErrNo ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
533 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
534 size = *len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
535 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
536 if (pos >= bl->block_size) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
537 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
538 bnum += pos >> bl->block_size_log2; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
539 pos = pos & (bl->block_size - 1); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
540 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
541 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
542 D(("blib read len=%d pos=%d bnum=%d\n", *len, pos, bnum)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
543 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
544 while (size > 0) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
545 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
546 int csize; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
547 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
548 if ((size + pos) > bl->block_size) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
549 csize = bl->block_size - pos; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
550 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
551 csize = size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
552 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
553 ret = blib_get_block(bl, bnum, true, &block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
554 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
555 break; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
556 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
557 memcpy((void *)bbuf, (void *)(block->data+pos), csize); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
558 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
559 bbuf += csize; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
560 size -= csize; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
561 pos = 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
562 bnum++; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
563 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
564 *len -= size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
565 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
566 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
567 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
568 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
569 cyg_blib_write(cyg_blib_t *bl, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
570 const void *buf, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
571 cyg_uint32 *len, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
572 cyg_uint32 bnum, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
573 cyg_uint32 pos) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
574 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
575 blib_block_t *block; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
576 cyg_uint8 *bbuf = (cyg_uint8 * const) buf; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
577 cyg_int32 size = *len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
578 Cyg_ErrNo ret = ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
579 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
580 size = *len; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
581 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
582 if (pos >= bl->block_size) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
583 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
584 bnum += pos >> bl->block_size_log2; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
585 pos = pos & (bl->block_size - 1); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
586 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
587 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
588 D(("blib write len=%d pos=%d bnum=%d\n", *len, pos, bnum)); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
589 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
590 while (size > 0) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
591 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
592 int csize; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
593 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
594 if ((size + pos) > bl->block_size) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
595 csize = bl->block_size - pos; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
596 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
597 csize = size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
598 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
599 if (0 == pos && csize == bl->block_size) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
600 ret = blib_get_block(bl, bnum, false, &block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
601 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
602 ret = blib_get_block(bl, bnum, true, &block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
603 if (ENOERR != ret) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
604 break; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
605 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
606 memcpy((void *)(block->data+pos), (void *)bbuf, csize); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
607 block->modified = true; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
608 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
609 bbuf += csize; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
610 size -= csize; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
611 pos = 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
612 bnum++; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
613 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
614 *len -= size; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
615 return ret; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
616 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
617 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
618 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
619 cyg_blib_sync(cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
620 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
621 return blib_sync(bl); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
622 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
623 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
624 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
625 cyg_blib_sync_block(cyg_blib_t *bl, cyg_uint32 num) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
626 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
627 blib_block_t *block = rb_find_block(bl, num); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
628 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
629 if (NULL != block) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
630 return blib_sync_block(bl, block); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
631 else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
632 return -EINVAL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
633 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
634 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
635 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
636 cyg_blib_flush(cyg_blib_t *bl) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
637 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
638 return blib_init_cache(bl, bl->mem_base, bl->mem_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
639 bl->block_size, true); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
640 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
641 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
642 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
643 cyg_blib_set_block_size(cyg_blib_t *bl, cyg_uint32 block_size) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
644 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
645 return blib_init_cache(bl, bl->mem_base, bl->mem_size, |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
646 block_size, true); |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
647 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
648 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
649 int |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
650 cyg_blib_get_stat(cyg_blib_t *bl, cyg_blib_stat_t *stat) |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
651 { |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
652 #ifdef CYGIMP_BLOCK_LIB_STATISTICS |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
653 *stat = bl->stat; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
654 return ENOERR; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
655 #else |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
656 stat->n_gets = 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
657 stat->n_reads = 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
658 stat->n_writes = 0; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
659 return -EINVAL; |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
660 #endif |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
661 } |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
662 |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
663 // -------------------------------------------------------------------- |
|
f2453fae08d4
Added support for FAT filesystem. Several packages, see the individual
nickg
parents:
diff
changeset
|
664 // EOF blib.c |
