📄 filesystem.lst
字号:
925:io/filesystem.c **** filesystem_fileid = 0;
926:io/filesystem.c **** filesystem_first_block = 0;
927:io/filesystem.c **** filesystem_current_block = 0;
928:io/filesystem.c **** filesystem_file_pos = 0;
929:io/filesystem.c **** }
930:io/filesystem.c ****
931:io/filesystem.c ****
932:io/filesystem.c **** //alocate 264 byte block & store file info header inside:
933:io/filesystem.c **** unsigned int filesystem_allocate_block(){
934:io/filesystem.c **** //search block
935:io/filesystem.c **** #if FILESYSTEM_DEBUG
936:io/filesystem.c **** softuart_puts_progmem("FS : searching free block...");
937:io/filesystem.c **** #endif
180 37,.LM7-.LFBB2
181 .LM7:
182 .LFBB2:
183 0042 CF93 push r28
184 0044 DF93 push r29
185 /* prologue: function */
186 /* frame size = 0 */
188 .LM8:
189 0046 C2E3 ldi r28,lo8(50)
190 0048 D0E0 ldi r29,hi8(50)
191 .L10:
192 .LBB2:
938:io/filesystem.c **** e to buffer
939:io/filesystem.c **** dataflash_copy_page_to_buffer(b, 1);
940:io/filesystem.c ****
941:io/filesystem.c **** //rprintf("FS: checking block: [%d].\r\n",b);
942:io/filesystem.c **** //is it free ?
943:io/filesystem.c **** //-> ignore b = current block !
944:io/filesystem.c **** if ((dataflash_read_buffer(FILESYSTEM_FILE_FREETAG,1) != 0xE0) && (b != filesystem_current_block)
193 944,.LM9-.LFBB2
194 .LM9:
195 004a CE01 movw r24,r28
196 004c 61E0 ldi r22,lo8(1)
197 004e 0E94 0000 call dataflash_copy_page_to_buffer
945:io/filesystem.c **** free !
946:io/filesystem.c **** #if FILESYSTEM_DEBUG
947:io/filesystem.c **** softuart_puts_progmem(" found block ");
948:io/filesystem.c **** softuart_put_uint16(b);
949:io/filesystem.c **** softuart_putnewline();
198 bn 68,0,949,.LM10-.LFBB2
199 .LM10:
200 0052 80E0 ldi r24,lo8(256)
201 0054 91E0 ldi r25,hi8(256)
202 0056 61E0 ldi r22,lo8(1)
203 0058 0E94 0000 call dataflash_read_buffer
204 005c 803E cpi r24,lo8(-32)
205 005e 01F0 breq .L8
206 0060 8091 0000 lds r24,filesystem_current_block
207 0064 9091 0000 lds r25,(filesystem_current_block)+1
208 0068 C817 cp r28,r24
209 006a D907 cpc r29,r25
210 006c 01F4 brne .L9
211 .L8:
213 .LM11:
214 006e 2196 adiw r28,1
215 0070 88E0 ldi r24,hi8(2048)
216 0072 C030 cpi r28,lo8(2048)
217 0074 D807 cpc r29,r24
218 0076 01F4 brne .L10
219 0078 C0E0 ldi r28,lo8(0)
220 007a D0E0 ldi r29,hi8(0)
221 .L9:
222 .LBE2:
950:io/filesystem.c **** ndif
951:io/filesystem.c **** return b;
952:io/filesystem.c **** }
953:io/filesystem.c **** }
954:io/filesystem.c **** //no free block found :(
955:io/filesystem.c **** #if FILESYSTEM_DEBUG
956:io/filesystem.c **** softuart_puts_progmem(" FAILED -> FS FULL ?!");
957:io/filesystem.c **** softuart_putnewline();
958:io/filesystem.c **** #endif
959:io/filesystem.c **** return 0;
960:io/filesystem.c **** }
961:io/filesystem.c ****
962:io/filesystem.c **** //open a new file:
963:io/filesystem.c **** unsigned int filesystem_open_file_wr(unsigned char *filename, unsigned char *filename_ext){
964:io/filesystem.c **** //make sure there is no open file !
965:io/filesystem.c **** if (filesystem_status != FILESYSTEM_STATUS_IDLE)
223 FBB2
224 .LM12:
225 007c CE01 movw r24,r28
226 /* epilogue start */
227 007e DF91 pop r29
228 0080 CF91 pop r28
229 0082 0895 ret
231 .Lscope2:
234 .global filesystem_store_current_block
236 filesystem_store_current_block:
966:io/filesystem.c **** se_file();
967:io/filesystem.c ****
968:io/filesystem.c **** //make file extension lowercase !!
969:io/filesystem.c **** for(unsigned char i=0; i<3 && filename_ext[i] != 0; i++){
970:io/filesystem.c **** if ((filename_ext[i] >= 'A') && (filename_ext[i] <= 'Z'))
971:io/filesystem.c **** filename_ext[i] = filename_ext[i] - 'A' + 'a';
972:io/filesystem.c **** }
973:io/filesystem.c ****
974:io/filesystem.c **** //protect filename, only allow a-zA-Z0-9_-
975:io/filesystem.c **** for(unsigned char i=0; i<8; i++){
976:io/filesystem.c **** if (filename[i] == 0)
977:io/filesystem.c **** break;
978:io/filesystem.c **** if (
979:io/filesystem.c **** !((filename[i] >= 'a') && (filename[i] <= 'z')) &&
980:io/filesystem.c **** !((filename[i] >= 'A') && (filename[i] <= 'Z')) &&
981:io/filesystem.c **** !((filename[i] >= '0') && (filename[i] <= '9'))
982:io/filesystem.c **** ){
983:io/filesystem.c **** filename[i] = '_';
984:io/filesystem.c **** }
985:io/filesystem.c **** }
986:io/filesystem.c ****
987:io/filesystem.c **** #if FILESYSTEM_DEBUG
988:io/filesystem.c **** softuart_puts_progmem("FS : new file [");
989:io/filesystem.c **** for(unsigned char i=0; i<8 && filename[i] != 0; i++)
990:io/filesystem.c **** softuart_putc(filename[i]);
991:io/filesystem.c **** softuart_putc('.');
992:io/filesystem.c **** for(unsigned char i=0; i<3 && filename_ext[i] != 0; i++)
993:io/filesystem.c **** softuart_putc(filename_ext[i]);
994:io/filesystem.c **** softuart_putc(']');
995:io/filesystem.c **** softuart_putnewline();
996:io/filesystem.c **** #endif
997:io/filesystem.c ****
998:io/filesystem.c **** //check if file exists, returns 0 if file is unknown!
999:io/filesystem.c **** filesystem_fileid = filesystem_search_file(filename, filename_ext);
1000:io/filesystem.c ****
1001:io/filesystem.c **** if (filesystem_fileid != 0){
1002:io/filesystem.c **** //file exists !!!
1003:io/filesystem.c **** //->delete file & replace it with the new data:
1004:io/filesystem.c **** #if FILESYSTEM_DEBUG
1005:io/filesystem.c **** softuart_puts_progmem("FS : WARNING: overwriting existing file !");
1006:io/filesystem.c **** softuart_putnewline();
1007:io/filesystem.c **** #endif
1008:io/filesystem.c **** filesystem_delete_file(filesystem_fileid);
1009:io/filesystem.c **** }else{
1010:io/filesystem.c **** //new file -> get id:
1011:io/filesystem.c **** filesystem_fileid = filesystem_allocate_fileid();
1012:io/filesystem.c **** }
1013:io/filesystem.c ****
1014:io/filesystem.c **** filesystem_block_count = 1;
1015:io/filesystem.c ****
1016:io/filesystem.c **** //check for error:
1017:io/filesystem.c **** if (filesystem_fileid == 0)
1018:io/filesystem.c **** return 0;
1019:io/filesystem.c ****
1020:io/filesystem.c **** //now search a free block adddress for the first block:
1021:io/filesystem.c **** unsigned int block = filesystem_allocate_block();
1022:io/filesystem.c ****
1023:io/filesystem.c **** //check for error:
1024:io/filesystem.c **** if (block == 0)
1025:io/filesystem.c **** return 0;
1026:io/filesystem.c ****
1027:io/filesystem.c **** //store info:
1028:io/filesystem.c **** filesystem_first_block = block;
1029:io/filesystem.c **** filesystem_current_block = block;
1030:io/filesystem.c **** for (unsigned char i=0; i<8; i++)
1031:io/filesystem.c **** filesystem_filename[i] = filename[i];
1032:io/filesystem.c **** for (unsigned char i=0; i<3; i++)
1033:io/filesystem.c **** filesystem_filename_ext[i] = filename_ext[i];
1034:io/filesystem.c ****
1035:io/filesystem.c **** //return first block:
1036:io/filesystem.c **** return block;
1037:io/filesystem.c **** }
1038:io/filesystem.c ****
1039:io/filesystem.c **** /*unsigned int filesystem_open_file_rd(unsigned char *filename, unsigned char *filename_ext){
1040:io/filesystem.c **** unsigned int pos;
1041:io/filesystem.c ****
1042:io/filesystem.c **** //make sure there is no open file !
1043:io/filesystem.c **** if (filesystem_status != FILESYSTEM_STATUS_IDLE)
1044:io/filesystem.c **** filesystem_close_file();
1045:io/filesystem.c ****
1046:io/filesystem.c **** //check if file exists, returns 0 if file is unknown!
1047:io/filesystem.c **** filesystem_fileid = filesystem_search_file(filename, filename_ext);
1048:io/filesystem.c ****
1049:io/filesystem.c **** if (filesystem_fileid != 0){
1050:io/filesystem.c **** //file exists !!!
1051:io/filesystem.c **** //->delete file & replace it with the new data:
1052:io/filesystem.c **** #if FILESYSTEM_DEBUG
1053:io/filesystem.c **** softuart_puts_progmem("FS : open file for reading!");
1054:io/filesystem.c **** softuart_putnewline();
1055:io/filesystem.c **** #endif
1056:io/filesystem.c **** }else{
1057:io/filesystem.c **** //new file -> get id:
1058:io/filesystem.c **** #if FILESYSTEM_DEBUG
1059:io/filesystem.c **** softuart_puts_progmem("FS : file not found!");
1060:io/filesystem.c **** softuart_putnewline();
1061:io/filesystem.c **** #endif
1062:io/filesystem.c **** return 0;
1063:io/filesystem.c **** }
1064:io/filesystem.c ****
1065:io/filesystem.c **** //pos inside page is ?
1066:io/filesystem.c **** pos = 24*((filesystem_fileid-1) % 11);
1067:io/filesystem.c ****
1068:io/filesystem.c **** #if FILESYSTEM_DEBUG
1069:io/filesystem.c **** softuart_puts_progmem("FS : requested fid ");
1070:io/filesystem.c **** softuart_put_uint16(filesystem_fileid);
1071:io/filesystem.c **** softuart_puts_progmem(", loc on block ");
1072:io/filesystem.c **** softuart_put_uint16((filesystem_fileid-1)/11);
1073:io/filesystem.c **** softuart_puts_progmem(", pos ");
1074:io/filesystem.c **** softuart_put_uint8(pos);
1075:io/filesystem.c **** softuart_putnewline();
1076:io/filesystem.c **** #endif
1077:io/filesystem.c ****
1078:io/filesystem.c **** //get first block:
1079:io/filesystem.c **** filesystem_current_block = dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_HI, 0)<<8;
1080:io/filesystem.c **** filesystem_current_block |= dataflash_read_buffer(pos + FILESYSTEM_FTABLE_BLOCK_START_LO, 0);
1081:io/filesystem.c ****
1082:io/filesystem.c **** filesystem_first_block = filesystem_current_block;
1083:io/filesystem.c ****
1084:io/filesystem.c **** for (unsigned char i=0; i<8; i++)
1085:io/filesystem.c **** filesystem_filename[i] = filename[i];
1086:io/filesystem.c **** for (unsigned char i=0; i<3; i++)
1087:io/filesystem.c **** filesystem_filename_ext[i] = filename_ext[i];
1088:io/filesystem.c ****
1089:io/filesystem.c **** filesystem_file_pos = 0;
1090:io/filesystem.c ****
1091:io/filesystem.c **** //return OK
1092:io/filesystem.c **** return 1;
1093:io/filesystem.c **** }*/
1094:io/filesystem.c ****
1095:io/filesystem.c ****
1096:io/filesystem.c **** //store len bytes of data in current open file. if last==1 close file after write:
1097:io/filesystem.c **** void filesystem_write_data(unsigned char* data, unsigned int len, unsigned char last){
1098:io/filesystem.c **** //unsigned int next_block;
1099:io/filesystem.c **** //rprintf("FS: writing %d chars.\r\n",len);
1100:io/filesystem.c ****
1101:io/filesystem.c **** //check for invalid fileid:
1102:io/filesystem.c **** if (filesystem_fileid == 0)
1103:io/filesystem.c **** return;
1104:io/filesystem.c ****
1105:io/filesystem.c **** for( ; len>0; len--){
1106:io/filesystem.c **** //save data:
1107:io/filesystem.c **** ///dataflash_write_to_page_buffer((unsigned int)filesystem_file_pos, 0, (*data));
1108:io/filesystem.c **** filesystem_buffer[filesystem_file_pos] = (*data);
1109:io/filesystem.c **** //rprintf("FS: saving %c\r\n",(*data));
1110:io/filesystem.c ****
1111:io/filesystem.c **** //block full or end of file ?!
1112:io/filesystem.c **** if ((filesystem_file_pos == 255) || (len==1 && last==1)){
1113:io/filesystem.c **** //step0: copy buffer to flash:
1114:io/filesystem.c **** dataflash_write_n_to_page_buffer(0,0,filesystem_buffer, 256);
1115:io/filesystem.c ****
1116:io/filesystem.c **** //store buffer:
1117:io/filesystem.c **** filesystem_store_current_block((filesystem_file_pos == 255) && !(len==1 && last==1));
1118:io/filesystem.c ****
1119:io/filesystem.c **** #if FILESYSTEM_DEBUG
1120:io/filesystem.c **** softuart_puts_progmem("FS : storing block "
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -