00001
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #define _fat_c_
00042
00043
00044 #include "conf_explorer.h"
00045 #include "fs_com.h"
00046 #include "fat.h"
00047 #include LIB_MEM
00048 #include LIB_CTRLACCESS
00049
00050
00051
00052
00053
00056 #if (FS_NB_NAVIGATOR > 1)
00057 _MEM_TYPE_SLOW_ Fs_management fs_g_navext[FS_NB_NAVIGATOR-1];
00058 _MEM_TYPE_SLOW_ Fs_management_fast fs_g_navext_fast[FS_NB_NAVIGATOR-1];
00059 _MEM_TYPE_SLOW_ Fs_management_entry fs_g_navext_entry[FS_NB_NAVIGATOR-1];
00060 #endif
00062
00065 _MEM_TYPE_SLOW_ Fs_clusterlist_cache fs_g_cache_clusterlist[FS_NB_CACHE_CLUSLIST*2];
00066 _MEM_TYPE_SLOW_ U8 fs_g_u8_current_cache;
00068
00069
00070
00071
00072 void fat_cache_clusterlist_update_start ( Bool b_for_file );
00073 void fat_cache_clusterlist_update_finish ( void );
00074 Bool fat_cache_clusterlist_update_read ( Bool b_for_file );
00075 void fat_cache_clusterlist_update_select ( void );
00076
00077
00078
00088 Bool fat_check_device( void )
00089 {
00090 U8 retry=0;
00091 #if (FS_NB_NAVIGATOR > 1)
00092 U8 i;
00093 #endif
00094 Ctrl_status status;
00095
00096
00097 if( g_b_no_check_disk )
00098 return TRUE;
00099
00100 if( 0xFF == fs_g_nav.u8_lun )
00101 {
00102 fs_g_status = FS_ERR_HW;
00103 return FALSE;
00104 }
00105
00106 for( retry=0 ; retry<100 ; retry++ )
00107 {
00108
00109 status = mem_test_unit_ready( fs_g_nav.u8_lun );
00110 if( CTRL_GOOD == status )
00111 return TRUE;
00112
00113
00114
00115 fs_g_nav_fast.u8_type_fat = FS_TYPE_FAT_UNM;
00116 Fat_file_close();
00117 #if (FS_NB_NAVIGATOR > 1)
00118 for( i=0 ; i!=(FS_NB_NAVIGATOR-1) ; i++ )
00119 {
00120 if( fs_g_nav.u8_lun == fs_g_navext[i].u8_lun )
00121 {
00122 fs_g_navext_fast[i].u8_type_fat = FS_TYPE_FAT_UNM;
00123 fs_g_navext_entry[i].u8_open_mode = 0;
00124 }
00125 }
00126 #endif
00127
00128 if( fs_g_nav.u8_lun == fs_g_sectorcache.u8_lun )
00129 {
00130 fat_cache_reset();
00131 }
00132 fat_cache_clusterlist_reset();
00133
00134 fs_g_status = FS_ERR_HW;
00135 if( CTRL_BUSY == status )
00136 continue;
00137
00138 if( CTRL_NO_PRESENT == status )
00139 fs_g_status = FS_ERR_HW_NO_PRESENT;
00140 break;
00141 }
00142 return FALSE;
00143 }
00144
00145
00151 Bool fat_check_mount( void )
00152 {
00153 if( !fat_check_device() )
00154 return FALSE;
00155 if (FS_TYPE_FAT_UNM == fs_g_nav_fast.u8_type_fat)
00156 {
00157 if( !fat_mount() )
00158 {
00159 fs_g_status = FS_ERR_NO_MOUNT;
00160 return FALSE;
00161 }
00162 }
00163 return TRUE;
00164 }
00165
00166
00172 Bool fat_check_noopen( void )
00173 {
00174 if( !fat_check_device() )
00175 return TRUE;
00176 if (FS_TYPE_FAT_UNM == fs_g_nav_fast.u8_type_fat)
00177 return TRUE;
00178 if( Fat_file_is_open() )
00179 {
00180 fs_g_status = FS_ERR_TOO_FILE_OPEN;
00181 return FALSE;
00182 }
00183 return TRUE;
00184 }
00185
00186
00192 Bool fat_check_open( void )
00193 {
00194 if( Fat_file_isnot_open() )
00195 {
00196 fs_g_status = FS_ERR_FILE_NO_OPEN;
00197 return FALSE;
00198 }
00199 return TRUE;
00200 }
00201
00202
00208 Bool fat_check_select( void )
00209 {
00210 if (FS_NO_SEL == fs_g_nav_fast.u16_entry_pos_sel_file)
00211 {
00212 fs_g_status = FS_ERR_NO_FILE_SEL;
00213 return FALSE;
00214 }
00215 return TRUE;
00216 }
00217
00218
00224 Bool fat_check_mount_noopen( void )
00225 {
00226 if( !fat_check_mount() )
00227 return FALSE;
00228 return fat_check_noopen();
00229 }
00230
00231
00237 Bool fat_check_mount_select_noopen( void )
00238 {
00239 if( !fat_check_mount() )
00240 return FALSE;
00241 if( !fat_check_select() )
00242 return FALSE;
00243 return fat_check_noopen();
00244 }
00245
00246
00252 Bool fat_check_mount_select_open( void )
00253 {
00254 if( !fat_check_mount() )
00255 return FALSE;
00256 if( !fat_check_select() )
00257 return FALSE;
00258 return fat_check_open();
00259 }
00260
00261
00267 Bool fat_check_mount_select( void )
00268 {
00269 if( !fat_check_mount() )
00270 return FALSE;
00271 return fat_check_select();
00272 }
00273
00274
00280 Bool fat_check_is_file( void )
00281 {
00282 if( Fat_is_not_a_file )
00283 {
00284 fs_g_status = FS_ERR_NO_FILE;
00285 return FALSE;
00286 }
00287 return TRUE;
00288 }
00289
00290
00291 #if (FS_MULTI_PARTITION == ENABLED)
00296 U8 fat_get_nbpartition( void )
00297 {
00298 if( !fat_check_device() )
00299 return 0;
00300
00301 #warning this routine contains bug, rework it
00302
00303 fs_gu32_addrsector = 0;
00304 if( !fat_cache_read_sector( TRUE ))
00305 return FALSE;
00306
00307
00308 if ( (fs_g_sector[510] != FS_BR_SIGNATURE_LOW )
00309 && (fs_g_sector[511] != FS_BR_SIGNATURE_HIGH ) )
00310 {
00311
00312
00313 if ( (fs_g_sector[0] == 0xEB) &&
00314 (fs_g_sector[2] == 0x90) &&
00315 ((fs_g_sector[21] & 0xF0) == 0xF0) )
00316 {
00317 return 1;
00318 } else {
00319 return 0;
00320 }
00321 }
00322
00323 number_part = 0;
00324 while( 1 )
00325 {
00326
00327 if ( ((fs_g_sector[FS_MBR_OFFSET_PART_ENTRY(number_part)+0] != FS_PARTITION_ACTIVE) &&
00328 (fs_g_sector[FS_MBR_OFFSET_PART_ENTRY(number_part)+0] != 0x00))
00329 || (fs_g_sector[FS_MBR_OFFSET_PART_ENTRY(number_part)+4] == 0x00) )
00330 {
00331 break;
00332 }
00333 number_part++;
00334 }
00335 return number_part;
00336 }
00337 #endif
00338
00339
00361 Bool fat_cluster_list( U8 opt_action, Bool b_for_file )
00362 {
00363 _MEM_TYPE_FAST_ U32 u32_tmp;
00364 _MEM_TYPE_FAST_ U8 u8_cluster_status;
00365
00366 fs_g_status = FS_ERR_FS;
00367
00368 if( Is_fat32
00369 && (FS_CLUST_ACT_CLR == opt_action) )
00370 {
00371 #if (FSFEATURE_WRITE_COMPLET == (FS_LEVEL_FEATURES & FSFEATURE_WRITE_COMPLET) )
00372
00373 if( !fat_write_fat32_FSInfo( 0xFFFFFFFF ))
00374 return FALSE;
00375 #else
00376 return FALSE;
00377 #endif
00378 }
00379
00380 if ( 0 == fs_g_seg.u32_addr )
00381 {
00382
00383 if( FS_CLUST_ACT_CLR == opt_action )
00384 return FALSE;
00385
00386 if ( Is_fat12 || Is_fat16 )
00387 {
00388
00389
00390 if ( fs_g_seg.u32_size_or_pos < fs_g_nav.rootdir.seg.u16_size )
00391 {
00392
00393 fs_g_seg.u32_addr = fs_g_nav.u32_ptr_fat + fs_g_nav.rootdir.seg.u16_pos + fs_g_seg.u32_size_or_pos;
00394 fs_g_seg.u32_size_or_pos = fs_g_nav.rootdir.seg.u16_size - fs_g_seg.u32_size_or_pos;
00395 return TRUE;
00396 } else {
00397 fs_g_status = FS_ERR_OUT_LIST;
00398 return FALSE;
00399 }
00400 }
00401 if ( Is_fat32 )
00402 {
00403
00404 fs_g_cluster.u32_pos = fs_g_nav.rootdir.u32_cluster;
00405 }
00406 } else {
00407
00408 fs_g_cluster.u32_pos = fs_g_seg.u32_addr;
00409 }
00410
00411
00412 if( FS_CLUST_ACT_CLR != opt_action )
00413 {
00414 if( fat_cache_clusterlist_update_read( b_for_file ) )
00415 return TRUE;
00416
00417 }else{
00418 fat_cache_clusterlist_reset();
00419 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
00420 fat_clear_info_fat_mod();
00421 #endif // FS_LEVEL_FEATURES
00422 }
00423
00424
00425 MSB0( fs_g_seg.u32_addr ) = 0xFF;
00426
00427
00428 while ( 1 )
00429 {
00430 if ( fs_g_seg.u32_size_or_pos < fs_g_nav.u8_BPB_SecPerClus )
00431 {
00432
00433
00434 fs_g_seg.u32_addr = ((fs_g_cluster.u32_pos - 2) * fs_g_nav.u8_BPB_SecPerClus)
00435 + fs_g_nav.u32_ptr_fat + fs_g_nav.u32_offset_data + fs_g_seg.u32_size_or_pos;
00436
00437 if ( FS_CLUST_ACT_ONE == opt_action )
00438 {
00439
00440 fs_g_seg.u32_size_or_pos = fs_g_nav.u8_BPB_SecPerClus-fs_g_seg.u32_size_or_pos;
00441 fat_cache_clusterlist_update_finish();
00442
00443 fs_g_seg.u32_size_or_pos = 1;
00444 return TRUE;
00445 }
00446
00447 fs_g_seg.u32_size_or_pos = fs_g_nav.u8_BPB_SecPerClus - LSB0( fs_g_seg.u32_size_or_pos );
00448
00449
00450 if( (FS_CLUST_ACT_SEG == opt_action)
00451 && (!Is_fat12) )
00452 {
00453
00454 u32_tmp = fs_g_cluster.u32_pos;
00455 if( !fat_cluster_val( FS_CLUST_VAL_READ ))
00456 return FALSE;
00457
00458 while(1)
00459 {
00460 if ( (++fs_g_cluster.u32_pos) != fs_g_cluster.u32_val )
00461 {
00462 fs_g_cluster.u32_pos--;
00463 u32_tmp = fs_g_cluster.u32_pos - u32_tmp;
00464 fs_g_seg.u32_size_or_pos += u32_tmp * fs_g_nav.u8_BPB_SecPerClus;
00465 break;
00466 }
00467 if( !fat_cluster_readnext() )
00468 return FALSE;
00469 }
00470 }
00471 }
00472
00473 if( !fat_cluster_val( FS_CLUST_VAL_READ ))
00474 return FALSE;
00475
00476
00477 u8_cluster_status = fat_checkcluster();
00478 if (FS_CLUS_BAD == u8_cluster_status)
00479 return FALSE;
00480
00481 if (0xFF == MSB0(fs_g_seg.u32_addr))
00482 {
00483
00484 if (FS_CLUS_END == u8_cluster_status)
00485 {
00486 u32_tmp = fs_g_seg.u32_size_or_pos;
00487
00488
00489 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start -= fs_g_seg.u32_size_or_pos;
00490 fs_g_seg.u32_addr = ((fs_g_cluster.u32_pos - 2) * fs_g_nav.u8_BPB_SecPerClus)
00491 + fs_g_nav.u32_ptr_fat + fs_g_nav.u32_offset_data;
00492 fs_g_seg.u32_size_or_pos = fs_g_nav.u8_BPB_SecPerClus;
00493 if (FS_CLUST_ACT_CLR != opt_action)
00494 fat_cache_clusterlist_update_finish();
00495
00496
00497 fs_g_seg.u32_addr = fs_g_cluster.u32_pos;
00498 fs_g_seg.u32_size_or_pos = u32_tmp;
00499 fs_g_status = FS_ERR_OUT_LIST;
00500 return FALSE;
00501 }
00502
00503 fs_g_seg.u32_size_or_pos -= fs_g_nav.u8_BPB_SecPerClus;
00504 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
00505 if (FS_CLUST_ACT_CLR == opt_action)
00506 {
00507 if( fs_g_seg.u32_size_or_pos == 0)
00508 {
00509
00510 fs_g_seg.u32_addr = fs_g_cluster.u32_val;
00511 fs_g_cluster.u32_val = FS_CLUST_VAL_EOL;
00512 if( !fat_cluster_val( FS_CLUST_VAL_WRITE ))
00513 return FALSE;
00514 fs_g_cluster.u32_val = fs_g_seg.u32_addr;
00515
00516
00517 }
00518 }
00519 #endif // FS_LEVEL_FEATURES
00520 }
00521 else
00522 {
00523
00524 if (FS_CLUST_ACT_SEG == opt_action)
00525 {
00526 if ( (fs_g_cluster.u32_pos+1) != fs_g_cluster.u32_val )
00527 {
00528
00529 fat_cache_clusterlist_update_finish();
00530 return TRUE;
00531 }
00532 }
00533 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
00534 if (FS_CLUST_ACT_CLR == opt_action)
00535 {
00536
00537 fs_g_seg.u32_addr = fs_g_cluster.u32_val;
00538 fs_g_cluster.u32_val = 0;
00539
00540
00541 if (fs_g_seg.u32_size_or_pos < fs_g_nav.u8_BPB_SecPerClus)
00542 {
00543 fs_g_cluster.u32_val = FS_CLUST_VAL_EOL;
00544 }
00545 if( !fat_cluster_val( FS_CLUST_VAL_WRITE ))
00546 return FALSE;
00547 fs_g_cluster.u32_val = fs_g_seg.u32_addr;
00548
00549
00550 }
00551 #endif // FS_LEVEL_FEATURES
00552
00553
00554 if (FS_CLUS_END == u8_cluster_status)
00555 {
00556 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
00557 if (FS_CLUST_ACT_CLR == opt_action)
00558 {
00559 return fat_update_fat2();
00560 }
00561 #endif // FS_LEVEL_FEATURES
00562 fat_cache_clusterlist_update_finish();
00563 return TRUE;
00564 }
00565
00566
00567 fs_g_seg.u32_size_or_pos += fs_g_nav.u8_BPB_SecPerClus;
00568 }
00569
00570
00571 fs_g_cluster.u32_pos = fs_g_cluster.u32_val;
00572 }
00573 }
00574
00575
00578 _MEM_TYPE_FAST_ U16 fs_g_u16_pos_fat;
00579
00580
00600 Bool fat_cluster_val( Bool b_mode )
00601 {
00602 _MEM_TYPE_FAST_ U16 u16_offset_fat;
00603 _MEM_TYPE_FAST_ U8 u8_data1, u8_data2;
00604 #define u8_data3 (LSB(u16_offset_fat)) // Manual overlay
00605 #define u8_data4 (MSB(u16_offset_fat)) // Manual overlay
00606 _MEM_TYPE_FAST_ PTR_CACHE u8_ptr_cluster;
00607
00608
00609 if ( Is_fat32 )
00610 {
00611
00612
00613
00614 u16_offset_fat = fs_g_cluster.u32_pos >> (8-1);
00615
00616
00617
00618 fs_g_u16_pos_fat = ((U16)(LSB0(fs_g_cluster.u32_pos) & 0x7F))<< 2;
00619 }
00620 else if ( Is_fat16 )
00621 {
00622
00623
00624 u16_offset_fat = LSB1(fs_g_cluster.u32_pos);
00625
00626
00627 fs_g_u16_pos_fat = ((U16)LSB0(fs_g_cluster.u32_pos)) <<1;
00628 }
00629 else if ( Is_fat12 )
00630 {
00631
00632
00633 fs_g_u16_pos_fat = (U16)fs_g_cluster.u32_pos + ((U16)fs_g_cluster.u32_pos >>1);
00634
00635 u16_offset_fat = MSB(fs_g_u16_pos_fat) >> 1;
00636
00637 MSB( fs_g_u16_pos_fat ) &= 0x01;
00638 }
00639
00640 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
00641 if (b_mode)
00642 {
00643
00644 if( fs_g_u16_first_mod_fat > u16_offset_fat )
00645 {
00646 fs_g_u16_first_mod_fat = u16_offset_fat;
00647 }
00648 if( fs_g_u16_last_mod_fat < u16_offset_fat )
00649 {
00650 fs_g_u16_last_mod_fat = u16_offset_fat;
00651 }
00652 if ( Is_fat12 )
00653 {
00654 if( fs_g_u16_pos_fat == (FS_CACHE_SIZE-1) )
00655 {
00656 if( fs_g_u16_last_mod_fat < (u16_offset_fat+1) )
00657 {
00658 fs_g_u16_last_mod_fat = (u16_offset_fat+1);
00659 }
00660 }
00661 }
00662 }
00663 #endif // FS_LEVEL_FEATURES
00664
00665
00666 fs_gu32_addrsector = fs_g_nav.u32_ptr_fat + u16_offset_fat;
00667 if( !fat_cache_read_sector( TRUE ))
00668 return FALSE;
00669
00670
00671 u8_ptr_cluster = &fs_g_sector[fs_g_u16_pos_fat];
00672 u8_data1 = u8_ptr_cluster[0];
00673
00674 u8_data2 = u8_ptr_cluster[1];
00675 u8_data3 = u8_ptr_cluster[2];
00676 u8_data4 = u8_ptr_cluster[3];
00677
00678 if ( Is_fat12 )
00679 {
00680 if( fs_g_u16_pos_fat == (FS_CACHE_SIZE-1) )
00681 {
00682 fs_gu32_addrsector++;
00683 if( !fat_cache_read_sector( TRUE ))
00684 return FALSE;
00685 u8_data2 = fs_g_sector[0];
00686 }
00687 }
00688
00689 if (FALSE == b_mode)
00690 {
00691
00692 LSB0( fs_g_cluster.u32_val ) = u8_data1;
00693 LSB1( fs_g_cluster.u32_val ) = u8_data2;
00694
00695 if ( Is_fat32 )
00696 {
00697 LSB2( fs_g_cluster.u32_val ) = u8_data3;
00698 LSB3( fs_g_cluster.u32_val ) = u8_data4 & 0x0F;
00699 }
00700 else
00701 {
00702 LSB2( fs_g_cluster.u32_val ) = 0;
00703 LSB3( fs_g_cluster.u32_val ) = 0;
00704
00705
00706 if ( Is_fat12 )
00707 {
00708 if ( 0x01 & LSB0(fs_g_cluster.u32_pos) )
00709 {
00710 LSB0( fs_g_cluster.u32_val ) = (LSB1( fs_g_cluster.u32_val ) <<4 ) + (LSB0( fs_g_cluster.u32_val ) >>4 );
00711 LSB1( fs_g_cluster.u32_val ) = LSB1( fs_g_cluster.u32_val ) >>4 ;
00712 }
00713 else
00714 {
00715 LSB1( fs_g_cluster.u32_val ) &= 0x0F;
00716 }
00717 }
00718 }
00719 } else {
00720 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
00721
00722 if ( Is_fat12 )
00723 {
00724
00725 if ( 0x01 & LSB0(fs_g_cluster.u32_pos) )
00726 {
00727 u8_data1 = (u8_data1 & 0x0F) + (LSB0( fs_g_cluster.u32_val )<<4);
00728 u8_data2 = (LSB1( fs_g_cluster.u32_val )<<4) + (LSB0( fs_g_cluster.u32_val )>>4) ;
00729 } else {
00730
00731 u8_data1 = LSB0( fs_g_cluster.u32_val );
00732 u8_data2 = (u8_data2 & 0xF0) + (LSB1( fs_g_cluster.u32_val ) & 0x0F) ;
00733 }
00734
00735
00736 if( fs_g_u16_pos_fat == (FS_CACHE_SIZE-1) )
00737 {
00738 fs_g_sector[0] = u8_data2;
00739 fat_cache_mark_sector_as_dirty();
00740
00741 fs_gu32_addrsector--;
00742 if( !fat_cache_read_sector( TRUE ))
00743 return FALSE;
00744
00745 fs_g_sector[ FS_CACHE_SIZE-1 ] = u8_data1;
00746 fat_cache_mark_sector_as_dirty();
00747 return TRUE;
00748 }
00749 }
00750 else
00751 {
00752
00753 u8_data1 = LSB0( fs_g_cluster.u32_val );
00754 u8_data2 = LSB1( fs_g_cluster.u32_val );
00755 if ( Is_fat32 )
00756 {
00757 u8_ptr_cluster[2] = LSB2( fs_g_cluster.u32_val );
00758 u8_ptr_cluster[3] = LSB3( fs_g_cluster.u32_val ) + (u8_data4 & 0xF0);
00759 }
00760 }
00761
00762 u8_ptr_cluster[0] = u8_data1;
00763 u8_ptr_cluster[1] = u8_data2;
00764 fat_cache_mark_sector_as_dirty();
00765 #else
00766 fs_g_status = FS_ERR_COMMAND;
00767 return FALSE;
00768 #endif // FS_LEVEL_FEATURES
00769 }
00770
00771 return TRUE;
00772 #undef u8_data3 // end of Manual overlay
00773 #undef u8_data4 // end of Manual overlay
00774 }
00775
00776
00795 Bool fat_cluster_readnext( void )
00796 {
00797
00798 if ( Is_fat32 )
00799 {
00800 fs_g_u16_pos_fat += 4;
00801 }else{
00802
00803 fs_g_u16_pos_fat += 2;
00804 }
00805
00806
00807 if( FS_CACHE_SIZE == fs_g_u16_pos_fat )
00808 {
00809
00810 fs_g_u16_pos_fat = 0;
00811 fs_gu32_addrsector++;
00812 if( !fat_cache_read_sector( TRUE ))
00813 return FALSE;
00814 }
00815
00816
00817 LSB0( fs_g_cluster.u32_val ) = fs_g_sector[fs_g_u16_pos_fat+0];
00818 LSB1( fs_g_cluster.u32_val ) = fs_g_sector[fs_g_u16_pos_fat+1];
00819
00820 if ( Is_fat32 )
00821 {
00822 LSB2( fs_g_cluster.u32_val ) = fs_g_sector[fs_g_u16_pos_fat+2];
00823 LSB3( fs_g_cluster.u32_val ) = fs_g_sector[fs_g_u16_pos_fat+3];
00824 }
00825 return TRUE;
00826 }
00827
00828
00842 U8 fat_checkcluster( void )
00843 {
00844 if ( !fs_g_cluster.u32_val )
00845 return FS_CLUS_BAD;
00846
00847
00848 if ( Is_fat32 )
00849 {
00850 if (fs_g_cluster.u32_val <= 0x0FFFFFF6)
00851 return FS_CLUS_OK;
00852 else if (fs_g_cluster.u32_val == 0x0FFFFFFF)
00853 return FS_CLUS_END;
00854 }
00855 else if ( Is_fat16 )
00856 {
00857 if (fs_g_cluster.u32_val <= 0xFFF6)
00858 return FS_CLUS_OK;
00859 else if (fs_g_cluster.u32_val == 0xFFFF)
00860 return FS_CLUS_END;
00861 }
00862 else if ( Is_fat12 )
00863 {
00864 if (fs_g_cluster.u32_val <= 0x0FF6)
00865 return FS_CLUS_OK;
00866 else if (fs_g_cluster.u32_val == 0x0FFF)
00867 return FS_CLUS_END;
00868 }
00869
00870 return FS_CLUS_BAD;
00871 }
00872
00875
00878 void fat_cache_clusterlist_reset( void )
00879 {
00880 U8 u8_i;
00881 fs_g_u8_current_cache=0;
00882 for( u8_i=0; u8_i<(FS_NB_CACHE_CLUSLIST*2); u8_i++ )
00883 {
00884
00885 fs_g_cache_clusterlist[u8_i].b_cache_file = (u8_i<FS_NB_CACHE_CLUSLIST)?TRUE:FALSE;
00886 fs_g_cache_clusterlist[u8_i].u8_lun = 0xFF;
00887 fs_g_cache_clusterlist[u8_i].u8_level_use = 0xFF;
00888 }
00889 }
00890
00891
00896 void fat_cache_clusterlist_update_start( Bool b_for_file )
00897 {
00898
00899 U8 u8_i;
00900 for( u8_i=0; u8_i<((FS_NB_CACHE_CLUSLIST*2)-1); u8_i++ )
00901 {
00902 if( fs_g_cache_clusterlist[u8_i].b_cache_file == b_for_file )
00903 {
00904 #if (FS_NB_CACHE_CLUSLIST>1)
00905 if( (FS_NB_CACHE_CLUSLIST-2) < fs_g_cache_clusterlist[u8_i].u8_level_use )
00906 #endif
00907 break;
00908 }
00909 }
00910 fs_g_u8_current_cache = u8_i;
00911 fs_g_cache_clusterlist[fs_g_u8_current_cache].b_cache_file = b_for_file;
00912 fs_g_cache_clusterlist[fs_g_u8_current_cache].u8_lun = 0xFF;
00913 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_cluster = fs_g_cluster.u32_pos;
00914 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start = fs_g_seg.u32_size_or_pos;
00915 }
00916
00917
00920 void fat_cache_clusterlist_update_finish( void )
00921 {
00922 U8 u8_cluster_offset = fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start % fs_g_nav.u8_BPB_SecPerClus;
00923 fs_g_cache_clusterlist[fs_g_u8_current_cache].u8_lun = fs_g_nav.u8_lun;
00924 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start -= u8_cluster_offset;
00925 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_addr = fs_g_seg.u32_addr - u8_cluster_offset;
00926 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_size = fs_g_seg.u32_size_or_pos + u8_cluster_offset;
00927
00928
00929 fat_cache_clusterlist_update_select();
00930 }
00931
00932
00935 void fat_cache_clusterlist_update_select( void )
00936 {
00937 U8 u8_i;
00938 U8 u8_level_to_update;
00939 Bool b_file_cache;
00940
00941 b_file_cache = fs_g_cache_clusterlist[ fs_g_u8_current_cache ].b_cache_file;
00942 u8_level_to_update = fs_g_cache_clusterlist[ fs_g_u8_current_cache ].u8_level_use;
00943 for( u8_i=0; u8_i<(FS_NB_CACHE_CLUSLIST*2); u8_i++ )
00944 {
00945 if( fs_g_cache_clusterlist[u8_i].b_cache_file == b_file_cache )
00946 if( u8_level_to_update > fs_g_cache_clusterlist[u8_i].u8_level_use )
00947 fs_g_cache_clusterlist[u8_i].u8_level_use++;
00948 }
00949 fs_g_cache_clusterlist[ fs_g_u8_current_cache ].u8_level_use = 0;
00950 }
00951
00952
00960 Bool fat_cache_clusterlist_update_read( Bool b_for_file )
00961 {
00962 U32 u32_tmp;
00963 U8 u8_i;
00964 for( u8_i=0; u8_i<(FS_NB_CACHE_CLUSLIST*2); u8_i++ )
00965 {
00966 if( (fs_g_cache_clusterlist[u8_i].b_cache_file == b_for_file)
00967 && (fs_g_cache_clusterlist[u8_i].u8_lun == fs_g_nav.u8_lun ) )
00968 {
00969 if( fs_g_cache_clusterlist[u8_i].u32_cluster == fs_g_cluster.u32_pos )
00970 {
00971 if( fs_g_cache_clusterlist[u8_i].u32_start <= fs_g_seg.u32_size_or_pos )
00972 {
00973
00974 if( fs_g_cache_clusterlist[u8_i].u32_size > (fs_g_seg.u32_size_or_pos-fs_g_cache_clusterlist[u8_i].u32_start) )
00975 {
00976
00977 fs_g_seg.u32_size_or_pos -= fs_g_cache_clusterlist[u8_i].u32_start;
00978 fs_g_seg.u32_addr = fs_g_cache_clusterlist[u8_i].u32_addr + fs_g_seg.u32_size_or_pos;
00979 fs_g_seg.u32_size_or_pos = fs_g_cache_clusterlist[u8_i].u32_size - fs_g_seg.u32_size_or_pos;
00980 fs_g_u8_current_cache = u8_i;
00981 fat_cache_clusterlist_update_select();
00982 return TRUE;
00983 }else{
00984
00985
00986 fs_g_u8_current_cache = u8_i;
00987 fs_g_cache_clusterlist[fs_g_u8_current_cache].u8_lun = 0xFF;
00988
00989
00990
00991
00992 fs_g_cluster.u32_pos = ((fs_g_cache_clusterlist[u8_i].u32_addr -fs_g_nav.u32_ptr_fat - fs_g_nav.u32_offset_data + fs_g_cache_clusterlist[u8_i].u32_size -1)
00993 / fs_g_nav.u8_BPB_SecPerClus) +2;
00994 u32_tmp = fs_g_seg.u32_size_or_pos;
00995
00996 fs_g_seg.u32_size_or_pos-= ((fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start + fs_g_cache_clusterlist[u8_i].u32_size -1)
00997 / fs_g_nav.u8_BPB_SecPerClus)
00998 * fs_g_nav.u8_BPB_SecPerClus;
00999 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start = u32_tmp;
01000 return FALSE;
01001 }
01002 }
01003 }
01004 }
01005 }
01006
01007 fat_cache_clusterlist_update_start(b_for_file);
01008 return FALSE;
01009 }
01010
01012
01013
01031 Bool fat_read_file( U8 mode )
01032 {
01033 U32 u32_sector_pos;
01034
01035
01036 u32_sector_pos = fs_g_nav_entry.u32_pos_in_file >> FS_512B_SHIFT_BIT;
01037
01038 if(FS_CLUST_ACT_ONE == mode)
01039 {
01040 if( (fs_g_sectorcache.u8_lun == fs_g_nav.u8_lun )
01041 && (fs_g_sectorcache.u32_clusterlist_start == fs_g_nav_entry.u32_cluster )
01042 && (fs_g_sectorcache.u32_clusterlist_pos == u32_sector_pos ) )
01043 {
01044 return TRUE;
01045 }
01046 }
01047 else
01048 {
01049 if( FS_CLUST_ACT_CLR == mode )
01050 {
01051
01052 if( 0 == fs_g_nav_entry.u32_cluster )
01053 return TRUE;
01054
01055 if(0 != (fs_g_nav_entry.u32_pos_in_file & FS_512B_MASK) )
01056 {
01057
01058 u32_sector_pos++;
01059 }
01060 }
01061 }
01062
01063
01064 fs_g_seg.u32_addr = fs_g_nav_entry.u32_cluster;
01065 fs_g_seg.u32_size_or_pos = u32_sector_pos;
01066 if( FS_CLUST_ACT_ONE != mode )
01067 {
01068 if( fat_cluster_list( mode, TRUE ) )
01069 return TRUE;
01070 }
01071 else
01072 {
01073 if( fat_cluster_list( FS_CLUST_ACT_SEG, TRUE ) )
01074 {
01075
01076 fs_gu32_addrsector = fs_g_seg.u32_addr ;
01077 if( fat_cache_read_sector( TRUE ) )
01078 {
01079 fs_g_sectorcache.u32_clusterlist_start = fs_g_nav_entry.u32_cluster;
01080 fs_g_sectorcache.u32_clusterlist_pos = u32_sector_pos;
01081 return TRUE;
01082 }
01083 }
01084 }
01085 if( (FS_CLUST_ACT_CLR == mode )
01086 && (FS_ERR_OUT_LIST == fs_g_status) )
01087 {
01088
01089 return TRUE;
01090 }
01091 return FALSE;
01092 }
01093
01094
01095 #if (FSFEATURE_WRITE == (FS_LEVEL_FEATURES & FSFEATURE_WRITE))
01113 Bool fat_write_file( U8 mode , U32 u32_nb_sector_write )
01114 {
01115 if( 0 == fs_g_nav_entry.u32_cluster )
01116 {
01117
01118 MSB0(fs_g_seg.u32_addr) = 0xFF;
01119
01120
01121 fs_g_seg.u32_size_or_pos = 0;
01122 fat_cache_clusterlist_update_start(TRUE);
01123 }
01124 else
01125 {
01126 if( fat_read_file( mode ) )
01127 return TRUE;
01128
01129 if( FS_ERR_OUT_LIST != fs_g_status )
01130 {
01131 return FALSE;
01132 }
01133
01134
01135
01136 fs_g_cache_clusterlist[fs_g_u8_current_cache].u8_lun = 0xFF;
01137
01138 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_start += fs_g_nav.u8_BPB_SecPerClus;
01139 }
01140
01141
01142 if( FS_CLUST_ACT_SEG == mode )
01143 {
01144 fs_g_seg.u32_size_or_pos = u32_nb_sector_write;
01145 }else{
01146 fs_g_seg.u32_size_or_pos = 1;
01147 }
01148
01149
01150 if( !fat_allocfreespace())
01151 return FALSE;
01152
01153
01154
01155 if( 0 == fs_g_nav_entry.u32_cluster )
01156 {
01157
01158
01159 fs_g_cache_clusterlist[fs_g_u8_current_cache].u32_cluster = fs_g_seg.u32_addr;
01160
01161 fs_g_nav_entry.u32_cluster = fs_g_seg.u32_addr;
01162 }
01163
01164
01165 if( FS_CLUST_ACT_SEG == mode )
01166 {
01167 fs_g_seg.u32_size_or_pos = u32_nb_sector_write - fs_g_seg.u32_size_or_pos;
01168 }else{
01169 fs_g_seg.u32_size_or_pos = 1 - fs_g_seg.u32_size_or_pos;
01170 }
01171 fs_g_seg.u32_addr = ((fs_g_seg.u32_addr - 2) * fs_g_nav.u8_BPB_SecPerClus)
01172 + fs_g_nav.u32_ptr_fat + fs_g_nav.u32_offset_data;
01173 fat_cache_clusterlist_update_finish();
01174
01175 return fat_read_file( mode );
01176 }
01177 #endif // FS_LEVEL_FEATURES
01178
01191 Bool fat_read_dir( void )
01192 {
01193 U32 u32_cluster_pos;
01194
01195
01196 u32_cluster_pos = fs_g_nav_fast.u16_entry_pos_sel_file >> (FS_512B_SHIFT_BIT - FS_SHIFT_B_TO_FILE_ENTRY);
01197
01198 if( (fs_g_sectorcache.u8_lun == fs_g_nav.u8_lun )
01199 && (fs_g_sectorcache.u32_clusterlist_start == fs_g_nav.u32_cluster_sel_dir )
01200 && (fs_g_sectorcache.u32_clusterlist_pos == u32_cluster_pos ) )
01201 {
01202 return TRUE;
01203 }
01204
01205
01206 fs_g_seg.u32_addr = fs_g_nav.u32_cluster_sel_dir;
01207 fs_g_seg.u32_size_or_pos = u32_cluster_pos;
01208 if( fat_cluster_list( FS_CLUST_ACT_ONE, FALSE ) )
01209 {
01210
01211 fs_gu32_addrsector = fs_g_seg.u32_addr;
01212 if( fat_cache_read_sector( TRUE ) )
01213 {
01214
01215 fs_g_sectorcache.u32_clusterlist_start = fs_g_nav.u32_cluster_sel_dir;
01216 fs_g_sectorcache.u32_clusterlist_pos = u32_cluster_pos;
01217 return TRUE;
01218 }
01219 }
01220 return FALSE;
01221 }
01222
01223
01224
01239 Bool fat_entry_check( Bool b_type )
01240 {
01241 PTR_CACHE u8_ptr_entry;
01242 U8 u8_first_byte, u8_seconde_byte;
01243 U8 u8_attribut;
01244
01245 u8_ptr_entry = fat_get_ptr_entry();
01246
01247 u8_first_byte = u8_ptr_entry[0];
01248 if ( FS_ENTRY_END == u8_first_byte )
01249 {
01250 fs_g_status = FS_ERR_ENTRY_EMPTY;
01251 return FALSE;
01252 }
01253 fs_g_status = FS_ERR_ENTRY_BAD;
01254 if ( FS_ENTRY_DEL == u8_first_byte ) { return FALSE; }
01255 if ( '.' == u8_first_byte ) { return FALSE; }
01256 u8_seconde_byte = u8_ptr_entry[1];
01257 if ( ('.' == u8_first_byte)
01258 && ('.' == u8_seconde_byte) ) { return FALSE; }
01259
01260
01261 u8_attribut = u8_ptr_entry[11];
01262 if ( FS_ATTR_VOLUME_ID & u8_attribut ) { return FALSE; }
01263
01264
01265
01266
01267 if( FS_ATTR_DIRECTORY & u8_attribut )
01268 {
01269 return (FS_DIR == b_type);
01270 }else{
01271 return (FS_FILE == b_type);
01272 }
01273 }
01274
01275
01290 Bool fat_entry_checkext( FS_STRING sz_filter )
01291 {
01292 PTR_CACHE u8_ptr_entry;
01293 U8 u8_i, u8_filter_char, u8_entry_char;
01294
01295 u8_ptr_entry = fat_get_ptr_entry();
01296
01297
01298 for( u8_i=0 ; u8_i<3 ; u8_i++)
01299 {
01300 u8_filter_char = *sz_filter;
01301 if ('*' == u8_filter_char)
01302 break;
01303
01304 u8_entry_char = u8_ptr_entry[8+u8_i];
01305
01306
01307 if( (u8_filter_char!= u8_entry_char )
01308 && (u8_filter_char!= (u8_entry_char+('a'-'A'))) )
01309 {
01310 if ( (',' == u8_filter_char)
01311 || ( 0 == u8_filter_char) )
01312 {
01313
01314 if (' ' == u8_entry_char)
01315 break;
01316 }
01317
01318
01319
01320 while( ',' != u8_filter_char )
01321 {
01322 if (0 == u8_filter_char)
01323 {
01324 return FALSE;
01325 }
01326 sz_filter++;
01327 u8_filter_char = *sz_filter;
01328 }
01329 u8_i = 0xFF;
01330 }
01331 sz_filter++;
01332 }
01333
01334 return TRUE;
01335 }
01336
01337
01349 void fat_get_entry_info( void )
01350 {
01351 PTR_CACHE ptr_entry;
01352
01353 ptr_entry = fat_get_ptr_entry();
01354
01355
01356 ptr_entry+= 11;
01357 fs_g_nav_entry.u8_attr = ptr_entry[0];
01358
01359
01360 ptr_entry += (20-11);
01361 LSB2(fs_g_nav_entry.u32_cluster) = ptr_entry[0];
01362 LSB3(fs_g_nav_entry.u32_cluster) = ptr_entry[1];
01363 ptr_entry += (26-20);
01364 LSB0(fs_g_nav_entry.u32_cluster) = ptr_entry[0];
01365 LSB1(fs_g_nav_entry.u32_cluster) = ptr_entry[1];
01366
01367
01368 ptr_entry += (28-26);
01369 LSB0(fs_g_nav_entry.u32_size) = ptr_entry[0];
01370 LSB1(fs_g_nav_entry.u32_size) = ptr_entry[1];
01371 LSB2(fs_g_nav_entry.u32_size) = ptr_entry[2];
01372 LSB3(fs_g_nav_entry.u32_size) = ptr_entry[3];
01373 }
01374
01375
01381 Bool fat_entry_is_dir(void)
01382 {
01383 fs_g_status = FS_ERR_NO_DIR;
01384 return (FS_ATTR_DIRECTORY & fs_g_nav_entry.u8_attr);
01385 }
01386
01387
01390 void fat_clear_entry_info_and_ptr( void )
01391 {
01392 fs_g_nav_fast.u16_entry_pos_sel_file= FS_NO_SEL;
01393 fs_g_nav.u16_pos_sel_file = FS_NO_SEL;
01394 if( !fs_g_nav.b_mode_nav_single )
01395 {
01396 fs_g_nav.b_mode_nav = FS_DIR;
01397 }
01398 fs_g_nav_entry.u8_attr = 0;
01399 fs_g_nav_entry.u32_cluster = 0;
01400 fs_g_nav_entry.u32_size = 0;
01401 Fat_file_close();
01402 }
01403
01404
01405 #if (FSFEATURE_WRITE == (FS_LEVEL_FEATURES & FSFEATURE_WRITE))
01417 void fat_write_entry_file( void )
01418 {
01419 PTR_CACHE ptr_entry;
01420
01421 fat_cache_mark_sector_as_dirty();
01422 ptr_entry = fat_get_ptr_entry();
01423
01424 if( !(FS_ATTR_DIRECTORY | fs_g_nav_entry.u8_attr))
01425 {
01426 if( 0 == fs_g_nav_entry.u32_size )
01427 fs_g_nav_entry.u32_cluster = 0;
01428 }
01429
01431 ptr_entry+= 11;
01432 ptr_entry[0] = fs_g_nav_entry.u8_attr;
01433
01434
01435 ptr_entry += (20-11);
01436 ptr_entry[0] = LSB2(fs_g_nav_entry.u32_cluster);
01437 ptr_entry[1] = LSB3(fs_g_nav_entry.u32_cluster);
01438 ptr_entry += (26-20);
01439 ptr_entry[0] = LSB0(fs_g_nav_entry.u32_cluster);
01440 ptr_entry[1] = LSB1(fs_g_nav_entry.u32_cluster);
01441
01443 ptr_entry += (28-26);
01444 ptr_entry[0] = LSB0(fs_g_nav_entry.u32_size);
01445 ptr_entry[1] = LSB1(fs_g_nav_entry.u32_size);
01446 ptr_entry[2] = LSB2(fs_g_nav_entry.u32_size);
01447 ptr_entry[3] = LSB3(fs_g_nav_entry.u32_size);
01448 }
01449 #endif // FS_LEVEL_FEATURES
01450
01451
01472 Bool fat_entry_shortname( FS_STRING sz_name , U8 u8_size_max , Bool b_mode )
01473 {
01474 Bool b_extension_nostart = TRUE;
01475 U8 u8_pos_name;
01476 U8 u8_entry_char, u8_szname_char;
01477 PTR_CACHE ptr_entry;
01478 U8 u8_pos_entry;
01479
01480 fs_g_status = FS_ERR_NAME_INCORRECT;
01481
01482 u8_pos_name = 0;
01483 u8_pos_entry = 0;
01484 ptr_entry = fat_get_ptr_entry();
01485
01486
01487 while( 1 )
01488 {
01489 if( FS_SIZE_SFNAME == u8_pos_entry )
01490 {
01491 u8_entry_char = 0;
01492 }
01493 else
01494 {
01495 u8_entry_char = ptr_entry[ u8_pos_entry ];
01496 if( ((FS_SIZE_SFNAME_WITHOUT_EXT == u8_pos_entry) && b_extension_nostart)
01497 || ( ' ' == u8_entry_char) )
01498 {
01499
01500 if( (FS_SIZE_SFNAME_WITHOUT_EXT >= u8_pos_entry)
01501 && (' ' != ptr_entry[ FS_SIZE_SFNAME_WITHOUT_EXT ]) )
01502 {
01503
01504 b_extension_nostart = FALSE;
01505 u8_pos_entry = FS_SIZE_SFNAME_WITHOUT_EXT-1;
01506 u8_entry_char = '.';
01507 }
01508 else
01509 {
01510 u8_entry_char = 0;
01511 }
01512 }
01513 }
01514
01515 if( FS_NAME_GET == b_mode )
01516 {
01517 if( !g_b_string_length )
01518 {
01519 if(u8_pos_name >= (u8_size_max-1))
01520 u8_entry_char = 0;
01521
01522 if( ('A'<=u8_entry_char) && (u8_entry_char<='Z'))
01523 u8_entry_char += ('a'-'A');
01524
01525 if( Is_unicode )
01526 {
01527 ((FS_STR_UNICODE)sz_name)[0] = u8_entry_char;
01528 }else{
01529 sz_name[0] = u8_entry_char;
01530 }
01531 }
01532 }
01533 else
01534 {
01535
01536 if( Is_unicode
01537 && (0 != MSB(((FS_STR_UNICODE)sz_name)[0])) )
01538 {
01539
01540 return FALSE;
01541 }
01542
01543 if( Is_unicode )
01544 {
01545 u8_szname_char = ((FS_STR_UNICODE)sz_name)[0];
01546 }else{
01547 u8_szname_char = sz_name[0];
01548 }
01549 if ('*' == u8_szname_char)
01550 {
01551 return TRUE;
01552 }
01553
01554 if( (0 != u8_entry_char) || (('\\' != u8_szname_char) && ('/' != u8_szname_char)) )
01555 {
01556 if((u8_szname_char != u8_entry_char)
01557 && (u8_szname_char != (u8_entry_char+('a'-'A'))) )
01558 return FALSE;
01559 }
01560 }
01561
01562
01563 if (0 == u8_entry_char)
01564 {
01565 if( g_b_string_length )
01566 {
01567 ((FS_STR_UNICODE)sz_name)[0] = u8_pos_name+1;
01568 }
01569 return TRUE;
01570 }
01571 if( !g_b_string_length )
01572 {
01573 sz_name += (Is_unicode? 2 : 1 );
01574 }
01575 u8_pos_name++;
01576 u8_pos_entry++;
01577 }
01578 }
01579
01580
01603 Bool fat_entry_longname( FS_STRING sz_name , U8 u8_size_max , Bool b_mode , Bool b_match_case )
01604 {
01605 U8 u8_pos_name;
01606 PTR_CACHE ptr_entry;
01607 U16 u16_unicode_entry;
01608 U16 u16_unicode_szname;
01609
01610 ptr_entry = fat_get_ptr_entry();
01611
01612 if( (FS_ENTRY_END == *ptr_entry )
01613 || (FS_ENTRY_DEL == *ptr_entry )
01614 || (FS_ATTR_LFN_ENTRY != ptr_entry[11]) )
01615 {
01616 fs_g_status = FS_ERR_ENTRY_BAD;
01617 return FALSE;
01618 }
01619
01620 if( g_b_string_length )
01621 {
01622 if ( 0 == (FS_ENTRY_LFN_LAST & *ptr_entry))
01623 {
01624
01625 fs_g_status = FS_NO_LAST_LFN_ENTRY;
01626 return FALSE;
01627 }
01628 }
01629
01630 ptr_entry++;
01631
01632 u8_pos_name=0;
01633 while( 1 )
01634 {
01635 LSB(u16_unicode_entry) = ptr_entry[0];
01636 MSB(u16_unicode_entry) = ptr_entry[1];
01637 if( FS_NAME_GET == b_mode )
01638 {
01639 if( !g_b_string_length )
01640 {
01641
01642 if( u8_pos_name>=(u8_size_max-1) )
01643 {
01644
01645 if( Is_unicode )
01646 {
01647 ((FS_STR_UNICODE)sz_name)[0] = 0;
01648 }else{
01649 sz_name[0] = 0;
01650 }
01651 return TRUE;
01652 }
01653
01654 if( Is_unicode )
01655 {
01656 ((FS_STR_UNICODE)sz_name)[0] = u16_unicode_entry;
01657 }else{
01658 sz_name[0] = (U8)u16_unicode_entry;
01659 }
01660 }
01661 }
01662 else
01663 {
01664 if( Is_unicode )
01665 {
01666 u16_unicode_szname = ((FS_STR_UNICODE)sz_name)[0];
01667 }else{
01668 u16_unicode_szname = sz_name[0];
01669 }
01670
01671 if( '*' == u16_unicode_szname )
01672 {
01673 return TRUE;
01674 }
01675
01676 if( ((0 != u16_unicode_entry ) || (( '\\' != u16_unicode_szname) && ( '/' != u16_unicode_szname)) )
01677 && ((u16_unicode_szname != (u16_unicode_entry+('a'-'A'))) || b_match_case)
01678 && ((u16_unicode_szname != (u16_unicode_entry-('a'-'A'))) || b_match_case)
01679 && (u16_unicode_szname != u16_unicode_entry) )
01680 {
01681 fs_g_status = FS_ERR_NAME_INCORRECT;
01682 return FALSE;
01683 }
01684 }
01685
01686 if( 0 == u16_unicode_entry)
01687 {
01688 if( g_b_string_length )
01689 {
01690 ((FS_STR_UNICODE)sz_name)[0] = u8_pos_name+1;
01691 }
01692 return TRUE;
01693 }
01694 if( 4 == u8_pos_name )
01695 ptr_entry += 3;
01696
01697 if( 10 == u8_pos_name )
01698 ptr_entry += 2;
01699
01700 if( 12 == u8_pos_name )
01701 {
01702 ptr_entry -= (FS_SIZE_FILE_ENTRY-2);
01703 if ( 0 == (FS_ENTRY_LFN_LAST & ptr_entry[0]))
01704 {
01705 fs_g_status = FS_NO_LAST_LFN_ENTRY;
01706 return FALSE;
01707 }
01708 else
01709 {
01710
01711 if( (FS_NAME_GET == b_mode) && g_b_string_length )
01712 {
01713 ((FS_STR_UNICODE)sz_name)[0] = 14;
01714 return TRUE;
01715 }
01716 sz_name += (Is_unicode? 2 : 1 );
01717 if( FS_NAME_GET == b_mode )
01718 {
01719
01720 if( Is_unicode )
01721 {
01722 ((FS_STR_UNICODE)sz_name)[0] = 0;
01723 }else{
01724 sz_name[0] = 0;
01725 }
01726 return TRUE;
01727 }
01728 else
01729 {
01730
01731 if( Is_unicode )
01732 {
01733 u16_unicode_szname = ((FS_STR_UNICODE)sz_name)[0];
01734 }else{
01735 u16_unicode_szname = sz_name[0];
01736 }
01737 return fat_check_eof_name(u16_unicode_szname);
01738 }
01739 }
01740 }
01741
01742 if( !g_b_string_length )
01743 {
01744 sz_name += (Is_unicode? 2 : 1 );
01745 }
01746 u8_pos_name++;
01747 ptr_entry+=2;
01748 }
01749 }
01750
01751
01759 Bool fat_check_eof_name( U16 character )
01760 {
01761 return (('\0'==character)||('\\'==character)||('/'==character));
01762 }
01763
01764
01769 PTR_CACHE fat_get_ptr_entry( void )
01770 {
01771 return &fs_g_sector[(fs_g_nav_fast.u16_entry_pos_sel_file * FS_SIZE_FILE_ENTRY) & FS_512B_MASK];
01772 }
01773
01774
01790 Bool fat_cache_read_sector( Bool b_load )
01791 {
01792
01793 if( (fs_g_sectorcache.u8_lun == fs_g_nav.u8_lun )
01794 && (fs_g_sectorcache.u32_addr == fs_gu32_addrsector ) )
01795 {
01796 return TRUE;
01797 }
01798
01799
01800 if( !fat_cache_flush())
01801 return FALSE;
01802
01803
01804 fat_cache_reset();
01805
01806
01807 fs_g_sectorcache.u32_addr = fs_gu32_addrsector;
01808 if( b_load )
01809 {
01810
01811 if( CTRL_GOOD != memory_2_ram( fs_g_nav.u8_lun , fs_g_sectorcache.u32_addr, fs_g_sector))
01812 {
01813 fs_g_status = FS_ERR_HW;
01814 return FALSE;
01815 }
01816 }
01817
01818 fs_g_sectorcache.u8_lun = fs_g_nav.u8_lun;
01819 return TRUE;
01820 }
01821
01822
01825 void fat_cache_reset( void )
01826 {
01827 fs_g_sectorcache.u8_lun = FS_BUF_SECTOR_EMPTY;
01828 fs_g_sectorcache.u8_dirty = FALSE;
01829 fs_g_sectorcache.u32_clusterlist_start = 0xFFFFFFFF;
01830 }
01831
01832
01833 #if (FS_LEVEL_FEATURES > FSFEATURE_READ)
01836 void fat_cache_clear( void )
01837 {
01838 memset( fs_g_sector , 0 , FS_CACHE_SIZE );
01839 }
01840
01841
01844 void fat_cache_mark_sector_as_dirty( void )
01845 {
01846 fs_g_sectorcache.u8_dirty = TRUE;
01847 }
01848 #endif // FS_LEVEL_FEATURES
01849
01850
01856 Bool fat_cache_flush( void )
01857 {
01858
01859 if ( TRUE == fs_g_sectorcache.u8_dirty )
01860 {
01861 fs_g_sectorcache.u8_dirty = FALSE;
01862 if( mem_wr_protect( fs_g_sectorcache.u8_lun ))
01863 {
01864 fs_g_status = FS_LUN_WP;
01865 return FALSE;
01866 }
01867 if (CTRL_GOOD != ram_2_memory( fs_g_sectorcache.u8_lun , fs_g_sectorcache.u32_addr , fs_g_sector ))
01868 {
01869 fs_g_status = FS_ERR_HW;
01870 return FALSE;
01871 }
01872 }
01873 return TRUE;
01874 }
01875
01876
01877
01878 #if (FS_NB_NAVIGATOR > 1)
01884 Bool fat_check_nav_access_disk( void )
01885 {
01886 U8 i;
01887
01888
01889 for( i=0 ; i!=(FS_NB_NAVIGATOR-1) ; i++ )
01890 {
01891
01892 if( FS_TYPE_FAT_UNM != fs_g_navext_fast[i].u8_type_fat )
01893
01894 if( fs_g_nav.u8_lun == fs_g_navext[i].u8_lun )
01895
01896 if( fs_g_navext_entry[i].u8_open_mode!=0 )
01897 {
01898 fs_g_status = FS_ERR_FILE_OPEN;
01899 return FALSE;
01900 }
01901 }
01902 return TRUE;
01903 }
01904
01905
01916 Bool fat_check_nav_access_file( Bool mode )
01917 {
01918 U8 i;
01919
01920
01921 for( i=0 ; i!=(FS_NB_NAVIGATOR-1) ; i++ )
01922 {
01923
01924 if( FS_TYPE_FAT_UNM != fs_g_navext_fast[i].u8_type_fat )
01925
01926 if( fs_g_nav.u8_lun == fs_g_navext[i].u8_lun )
01927 #if (FS_MULTI_PARTITION == ENABLED)
01928
01929 if( fs_g_nav.u8_partition == fs_g_navext[i].u8_partition )
01930 #endif
01931
01932 if( fs_g_nav.u32_cluster_sel_dir == fs_g_navext[i].u32_cluster_sel_dir )
01933
01934 if( fs_g_nav_fast.u16_entry_pos_sel_file == fs_g_navext_fast[i].u16_entry_pos_sel_file )
01935 {
01936 if( mode )
01937 {
01938
01939 if( fs_g_navext_entry[i].u8_open_mode!=0 )
01940 {
01941 fs_g_status = FS_ERR_FILE_OPEN;
01942 return FALSE;
01943 }
01944 }
01945 else
01946 {
01947
01948 if( fs_g_navext_entry[i].u8_open_mode & FOPEN_WRITE_ACCESS )
01949 {
01950 fs_g_status = FS_ERR_FILE_OPEN_WR;
01951 return FALSE;
01952 }
01953 }
01954 }
01955 }
01956 return TRUE;
01957 }
01958
01959
01964 void fat_invert_nav( U8 u8_idnav )
01965 {
01966 _MEM_TYPE_SLOW_ U8 Temp[Max(Max(sizeof(Fs_management),sizeof(Fs_management_entry)),sizeof(Fs_management_fast))];
01967
01968 if( u8_idnav == 0 )
01969 return;
01970 u8_idnav--;
01971
01972 memcpy_ram2ram(Temp, (U8*)&fs_g_nav, sizeof(Fs_management));
01973 memcpy_ram2ram((U8*)&fs_g_nav, (U8*)&fs_g_navext[u8_idnav], sizeof(Fs_management));
01974 memcpy_ram2ram((U8*)&fs_g_navext[u8_idnav], Temp, sizeof(Fs_management));
01975
01976 memcpy_ram2ram(Temp, (U8*)&fs_g_nav_entry, sizeof(Fs_management_entry));
01977 memcpy_ram2ram((U8*)&fs_g_nav_entry, (U8*)&fs_g_navext_entry[u8_idnav], sizeof(Fs_management_entry));
01978 memcpy_ram2ram((U8*)&fs_g_navext_entry[u8_idnav], Temp, sizeof(Fs_management_entry));
01979
01980 memcpy_ram2ram(Temp, (U8*)&fs_g_nav_fast, sizeof(Fs_management_fast));
01981 memcpy_ram2ram((U8*)&fs_g_nav_fast, (U8*)&fs_g_navext_fast[u8_idnav], sizeof(Fs_management_fast));
01982 memcpy_ram2ram((U8*)&fs_g_navext_fast[u8_idnav], Temp, sizeof(Fs_management_fast));
01983 }
01984
01985
01990 void fat_copy_nav( U8 u8_idnav )
01991 {
01992 if( 0 != u8_idnav)
01993 {
01994 u8_idnav--;
01995 memcpy_ram2ram((U8*)&fs_g_navext[u8_idnav], (U8*)&fs_g_nav , sizeof(Fs_management) );
01996 memcpy_ram2ram((U8*)&fs_g_navext_entry[u8_idnav], (U8*)&fs_g_nav_entry , sizeof(Fs_management_entry) );
01997 memcpy_ram2ram((U8*)&fs_g_navext_fast[u8_idnav], (U8*)&fs_g_nav_fast , sizeof(Fs_management_fast) );
01998 fs_g_navext_entry[u8_idnav].u8_open_mode=0;
01999 }
02000 }
02001
02002 #endif