?? filesystem.lst
字號:
1 .file "filesystem.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __CCP__ = 0x34
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
118 .global filesystem_format
120 filesystem_format:
1:io/filesystem.c **** /*
2:io/filesystem.c **** ,-----------------------------------------------------------------------------------------.
3:io/filesystem.c **** | io/filesystem
4:io/filesystem.c **** |-----------------------------------------------------------------------------------------
5:io/filesystem.c **** | this file implements a very very basic (custom) filesystem (->dataflash)
6:io/filesystem.c **** | - 600 files max
7:io/filesystem.c **** | - smallest file unit is 256 Byte
8:io/filesystem.c **** | - store file as linked list across the whole dataflash
9:io/filesystem.c **** | - file extension is always lowercase !!
10:io/filesystem.c **** | - see below for filesystem information
11:io/filesystem.c **** |
12:io/filesystem.c **** | Author : {{removed according to contest rules}}
13:io/filesystem.c **** | -> circuitcellar.com avr design contest 2006
14:io/filesystem.c **** | -> Entry #AT2616
15:io/filesystem.c **** |
16:io/filesystem.c **** |-----------------------------------------------------------------------------------------
17:io/filesystem.c **** | License:
18:io/filesystem.c **** | This program is free software; you can redistribute it and/or modify it under
19:io/filesystem.c **** | the terms of the GNU General Public License as published by the Free Software
20:io/filesystem.c **** | Foundation; either version 2 of the License, or (at your option) any later
21:io/filesystem.c **** | version.
22:io/filesystem.c **** | This program is distributed in the hope that it will be useful, but
23:io/filesystem.c **** |
24:io/filesystem.c **** | WITHOUT ANY WARRANTY;
25:io/filesystem.c **** |
26:io/filesystem.c **** | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
27:io/filesystem.c **** | PURPOSE. See the GNU General Public License for more details.
28:io/filesystem.c **** |
29:io/filesystem.c **** | You should have received a copy of the GNU General Public License along with
30:io/filesystem.c **** | this program; if not, write to the Free Software Foundation, Inc., 51
31:io/filesystem.c **** | Franklin St, Fifth Floor, Boston, MA 02110, USA
32:io/filesystem.c **** |
33:io/filesystem.c **** | http://www.gnu.de/gpl-ger.html
34:io/filesystem.c **** `-----------------------------------------------------------------------------------------*/
35:io/filesystem.c **** #include "filesystem.h"
36:io/filesystem.c **** #include "dataflash.h"
37:io/filesystem.c ****
38:io/filesystem.c **** //ACTIVATE DEBUG by editing this file:
39:io/filesystem.c **** #include "debug.h"
40:io/filesystem.c ****
41:io/filesystem.c **** #define FILESYSTEM_REVISION 0x01
42:io/filesystem.c ****
43:io/filesystem.c **** /*
44:io/filesystem.c **** store filesystem on dataflash
45:io/filesystem.c ****
46:io/filesystem.c **** simple quick and dirty filesystem.
47:io/filesystem.c **** store files in multiples of pagesize, every file chunk
48:io/filesystem.c **** stores a pointer to the next data segment (linked list)
49:io/filesystem.c ****
50:io/filesystem.c **** -------------------------------------------------------------------------------
51:io/filesystem.c **** every file consists of blocks with 256+8 Byte (=pagesize)
52:io/filesystem.c **** - byte 0-255: DATA
53:io/filesystem.c **** - byte 256: free/used tag -- 0xE0 -> used page, everything else: free page
54:io/filesystem.c **** - byte 257: filesystem revision (starts with 0x01)
55:io/filesystem.c **** - byte 258+259: file id (16bit uint)
56:io/filesystem.c **** - byte 260+261: pointer to next file block
57:io/filesystem.c **** - byte 262: block tag: 0x00 = first block, 0xEE = last block -> blocktag != 0xEE -> read more
58:io/filesystem.c **** - byte 262: how many bytes of this block are used
59:io/filesystem.c ****
60:io/filesystem.c **** -------------------------------------------------------------------------------*/
61:io/filesystem.c **** #define FILESYSTEM_FILE_FREETAG 0x100
62:io/filesystem.c **** #define FILESYSTEM_FILE_REV 0x101
63:io/filesystem.c **** #define FILESYSTEM_FILE_ID_HI 0x102
64:io/filesystem.c **** #define FILESYSTEM_FILE_ID_LO 0x103
65:io/filesystem.c **** #define FILESYSTEM_FILE_NEXT_HI 0x104
66:io/filesystem.c **** #define FILESYSTEM_FILE_NEXT_LO 0x105
67:io/filesystem.c **** #define FILESYSTEM_FILE_BLOCKTAG 0x106
68:io/filesystem.c **** #define FILESYSTEM_FILE_BLOCK_USAGE 0x107
69:io/filesystem.c ****
70:io/filesystem.c **** /*
71:io/filesystem.c **** -------------------------------------------------------------------------------
72:io/filesystem.c **** filesystem info table is stored in block 0-49
73:io/filesystem.c **** - every entry has 24 bytes:
74:io/filesystem.c **** - byte 0- 1 : 16 bit file id (uint) (valid fileid: 1...549)
75:io/filesystem.c **** - byte 2- 5 : 32 bit timestamp (last modified)
76:io/filesystem.c **** - byte 6-16 : 11 byte filename (8+3 chars)
77:io/filesystem.c **** - byte 17-18 : address of first block
78:io/filesystem.c **** - byte 19-20 : address of last block
79:io/filesystem.c **** - byte 21-23 : RESERVED
80:io/filesystem.c **** -------------------------------------------------------------------------------
81:io/filesystem.c ****
82:io/filesystem.c **** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
83:io/filesystem.c **** WARNING: we only support one open file (for writing) at one time !!!
84:io/filesystem.c **** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
85:io/filesystem.c ****
86:io/filesystem.c **** */
87:io/filesystem.c ****
88:io/filesystem.c **** ///
89:io/filesystem.c **** /// TODO:
90:io/filesystem.c **** /// - replace writing of 0s with dataflash erase cmd !!!!
91:io/filesystem.c **** #define FILESYSTEM_TABLE_SIZE 50
92:io/filesystem.c **** #define FILESYSTEM_BLOCK_COUNT 2048
93:io/filesystem.c ****
94:io/filesystem.c **** #define FILESYSTEM_STATUS_IDLE 0x00
95:io/filesystem.c **** #define FILESYSTEM_STATUS_FILE_OPEN 0x01
96:io/filesystem.c ****
97:io/filesystem.c **** #define FILESYSTEM_FTABLE_ID_HI 0
98:io/filesystem.c **** #define FILESYSTEM_FTABLE_ID_LO 1
99:io/filesystem.c **** #define FILESYSTEM_FTABLE_TIMESTAMP_3 2
100:io/filesystem.c **** #define FILESYSTEM_FTABLE_TIMESTAMP_2 3
101:io/filesystem.c **** #define FILESYSTEM_FTABLE_TIMESTAMP_1 4
102:io/filesystem.c **** #define FILESYSTEM_FTABLE_TIMESTAMP_0 5
103:io/filesystem.c **** //position of filename start
104:io/filesystem.c **** #define FILESYSTEM_FTABLE_FILENAME_START 6
105:io/filesystem.c **** #define FILESYSTEM_FTABLE_BLOCK_START_HI 17
106:io/filesystem.c **** #define FILESYSTEM_FTABLE_BLOCK_START_LO 18
107:io/filesystem.c **** #define FILESYSTEM_FTABLE_BLOCK_COUNT_HI 19
108:io/filesystem.c **** #define FILESYSTEM_FTABLE_BLOCK_COUNT_LO 20
109:io/filesystem.c ****
110:io/filesystem.c **** volatile unsigned char filesystem_status;
111:io/filesystem.c **** volatile unsigned int filesystem_fileid;
112:io/filesystem.c ****
113:io/filesystem.c **** volatile unsigned int filesystem_first_block;
114:io/filesystem.c **** volatile unsigned int filesystem_current_block;
115:io/filesystem.c **** volatile unsigned int filesystem_block_count;
116:io/filesystem.c ****
117:io/filesystem.c ****
118:io/filesystem.c **** volatile unsigned char filesystem_filename[8];
119:io/filesystem.c **** volatile unsigned char filesystem_filename_ext[3];
120:io/filesystem.c ****
121:io/filesystem.c **** unsigned char filesystem_buffer[256];
122:io/filesystem.c ****
123:io/filesystem.c **** volatile unsigned char filesystem_file_pos;
124:io/filesystem.c ****
125:io/filesystem.c **** //init
126:io/filesystem.c **** void filesystem_init(){
127:io/filesystem.c **** filesystem_status = FILESYSTEM_STATUS_IDLE;
128:io/filesystem.c **** filesystem_fileid = 0;
129:io/filesystem.c **** filesystem_first_block = 0;
130:io/filesystem.c **** filesystem_current_block = 0;
131:io/filesystem.c ****
132:io/filesystem.c **** filesystem_file_pos = 0;
133:io/filesystem.c ****
134:io/filesystem.c **** //check if we need to format flash:
135:io/filesystem.c **** dataflash_copy_page_to_buffer(0, 0);
136:io/filesystem.c **** if ((dataflash_read_buffer(0, 0)==0xFF) && (dataflash_read_buffer(1, 0)==0xFF))
137:io/filesystem.c **** filesystem_format();
138:io/filesystem.c **** }
139:io/filesystem.c ****
140:io/filesystem.c **** void filesystem_delete_file(unsigned int fileid){
141:io/filesystem.c **** unsigned int tmp;
142:io/filesystem.c **** unsigned int tmp_old;
143:io/filesystem.c **** unsigned int pos;
144:io/filesystem.c ****
145:io/filesystem.c **** //invalid fileid ?
146:io/filesystem.c **** if (fileid == 0)
147:io/filesystem.c **** return;
148:io/filesystem.c ****
149:io/filesystem.c **** //copy lookuptable page to dataflash buffer 0
150:io/filesystem.c **** dataflash_copy_page_to_buffer(((fileid-1)/11), 0);
151:io/filesystem.c ****
152:io/filesystem.c **** //pos inside page is ?
153:io/filesystem.c **** pos = 24*((fileid-1) % 11);
154:io/filesystem.c ****
155:io/filesystem.c **** #if FILESYSTEM_DEBUG
156:io/filesystem.c **** softuart_puts_progmem("FS : deleting #");
157:io/filesystem.c **** softuart_put_uint16(fileid);
158:io/filesystem.c **** softuart_puts_progmem("... ");
159:io/filesystem.c **** #endif
160:io/filesystem.c ****
161:io/filesystem.c **** //get first block:
162:io/filesystem.c **** tmp = dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_HI, 0)<<8;
163:io/filesystem.c **** tmp |= dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_LO, 0);
164:io/filesystem.c ****
165:io/filesystem.c **** //mark lookup table entry as empty:
166:io/filesystem.c **** dataflash_write_to_page_buffer(pos+FILESYSTEM_FTABLE_ID_HI,0,0);
167:io/filesystem.c **** dataflash_write_to_page_buffer(pos+FILESYSTEM_FTABLE_ID_LO,0,0);
168:io/filesystem.c ****
169:io/filesystem.c **** //store lookuptable
170:io/filesystem.c **** dataflash_copy_buffer_to_page(((fileid-1)/11), 0);
171:io/filesystem.c ****
172:io/filesystem.c **** //clear buffer:
173:io/filesystem.c **** for (unsigned int j=0; j<256+8; j++)
174:io/filesystem.c **** dataflash_write_to_page_buffer(j,1,0);
175:io/filesystem.c ****
176:io/filesystem.c **** while (tmp != 0x0000){
177:io/filesystem.c **** #if FILESYSTEM_DEBUG
178:io/filesystem.c **** softuart_putc('x');
179:io/filesystem.c **** #endif
180:io/filesystem.c **** //copy block to buffer0:
181:io/filesystem.c **** dataflash_copy_page_to_buffer(tmp, 0);
182:io/filesystem.c ****
183:io/filesystem.c **** //remember page to clear
184:io/filesystem.c **** tmp_old = tmp;
185:io/filesystem.c ****
186:io/filesystem.c **** //calc next block:
187:io/filesystem.c **** tmp = dataflash_read_buffer(FILESYSTEM_FILE_NEXT_HI, 0)<<8;
188:io/filesystem.c **** tmp |= dataflash_read_buffer(FILESYSTEM_FILE_NEXT_LO, 0);
189:io/filesystem.c ****
190:io/filesystem.c **** //tmp should be zero if this is the last block. but we have a flag for last block, too:
191:io/filesystem.c **** if (dataflash_read_buffer(FILESYSTEM_FILE_BLOCKTAG,0) == 0xEE)
192:io/filesystem.c **** tmp = 0x0000; //last block!
193:io/filesystem.c **** else
194:io/filesystem.c **** dataflash_copy_buffer_to_page(tmp_old,1);
195:io/filesystem.c **** }
196:io/filesystem.c **** #if FILESYSTEM_DEBUG
197:io/filesystem.c **** softuart_puts_progmem(" done");
198:io/filesystem.c **** softuart_putnewline();
199:io/filesystem.c **** #endif
200:io/filesystem.c **** }
201:io/filesystem.c ****
202:io/filesystem.c **** /*
203:io/filesystem.c **** void filesystem_dump_file(unsigned int fileid){
204:io/filesystem.c **** unsigned int tmp;
205:io/filesystem.c **** unsigned int count;
206:io/filesystem.c **** unsigned int pos;
207:io/filesystem.c ****
208:io/filesystem.c **** //invalid fileid ?
209:io/filesystem.c **** if (fileid == 0)
210:io/filesystem.c **** return;
211:io/filesystem.c ****
212:io/filesystem.c **** //copy lookuptable page to dataflash buffer 0
213:io/filesystem.c **** dataflash_copy_page_to_buffer(((fileid-1)/11), 0);
214:io/filesystem.c ****
215:io/filesystem.c **** //pos inside page is ?
216:io/filesystem.c **** pos = 24*((fileid-1) % 11);
217:io/filesystem.c ****
218:io/filesystem.c **** #if FILESYSTEM_DEBUG
219:io/filesystem.c **** softuart_puts_progmem("FS : dumping #");
220:io/filesystem.c **** softuart_put_uint16(fileid);
221:io/filesystem.c **** softuart_puts_progmem(", loc on block ");
222:io/filesystem.c **** softuart_put_uint16((fileid-1)/11);
223:io/filesystem.c **** softuart_puts_progmem(", pos ");
224:io/filesystem.c **** softuart_put_uint8(pos);
225:io/filesystem.c **** softuart_putnewline();
226:io/filesystem.c **** #endif
227:io/filesystem.c ****
228:io/filesystem.c **** //get first block:
229:io/filesystem.c **** tmp = dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_HI, 0)<<8;
230:io/filesystem.c **** tmp |= dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_LO, 0);
231:io/filesystem.c ****
232:io/filesystem.c ****
233:io/filesystem.c **** while (tmp != 0x0000){
234:io/filesystem.c **** //copy block to buffer0:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -