亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fat16.c

?? 立宇泰44B0所有測試源代碼
?? C
字號:
 
 #include <avr/io.h>
 #include <avr/pgmspace.h>
 #include <string.h>
 
 #include "ata.h"
 #include "rprintf.h"
 
 #include "fat.h"
 #include "fatconf.h"
 
 // globals
 unsigned char *SectorBuffer  =      (unsigned char *) SECTOR_BUFFER1_ADDR;
 unsigned char *LongNameBuffer =     (unsigned char *) LONGNAME_BUFFER_ADDR;
 unsigned char *DirNameBuffer =      (unsigned char *) DIRNAME_BUFFER_ADDR;
 
 struct partrecord PartInfo;
 unsigned char Fat32Enabled;
 unsigned long FirstDataSector;
 unsigned int  BytesPerSector;
 unsigned int  SectorsPerCluster;
 unsigned long FirstFATSector;
 unsigned long FirstDirSector;
 unsigned long FileSize;
 unsigned long FatInCache = 0;

/*************************************************************************/
/*************************************************************************/
 
00054 
00055 unsigned long fatClustToSect(unsigned long clust)//數(shù)據(jù)存放的簇=>扇區(qū)
00056 {
00057     return ((clust-2) * SectorsPerCluster) + FirstDataSector;
00058 }
00059 
00060 unsigned int fatClusterSize(void)
00061 {
00062     // return the number of sectors in a disk cluster
00063     return SectorsPerCluster;
00064 }
00065 
00066 unsigned char fatInit( unsigned char device)
00067 {
00068     //struct partrecord *pr;
00069     struct bpb710 *bpb;
00071     // read partition table
00072     // TODO.... error checking
00073     ataReadSectors(DRIVE0, 0, 1, SectorBuffer);//讀driver的扇區(qū)到buffer
00074     // map first partition record   
00075     // save partition information to global PartInfo
00076     PartInfo = *((struct partrecord *) ((struct partsector *) SectorBuffer)->psPart);
00077 //  PartInfo = *pr;
00078     
00079     // Read the Partition BootSector
00080     // **first sector of partition in PartInfo.prStartLBA
00081     ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
00082     bpb = (struct bpb710 *) ((struct bootsector710 *) SectorBuffer)->bsBPB;
00083 
00084     // setup global disk constants
00085     FirstDataSector = PartInfo.prStartLBA;
00086     if(bpb->bpbFATsecs)
00087     {
00088         // bpbFATsecs is non-zero and is therefore valid
00089         FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
00090     }
00091     else
00092     {
00093         // bpbFATsecs is zero, real value is in bpbBigFATsecs
00094         FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
00095     }
00096     SectorsPerCluster   = bpb->bpbSecPerClust;
00097     BytesPerSector      = bpb->bpbBytesPerSec;
00098     FirstFATSector      = bpb->bpbResSectors + PartInfo.prStartLBA;
00099 
00100     switch (PartInfo.prPartType)
00101     {
00102         case PART_TYPE_DOSFAT16:
00103         case PART_TYPE_FAT16:
00104         case PART_TYPE_FAT16LBA:
00105             // first directory cluster is 2 by default (clusters range 2->big)
00106             FirstDirSector  = CLUST_FIRST;
00107             // push data sector pointer to end of root directory area
00108             //FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
00109             Fat32Enabled = FALSE;
00110             break;
00111         case PART_TYPE_FAT32LBA:
00112         case PART_TYPE_FAT32:
00113             // bpbRootClust field exists in FAT32 bpb710, but not in lesser bpb's
00114             FirstDirSector = bpb->bpbRootClust;
00115             // push data sector pointer to end of root directory area
00116             // need this? FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
00117             Fat32Enabled = TRUE;
00118             break;
00119         default:
00120             rprintfProgStrM("Found: No Partition!\r\n");
00121             //return 1;
00122             break;
00123     }
00124 
00125 
00126 #ifdef DEBUG_FAT
00127     switch (PartInfo.prPartType)
00128     {
00129         case PART_TYPE_DOSFAT16:
00130                 rprintfProgStrM("Found: DOSFAT 16\r\n");
00131                 break;
00132         case PART_TYPE_FAT16:
00133                 rprintfProgStrM("Found: FAT16\r\n");
00134                 break;
00135         case PART_TYPE_FAT16LBA:
00136                 rprintfProgStrM("Found: FAT16 LBA\r\n");
00137                 break;
00138         case PART_TYPE_FAT32LBA:
00139                 rprintfProgStrM("Found: FAT32 LBA\r\n");
00140                 break;
00141         case PART_TYPE_FAT32:
00142                 rprintfProgStrM("Found: FAT32\r\n");
00143                 //return 1; 
00144                 break;
00145         default:
00146                 rprintfProgStrM("Found: No Partition!\r\n");
00147                 //return 1;
00148                 break;
00149     }
00150 
00151     rprintfProgStrM("First sector    : ");  rprintfu32(PartInfo.prStartLBA);    rprintfCRLF();
00152     rprintfProgStrM("Size            : ");  rprintfu32(PartInfo.prSize);        rprintfCRLF();
00153     rprintfProgStrM("bytes/sector    : ");  rprintfu16(bpb->bpbBytesPerSec);    rprintfCRLF();
00154     rprintfProgStrM("sectors/cluster : ");  rprintfu08(bpb->bpbSecPerClust);    rprintfCRLF();
00155     rprintfProgStrM("reserved sectors: ");  rprintfu16(bpb->bpbResSectors);     rprintfCRLF();
00156     rprintfProgStrM("FatSectors      : ");  rprintfu16(bpb->bpbFATsecs);        rprintfCRLF();
00157     rprintfProgStrM("BigFatSectors   : ");  rprintfu32(bpb->bpbBigFATsecs);     rprintfCRLF();
00158     rprintfProgStrM("Number of Fats  : ");  rprintfu08(bpb->bpbFATs);           rprintfCRLF();
00159     rprintfProgStrM("First Fat Sector: ");  rprintfu32(FirstFATSector);         rprintfCRLF();
00160     rprintfProgStrM("First Data Sect : ");  rprintfu32(FirstDataSector);        rprintfCRLF();
00161     rprintfProgStrM("First Dir Clust : ");  rprintfu32(FirstDirSector);         rprintfCRLF();
00162 #endif
00163 
00164     return 0;   
00165 }
00166 
00167 //////////////////////////////////////////////////////////////
00168 
00169 
00170 unsigned int baseentry = 0;
00171 unsigned int entrycount = 0;
00172 
00173 
00174 unsigned long fatGetDirEntry(unsigned int entry, unsigned int count)
00175 {
00176     unsigned long sector;
00177     struct direntry *de = 0;    // avoid compiler warning by initializing
00178     struct winentry *we;
00179     unsigned int hasBuffer;
00180     unsigned int b;
00181     int i,index;
00182     char *p;
00183     
00184     if(count == 0)
00185     {
00186         entrycount = 0;
00187         DirNameBuffer = 0;
00188     }
00189     
00190     // read dir data
00191     sector = fatClustToSect(FirstDirSector);
00192 
00193     hasBuffer = 0;
00194 
00195     index = 16; // crank it up
00196     do 
00197     {
00198         if(index == 16) // time for next sector ?
00199         {
00200             ataReadSectors( DRIVE0, sector++, 1, SectorBuffer);
00201             de = (struct direntry *) SectorBuffer;
00202             index = 0;
00203         }   
00204     
00205         if(*de->deName != 0xE5)
00206         {
00207             // if not a deleted entry
00208             if(de->deAttributes == ATTR_LONG_FILENAME)
00209             {
00210                 // we have a long name entry
00211                 we = (struct winentry *) de;
00212                 b = 13 *( (we->weCnt-1) & 0x0f);                // index into string
00213                 p = &LongNameBuffer[b];
00214                 for (i=0;i<5;i++)   *p++ = we->wePart1[i*2];    // copy first part          
00215                 for (i=0;i<6;i++)   *p++ = we->wePart2[i*2];    // second part
00216                 for (i=0;i<2;i++)   *p++ = we->wePart3[i*2];    // and third part
00217                 if (we->weCnt & 0x40) *p = 0;                   // in case dirnamelength is multiple of 13
00218                 if ((we->weCnt & 0x0f) == 1) hasBuffer = 1;     // mark that we have a long entry
00219             }
00220             else
00221             {
00222                 // we have a short name entry
00223                 // check if this is the end of a multi-part long name entry
00224                 if(hasBuffer)
00225                 {
00226                     // a long entry name has been collected
00227                     // is it a directory ?
00228                     if(de->deAttributes == ATTR_DIRECTORY)
00229                     {
00230                         unsigned long save = FirstDirSector;
00231                         unsigned int save2 = baseentry;
00232                         unsigned long rval;
00233                         
00234                         strcpy(DirNameBuffer,LongNameBuffer);
00235                         strcat(DirNameBuffer,"/");
00236 
00237 //                      rprintfStr(LongNameBuffer); rprintfProgStrM("/"); //EOL();
00238 
00239                         // call recursively
00240                         FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
00241                         rval = fatGetDirEntry(entry,1);
00242                         FirstDirSector = save;
00243                         baseentry = save2;
00244                         if (rval)
00245                             return rval;
00246                         else    
00247                         {
00248                             // reload original sector
00249                             ataReadSectors( DRIVE0, sector-1, 1, SectorBuffer);
00250                             entrycount--;           // decrement entry counter      
00251                             *DirNameBuffer = 0;
00252                     }
00253                     }
00254                     else // normal file entry
00255                         if(entrycount == entry)     
00256                             break;
00257                     hasBuffer = 0;  // clear buffer 
00258                     entrycount++;   // increment entry counter      
00259                 }
00260                 // else ignore short_name_only entries
00261             }
00262         }
00263         de++;
00264         index++;
00265     }   while (*de->deName || index == 16); // 0 in de->deName[0] if no more entries
00266 
00267     if (hasBuffer == 0)     // end of entries
00268         return 0;
00269     
00270     FileSize = de->deFileSize;
00271     return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
00272 }
00273 
00274 
00275 // return the size of the last directory entry
00276 unsigned long fatGetFilesize(void)
00277 {
00278     return FileSize;
00279 }
00280 
00281 
00282 // return the long name of the last directory entry
00283 char* fatGetFilename(void)
00284 {   
00285     return LongNameBuffer;
00286 }
00287 
00288 
00289 // return the directory of the last directory entry
00290 char* fatGetDirname(void)
00291 {   
00292     return DirNameBuffer;
00293 }
00294 
00295 
00296 // load a clusterfull of data
00297 void fatLoadCluster(unsigned long cluster, unsigned char *buffer)
00298 {
00299     register unsigned char i;
00300     // read cluster
00301     //while ( ataReadSectors( DRIVE0, clust2sect(cluster), SectorsPerCluster, buffer) != 0);
00302     for(i=0; i<SectorsPerCluster; i++)
00303     {
00304 //      ataReadSectors( DRIVE0, clust2sect(cluster)+i, 1, buffer+(i<<9) );
00305         // temporary fix for wierd misaligned cluster problem
00306         // (only when using FAT16?)
00307         ataReadSectors( DRIVE0, fatClustToSect(cluster+8)+i, 1, buffer+(i<<9) );
00308     }
00309 }
00310 
00311 
00312 // find next cluster in the FAT chain
00313 unsigned long fatNextCluster(unsigned long cluster)
00314 {
00315     unsigned long nextCluster;
00316     unsigned long fatMask;
00317     unsigned long fatOffset;
00318     unsigned long sector;
00319     unsigned int offset;
00320     
00321     // get fat offset in bytes
00322     if(Fat32Enabled)
00323     {
00324         // four FAT bytes (32 bits) for every cluster
00325         fatOffset = cluster << 2;
00326         // set the FAT bit mask
00327         fatMask = FAT32_MASK;
00328     }
00329     else
00330     {
00331         // two FAT bytes (16 bits) for every cluster
00332         fatOffset = cluster << 1;
00333         // set the FAT bit mask
00334         fatMask = FAT16_MASK;
00335     }
00336     
00337     // calculate the FAT sector that we're interested in
00338     sector = FirstFATSector + (fatOffset / BytesPerSector);
00339     // calculate offset of the our entry within that FAT sector
00340     offset = fatOffset % BytesPerSector;
00341 
00342     // if we don't already have this FAT chunk loaded, go get it
00343     if (sector != FatInCache)
00344     {
00345         // read sector of FAT table
00346         while (ataReadSectors( DRIVE0, sector, 1, (unsigned char*)FAT_CACHE_ADDR) != 0);
00347         FatInCache = sector;
00348     }
00349 
00350     // read the nextCluster value
00351     nextCluster = (*((unsigned long*) &((char*)FAT_CACHE_ADDR)[offset])) & fatMask;
00352 
00353     // check to see if we're at the end of the chain
00354     if (nextCluster == (CLUST_EOFE & fatMask))
00355         nextCluster = 0;
00356 
00357 #ifdef DEBUG_FAT
00358     rprintfProgStrM(">");
00359     rprintfu32(nextCluster);
00360     rprintfCRLF();
00361 #endif
00362     
00363     return nextCluster;
00364 }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷综合中文久久一本| 成人蜜臀av电影| 极品尤物av久久免费看| 成人动漫一区二区在线| 色综合天天综合给合国产| 国产人成一区二区三区影院| 国产一区二区三区在线观看精品 | 欧美videos中文字幕| 国产精品网站在线播放| 亚洲一区av在线| 91丨九色丨黑人外教| 欧美电视剧在线看免费| 日本一区二区动态图| 亚洲伊人色欲综合网| jlzzjlzz国产精品久久| 久久久天堂av| 午夜亚洲国产au精品一区二区| 亚洲一区二区在线观看视频| 国产白丝精品91爽爽久久| 欧美最新大片在线看| 亚洲视频在线一区| 国精品**一区二区三区在线蜜桃| 色综合久久久网| 久久―日本道色综合久久| 精品视频全国免费看| 一级中文字幕一区二区| 欧美电影影音先锋| 亚洲乱码国产乱码精品精小说 | 国产主播一区二区| 另类调教123区| 国产精品一二三四区| 日韩你懂的在线观看| 亚洲一级电影视频| 一本大道久久a久久精二百 | 日本一区二区三区久久久久久久久不| 亚洲国产aⅴ天堂久久| 色婷婷亚洲一区二区三区| 国产亚洲美州欧州综合国| 国产在线一区观看| 欧美电视剧免费全集观看| 亚洲狠狠丁香婷婷综合久久久| 东方欧美亚洲色图在线| 久久久久久**毛片大全| 国产剧情一区二区三区| 精品理论电影在线观看| 国产精品一区二区在线观看网站| 91精品国产综合久久久久久久| 亚洲aⅴ怡春院| 欧美色区777第一页| 亚洲成人在线免费| 欧美亚洲精品一区| 欧美激情一区二区三区全黄| 成人精品电影在线观看| 国产精品网站一区| 99精品在线观看视频| 国产日韩欧美在线一区| av影院午夜一区| 亚洲欧洲无码一区二区三区| 色欧美片视频在线观看在线视频| 亚洲三级理论片| 欧美日韩视频不卡| 日韩成人免费电影| 欧美不卡激情三级在线观看| 国产一区欧美日韩| 中文字幕国产精品一区二区| 成人ar影院免费观看视频| 久久久久久9999| 日本久久一区二区| 一区二区三区在线观看欧美| 在线观看91av| 日韩国产精品91| 久久久久国产精品麻豆| 国产精品影视天天线| 中文字幕免费不卡在线| 波多野结衣亚洲| 风间由美一区二区三区在线观看 | 成人动漫av在线| 国产日韩欧美综合在线| 午夜精品影院在线观看| 日本韩国一区二区三区视频| 亚洲美女电影在线| 日韩午夜激情电影| 国产一区二区三区免费在线观看| 久久久久久久综合日本| av在线不卡观看免费观看| 午夜av一区二区| 欧美大片在线观看一区二区| 波波电影院一区二区三区| 一区二区三区中文免费| 91精品国产麻豆国产自产在线| 久久99精品久久久久久| 中文字幕在线观看不卡| 欧美色精品在线视频| 国内精品免费**视频| 久久久青草青青国产亚洲免观| 91久久精品网| 蜜桃传媒麻豆第一区在线观看| 综合久久一区二区三区| 欧美另类高清zo欧美| 大陆成人av片| 日韩高清不卡一区二区三区| 亚洲国产高清在线观看视频| 欧美三级电影在线观看| 国产精品中文字幕日韩精品| 一区二区高清免费观看影视大全 | 亚洲免费观看高清完整版在线观看熊| 欧美日韩精品欧美日韩精品一 | 在线观看av不卡| 国产成人鲁色资源国产91色综| 亚洲精品大片www| 国产人成一区二区三区影院| 欧美视频精品在线观看| www.亚洲人| 日韩成人一区二区| 一个色综合网站| 久久人人超碰精品| 91精品国产福利| aaa亚洲精品| 国产成人精品亚洲午夜麻豆| 亚洲一区日韩精品中文字幕| 国产精品少妇自拍| 日韩色视频在线观看| 在线观看亚洲精品视频| 国产精品白丝jk黑袜喷水| 亚洲精品日韩专区silk| 国产午夜精品一区二区三区四区 | 精品成人一区二区三区| 欧美韩国日本一区| 偷偷要91色婷婷| 成人18视频在线播放| 欧美一级日韩免费不卡| 在线亚洲一区观看| 国产麻豆午夜三级精品| 尤物av一区二区| 欧美日韩卡一卡二| 18成人在线观看| 麻豆精品久久精品色综合| 成人黄色小视频| 日韩精品一区二区三区视频播放 | 欧美伊人精品成人久久综合97| 欧美日韩激情在线| 亚洲视频一二三| 国产高清亚洲一区| 精品美女在线观看| 首页综合国产亚洲丝袜| 色综合久久久久| 日韩av一级电影| 成人亚洲一区二区一| 日韩三级在线观看| 亚洲大尺度视频在线观看| 97aⅴ精品视频一二三区| 一区二区免费在线播放| 日韩欧美亚洲另类制服综合在线| 亚洲手机成人高清视频| 欧美精品久久久久久久多人混战 | 成人污视频在线观看| 欧美人狂配大交3d怪物一区| 中文字幕中文字幕在线一区| 精品一区二区久久久| 欧美系列日韩一区| 亚洲a一区二区| 欧美一级一区二区| 国产麻豆一精品一av一免费| 欧美久久久久久蜜桃| 国产91精品精华液一区二区三区| 首页国产欧美日韩丝袜| 亚洲网友自拍偷拍| 欧美日韩一区二区欧美激情| 欧美性受xxxx黑人xyx| 91精品国产免费久久综合| 欧美xfplay| 欧美一二三四区在线| 欧美成人在线直播| 日韩免费看的电影| 国产三级三级三级精品8ⅰ区| 精品久久久久av影院| 国产色产综合产在线视频| 久久亚洲综合av| 亚洲欧洲国产日韩| 自拍偷自拍亚洲精品播放| 一区二区三区在线观看视频| 一区二区三区欧美亚洲| 日本一区中文字幕| 久久国产精品99精品国产 | 一区二区三区久久久| 亚洲精品一区二区三区香蕉| 欧美一区二区三区爱爱| 色综合久久中文字幕综合网| 欧美日韩一级片网站| 91麻豆精品91久久久久同性| 日韩三级电影网址| 久久夜色精品国产噜噜av| 国产人伦精品一区二区| 亚洲女同一区二区| 亚洲乱码一区二区三区在线观看| 亚洲午夜精品17c| 蜜桃精品在线观看| 国产成都精品91一区二区三| 风流少妇一区二区| 欧美日韩激情一区|