20#ifdef BUILDING_USBHDFSD
23#include "usbhd_common.h"
25#include "fat_driver.h"
27#ifdef BUILDING_USBHDFSD
30#ifdef BUILDING_IEEE1394_DISK
37#include "mass_debug.h"
39#define READ_SECTOR(d, a, b) scache_readSector((d)->cache, (a), (void **)&b)
40#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
41#define DEV_ACCESSOR(d) (d)
43#define DEV_ACCESSOR(d) ((d)->dev)
45#ifdef BUILDING_USBHDFSD
46#define READ_SECTORS_RAW(d, a, c, b) mass_stor_readSector((d), a, b, c);
47#define INVALIDATE_SECTORS(d, s, c) scache_invalidate((d)->cache, s, c)
58 M_DEBUG(
"%s\n", __func__);
60 for (i = 0; i < NUM_DRIVES; ++i)
67int strEqual(
const char *s1,
const char *s2)
69 M_DEBUG(
"%s\n", __func__);
76 if (u1 > 64 && u1 < 91)
78 if (u2 > 64 && u2 < 91)
102unsigned int fat_getClusterRecord12(
const unsigned char *buf,
int type)
104 M_DEBUG(
"%s\n", __func__);
107 return ((buf[1] << 4) + (buf[0] >> 4));
109 return (((buf[1] & 0x0F) << 8) + buf[0]);
124static int fat_getClusterChain12(
fat_driver *fatd,
unsigned int cluster,
unsigned int *buf,
unsigned int bufSize,
int startFlag)
127 unsigned int i, lastFatSector;
128 unsigned char xbuf[4], cont;
129 unsigned char *sbuf = NULL;
131 M_DEBUG(
"%s\n", __func__);
140 while (i < bufSize && cont) {
141 unsigned int recordOffset, fatSector;
142 unsigned char sectorSpan;
144 recordOffset = (cluster * 3) / 2;
145 fatSector = recordOffset / fatd->partBpb.sectorSize;
147 if ((recordOffset % fatd->partBpb.sectorSize) == (fatd->partBpb.sectorSize - 1)) {
150 if (lastFatSector != fatSector || sectorSpan) {
151 ret = READ_SECTOR(DEV_ACCESSOR(fatd), fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf);
153 XPRINTF(
"Read fat12 sector failed! sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector);
156 lastFatSector = fatSector;
159 xbuf[0] = sbuf[fatd->partBpb.sectorSize - 2];
160 xbuf[1] = sbuf[fatd->partBpb.sectorSize - 1];
161 ret = READ_SECTOR(DEV_ACCESSOR(fatd), fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector + 1, sbuf);
163 XPRINTF(
"Read fat12 sector failed sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector + 1);
171 cluster = fat_getClusterRecord12(xbuf + (recordOffset % fatd->partBpb.sectorSize) - (fatd->partBpb.sectorSize - 2), cluster % 2);
173 cluster = fat_getClusterRecord12(sbuf + (recordOffset % fatd->partBpb.sectorSize), cluster % 2);
176 if ((cluster & 0xFFF) >= 0xFF8) {
179 buf[i] = cluster & 0xFFF;
189static int fat_getClusterChain16(
fat_driver *fatd,
unsigned int cluster,
unsigned int *buf,
unsigned int bufSize,
int startFlag)
192 unsigned int i, indexCount, lastFatSector;
194 unsigned char *sbuf = NULL;
196 M_DEBUG(
"%s\n", __func__);
199 indexCount = fatd->partBpb.sectorSize / 2;
206 while (i < bufSize && cont) {
207 unsigned int fatSector;
209 fatSector = cluster / indexCount;
210 if (lastFatSector != fatSector) {
211 ret = READ_SECTOR(DEV_ACCESSOR(fatd), fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf);
213 XPRINTF(
"Read fat16 sector failed! sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector);
217 lastFatSector = fatSector;
219 cluster = getUI16(sbuf + ((cluster % indexCount) * 2));
220 if ((cluster & 0xFFFF) >= 0xFFF8) {
223 buf[i] = cluster & 0xFFFF;
232static int fat_getClusterChain32(
fat_driver *fatd,
unsigned int cluster,
unsigned int *buf,
unsigned int bufSize,
int startFlag)
235 unsigned int i, indexCount, lastFatSector;
237 unsigned char *sbuf = NULL;
239 M_DEBUG(
"%s\n", __func__);
242 indexCount = fatd->partBpb.sectorSize / 4;
249 while (i < bufSize && cont) {
250 unsigned int fatSector;
252 fatSector = cluster / indexCount;
253 if (lastFatSector != fatSector) {
254 ret = READ_SECTOR(DEV_ACCESSOR(fatd), fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector, sbuf);
256 XPRINTF(
"Read fat32 sector failed sector=%u! \n", fatd->partBpb.partStart + fatd->partBpb.resSectors + fatSector);
260 lastFatSector = fatSector;
262 cluster = getUI32(sbuf + ((cluster % indexCount) * 4));
263 if ((cluster & 0xFFFFFFF) >= 0xFFFFFF8) {
266 buf[i] = cluster & 0xFFFFFFF;
274int fat_getClusterChain(
fat_driver *fatd,
unsigned int cluster,
unsigned int *buf,
unsigned int bufSize,
int startFlag)
276 M_DEBUG(
"%s\n", __func__);
278 if (cluster == fatd->lastChainCluster) {
279 return fatd->lastChainResult;
282 switch (fatd->partBpb.fatType) {
284 fatd->lastChainResult = fat_getClusterChain12(fatd, cluster, buf, bufSize, startFlag);
287 fatd->lastChainResult = fat_getClusterChain16(fatd, cluster, buf, bufSize, startFlag);
290 fatd->lastChainResult = fat_getClusterChain32(fatd, cluster, buf, bufSize, startFlag);
293 fatd->lastChainCluster = cluster;
294 return fatd->lastChainResult;
298#ifndef BUILDING_IEEE1394_DISK
299int fat_CheckChain(
fat_driver *fatd,
unsigned int cluster)
301 int i, nextChain = 1;
302 int clusterChainStart = 1;
310 chainSize = fat_getClusterChain(fatd, cluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart);
311 clusterChainStart = 0;
312 if (chainSize >= MAX_DIR_CLUSTER) {
313 cluster = fatd->cbuf[MAX_DIR_CLUSTER - 1];
319 for (i = 0; i < (chainSize - 1); i++) {
320 if ((fatd->cbuf[i] + 1) != fatd->cbuf[i + 1])
330void fat_invalidateLastChainResult(
fat_driver *fatd)
332 fatd->lastChainCluster = 0;
336static void fat_determineFatType(
fat_bpb *partBpb)
338 unsigned int sector, clusterCount;
340 M_DEBUG(
"%s\n", __func__);
343 sector = fat_cluster2sector(partBpb, 0);
345 sector -= partBpb->partStart;
346 sector = partBpb->sectorCount - sector;
347 clusterCount = sector / partBpb->clusterSize;
350 if (clusterCount < 4085) {
351 partBpb->fatType = FAT12;
352 }
else if (clusterCount < 65525) {
353 partBpb->fatType = FAT16;
355 partBpb->fatType = FAT32;
360#if defined(BUILDING_USBHDFSD)
361static int fat_getPartitionBootSector(
mass_dev *dev,
unsigned int sector,
fat_bpb *partBpb)
362#elif defined(BUILDING_IEEE1394_DISK)
363static int fat_getPartitionBootSector(
struct SBP2Device *dev,
unsigned int sector,
fat_bpb *partBpb)
365static int fat_getPartitionBootSector(
struct block_device *bd,
unsigned int sector,
fat_bpb *partBpb)
371 unsigned char *sbuf = NULL;
373 M_DEBUG(
"%s\n", __func__);
375#if !defined(BUILDING_USBHDFSD) && !defined(BUILDING_IEEE1394_DISK)
376 sbuf = malloc(bd->sectorSize);
377 ret = bd->read(bd, sector, sbuf, 1);
379 ret = READ_SECTOR(dev, sector, sbuf);
383 XPRINTF(
"Read partition boot sector failed sector=%u! \n", sector);
384#if !defined(BUILDING_USBHDFSD) && !defined(BUILDING_IEEE1394_DISK)
393#if !defined(BUILDING_USBHDFSD) && !defined(BUILDING_IEEE1394_DISK)
394 if ((bpb32_raw->bootSignature[0] != 0x55) || (bpb32_raw->bootSignature[1] != 0xAA)) {
395 M_DEBUG(
"Invalid bootSignature (0x%x - 0x%x)\n", bpb32_raw->bootSignature[0], bpb32_raw->bootSignature[1]);
402 partBpb->sectorSize = getUI16(bpb_raw->sectorSize);
403 partBpb->clusterSize = bpb_raw->clusterSize;
404 partBpb->resSectors = getUI16(bpb_raw->resSectors);
405 partBpb->fatCount = bpb_raw->fatCount;
406 partBpb->rootSize = getUI16(bpb_raw->rootSize);
407 partBpb->fatSize = getUI16(bpb_raw->fatSize);
408 partBpb->trackSize = getUI16(bpb_raw->trackSize);
409 partBpb->headCount = getUI16(bpb_raw->headCount);
410 partBpb->sectorCount = getUI16(bpb_raw->sectorCountO);
411 if (partBpb->sectorCount == 0) {
412 partBpb->sectorCount = getUI32(bpb_raw->sectorCount);
414 partBpb->partStart = sector;
415 partBpb->rootDirStart = partBpb->partStart + (partBpb->fatCount * partBpb->fatSize) + partBpb->resSectors;
416 for (ret = 0; ret < 8; ret++) {
417 partBpb->fatId[ret] = bpb_raw->fatId[ret];
419 partBpb->fatId[ret] = 0;
420 partBpb->rootDirCluster = 0;
421 partBpb->dataStart = partBpb->rootDirStart + (partBpb->rootSize / (partBpb->sectorSize >> 5));
423 fat_determineFatType(partBpb);
426 if (partBpb->fatType == FAT32 && partBpb->fatSize == 0) {
427 partBpb->fatSize = getUI32(bpb32_raw->fatSize32);
428 partBpb->activeFat = getUI16(bpb32_raw->fatStatus);
429 if (partBpb->activeFat & 0x80) {
430 partBpb->activeFat = (partBpb->activeFat & 0xF);
432 partBpb->activeFat = 0;
434 partBpb->rootDirStart = partBpb->partStart + (partBpb->fatCount * partBpb->fatSize) + partBpb->resSectors;
435 partBpb->rootDirCluster = getUI32(bpb32_raw->rootDirCluster);
436 for (ret = 0; ret < 8; ret++) {
437 partBpb->fatId[ret] = bpb32_raw->fatId[ret];
439 partBpb->fatId[ret] = 0;
440 partBpb->dataStart = partBpb->rootDirStart;
443 M_PRINTF(
"Fat type %u Id %s \n", partBpb->fatType, partBpb->fatId);
444#if !defined(BUILDING_USBHDFSD) && !defined(BUILDING_IEEE1394_DISK)
464 M_DEBUG(
"%s\n", __func__);
467 if (dir_entry->sfn.name[0] == 0) {
471 if (dir_entry->sfn.name[0] == 0xE5) {
476 if (dir_entry->lfn.rshv == 0x0F && dir_entry->lfn.reserved1 == 0x00 && dir_entry->lfn.reserved2[0] == 0x00) {
481 offset = dir_entry->lfn.entrySeq & 0x3f;
483 offset = offset * 13;
486 for (i = 0; i < 10 && cont; i += 2) {
487 character = dir_entry->lfn.name1[i] | (dir_entry->lfn.name1[i + 1] << 8);
489 if (character == 0 || offset >= (FAT_MAX_NAME - 1)) {
490 dir->name[offset] = 0;
494 dir->name[offset] = character <= UCHAR_MAX ? dir_entry->lfn.name1[i] :
'?';
499 for (i = 0; i < 12 && cont; i += 2) {
500 character = dir_entry->lfn.name2[i] | (dir_entry->lfn.name2[i + 1] << 8);
502 if (character == 0 || offset >= (FAT_MAX_NAME - 1)) {
503 dir->name[offset] = 0;
507 dir->name[offset] = character <= UCHAR_MAX ? dir_entry->lfn.name2[i] :
'?';
512 for (i = 0; i < 4 && cont; i += 2) {
513 character = dir_entry->lfn.name3[i] | (dir_entry->lfn.name3[i + 1] << 8);
515 if (character == 0 || offset >= (FAT_MAX_NAME - 1)) {
516 dir->name[offset] = 0;
520 dir->name[offset] = character <= UCHAR_MAX ? dir_entry->lfn.name3[i] :
'?';
524 if ((dir_entry->lfn.entrySeq & 0x40)) {
525 dir->name[offset] = 0;
533 for (i = 0; i < 8 && dir_entry->sfn.name[i] !=
' '; i++) {
534 dir->sname[i] = dir_entry->sfn.name[i];
536 if (dir_entry->sfn.reservedNT & 0x08 &&
537 dir->sname[i] >=
'A' && dir->sname[i] <=
'Z') {
538 dir->sname[i] += 0x20;
541 for (j = 0; j < 3 && dir_entry->sfn.ext[j] !=
' '; j++) {
546 dir->sname[i + j] = dir_entry->sfn.ext[j];
548 if (dir_entry->sfn.reservedNT & 0x10 &&
549 dir->sname[i + j] >=
'A' && dir->sname[i + j] <=
'Z') {
550 dir->sname[i + j] += 0x20;
553 dir->sname[i + j] = 0;
554 if (dir->name[0] == 0) {
555 for (i = 0; dir->sname[i] != 0; i++)
556 dir->name[i] = dir->sname[i];
559 dir->attr = dir_entry->sfn.attr;
560 dir->size = getUI32(dir_entry->sfn.size);
561 dir->cluster = (fatType == FAT32) ? getUI32_2(dir_entry->sfn.clusterL, dir_entry->sfn.clusterH) : getUI16(dir_entry->sfn.clusterL);
572 unsigned int index, clusterChainStart, fileCluster, fileSize, blockSize;
573 unsigned char nextChain;
576 M_DEBUG(
"%s\n", __func__);
577 XPRINTF(
"reading cluster chain \n");
578 fileCluster = fatDir->chain[0].cluster;
580 if (fileCluster < 2) {
581 XPRINTF(
" early exit... \n");
585 fileSize = fatDir->size;
586 blockSize = fileSize / DIR_CHAIN_SIZE;
589 clusterChainStart = 0;
595 if ((chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, 1)) >= 0) {
596 if (chainSize >= MAX_DIR_CLUSTER) {
597 fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1];
602 XPRINTF(
"fat_setFatDirChain(): fat_getClusterChain() failed: %d\n", chainSize);
607 for (i = clusterChainStart; i < chainSize; i++) {
608 fileSize += (fatd->partBpb.clusterSize * fatd->partBpb.sectorSize);
609 while (fileSize >= (j * blockSize) && j < DIR_CHAIN_SIZE) {
610 fatDir->chain[j].cluster = fatd->cbuf[i];
611 fatDir->chain[j].index = index;
616 clusterChainStart = 1;
618 fatDir->lastCluster = fatd->cbuf[i - 1];
622 XPRINTF(
"SEEK CLUSTER CHAIN CACHE fileSize=%u blockSize=%u \n", fatDir->size, blockSize);
623 for (i = 0; i < DIR_CHAIN_SIZE; i++) {
624 XPRINTF(
"index=%u cluster=%u offset= %u - %u start=%u \n",
625 fatDir->chain[i].index, fatDir->chain[i].cluster,
626 fatDir->chain[i].index * fatd->partBpb.clusterSize * fatd->partBpb.sectorSize,
627 (fatDir->chain[i].index + 1) * fatd->partBpb.clusterSize * fatd->partBpb.sectorSize,
631 XPRINTF(
"read cluster chain done!\n");
641 M_DEBUG(
"%s\n", __func__);
642 XPRINTF(
"setting fat dir...\n");
643 srcName = dir->sname;
644 if (dir->name[0] != 0) {
648 for (i = 0; srcName[i] != 0; i++)
649 fatDir->name[i] = srcName[i];
652 fatDir->attr = dir->attr;
653 fatDir->size = dir->size;
656 fatDir->cdate[0] = (dsfn->dateCreate[0] & 0x1F);
657 fatDir->cdate[1] = (dsfn->dateCreate[0] >> 5) + ((dsfn->dateCreate[1] & 0x01) << 3);
658 i = 1980 + (dsfn->dateCreate[1] >> 1);
659 fatDir->cdate[2] = (i & 0xFF);
660 fatDir->cdate[3] = ((i & 0xFF00) >> 8);
663 fatDir->ctime[0] = ((dsfn->timeCreate[1] & 0xF8) >> 3);
664 fatDir->ctime[1] = ((dsfn->timeCreate[1] & 0x07) << 3) + ((dsfn->timeCreate[0] & 0xE0) >> 5);
665 fatDir->ctime[2] = ((dsfn->timeCreate[0] & 0x1F) << 1);
668 fatDir->adate[0] = (dsfn->dateAccess[0] & 0x1F);
669 fatDir->adate[1] = (dsfn->dateAccess[0] >> 5) + ((dsfn->dateAccess[1] & 0x01) << 3);
670 i = 1980 + (dsfn->dateAccess[1] >> 1);
671 fatDir->adate[2] = (i & 0xFF);
672 fatDir->adate[3] = ((i & 0xFF00) >> 8);
675 fatDir->mdate[0] = (dsfn->dateWrite[0] & 0x1F);
676 fatDir->mdate[1] = (dsfn->dateWrite[0] >> 5) + ((dsfn->dateWrite[1] & 0x01) << 3);
677 i = 1980 + (dsfn->dateWrite[1] >> 1);
678 fatDir->mdate[2] = (i & 0xFF);
679 fatDir->mdate[3] = ((i & 0xFF00) >> 8);
682 fatDir->mtime[0] = ((dsfn->timeWrite[1] & 0xF8) >> 3);
683 fatDir->mtime[1] = ((dsfn->timeWrite[1] & 0x07) << 3) + ((dsfn->timeWrite[0] & 0xE0) >> 5);
684 fatDir->mtime[2] = ((dsfn->timeWrite[0] & 0x1F) << 1);
686 fatDir->chain[0].cluster = dir->cluster;
687 fatDir->chain[0].index = 0;
688 if (getClusterInfo) {
689 fat_setFatDirChain(fatd, fatDir);
692 fatDir->parentDirCluster = parentDirCluster;
693 fatDir->startCluster = dir->cluster;
697int fat_getDirentrySectorData(
fat_driver *fatd,
unsigned int *startCluster,
unsigned int *startSector,
unsigned int *dirSector)
699 unsigned int chainSize;
701 M_DEBUG(
"%s\n", __func__);
703 if (*startCluster == 0 && fatd->partBpb.fatType < FAT32) {
704 *startSector = fatd->partBpb.rootDirStart;
705 *dirSector = fatd->partBpb.rootSize / (fatd->partBpb.sectorSize / 32);
709 if (*startCluster == 0 && fatd->partBpb.fatType == FAT32) {
710 *startCluster = fatd->partBpb.rootDirCluster;
712 *startSector = fat_cluster2sector(&fatd->partBpb, *startCluster);
713 chainSize = fat_getClusterChain(fatd, *startCluster, fatd->cbuf, MAX_DIR_CLUSTER, 1);
714 if (chainSize >= MAX_DIR_CLUSTER) {
715 XPRINTF(
"Chain too large\n");
717 }
else if (chainSize > 0) {
718 *dirSector = chainSize * fatd->partBpb.clusterSize;
720 XPRINTF(
"Error getting cluster chain! startCluster=%u \n", *startCluster);
728static int fat_getDirentryStartCluster(
fat_driver *fatd,
char *dirName,
unsigned int *startCluster,
fat_dir *fatDir)
730#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
735 unsigned int i, dirSector, startSector;
739#ifdef BUILDING_USBHDFSD
742#ifdef BUILDING_IEEE1394_DISK
747 M_DEBUG(
"%s(%s)\n", __func__, dirName);
750 XPRINTF(
"getting cluster for dir entry: %s \n", dirName);
755 ret = fat_getDirentrySectorData(fatd, startCluster, &startSector, &dirSector);
759 XPRINTF(
"dirCluster=%u startSector=%u (%u) dirSector=%u \n", *startCluster, startSector, startSector
760#
if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
761 * fatd->bd->sectorSize,
763 * mass_device->sectorSize,
769 for (i = 0; i < dirSector && cont; i++) {
771 unsigned char *sbuf = NULL;
774 if ((*startCluster != 0) && (i % fatd->partBpb.clusterSize == 0)) {
775 startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[(i / fatd->partBpb.clusterSize)]) - i;
778 ret = READ_SECTOR(DEV_ACCESSOR(fatd), startSector + i, sbuf);
780 XPRINTF(
"read directory sector failed ! sector=%u\n", startSector + i);
783 XPRINTF(
"read sector ok, scanning sector for direntries...\n");
787 while (cont && dirPos < fatd->partBpb.sectorSize) {
789 cont = fat_getDirentry(fatd->partBpb.fatType, dir_entry, &dir);
791 if (!(dir.attr & FAT_ATTR_VOLUME_LABEL)) {
792 if ((strEqual(dir.sname, dirName) == 0) ||
793 (strEqual(dir.name, dirName) == 0)) {
794 XPRINTF(
"found! %s\n", dir.name);
795 if (fatDir != NULL) {
796 fat_setFatDir(fatd, fatDir, *startCluster, &dir_entry->sfn, &dir, 1);
798 *startCluster = dir.cluster;
799 XPRINTF(
"direntry %s found at cluster: %u \n", dirName, dir.cluster);
810 XPRINTF(
"direntry %s not found! \n", dirName);
818int fat_getFileStartCluster(
fat_driver *fatd,
const char *fname,
unsigned int *startCluster,
fat_dir *fatDir)
820#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
821 static char tmpName[FAT_MAX_NAME + 1];
823 char tmpName[FAT_MAX_NAME + 1];
825 unsigned int i, offset;
828 M_DEBUG(
"%s\n", __func__);
829 XPRINTF(
"Entering fat_getFileStartCluster\n");
835 if (fatDir != NULL) {
836 memset(fatDir, 0,
sizeof(
fat_dir));
837 fatDir->attr = FAT_ATTR_DIRECTORY;
839 if (fname[i] ==
'/') {
843 for (; fname[i] != 0; i++) {
844 if (fname[i] ==
'/') {
846 ret = fat_getDirentryStartCluster(fatd, tmpName, startCluster, fatDir);
852 tmpName[offset] = fname[i];
858 XPRINTF(
"Ready to get cluster for file \"%s\"\n", tmpName);
859 if (fatDir != NULL) {
862 XPRINTF(
"Exiting from fat_getFileStartCluster with a folder\n");
865 ret = fat_getDirentryStartCluster(fatd, tmpName, startCluster, fatDir);
867 XPRINTF(
"Exiting from fat_getFileStartCluster with error %i\n", ret);
870 XPRINTF(
"file's startCluster found. Name=%s, cluster=%u \n", fname, *startCluster);
872 XPRINTF(
"Exiting from fat_getFileStartCluster with no error.\n");
877void fat_getClusterAtFilePos(
fat_driver *fatd,
fat_dir *fatDir,
unsigned int filePos,
unsigned int *cluster,
unsigned int *clusterPos)
879 unsigned int i, j, blockSize;
881 M_DEBUG(
"%s\n", __func__);
883 blockSize = fatd->partBpb.clusterSize * fatd->partBpb.sectorSize;
885 for (i = 0, j = (DIR_CHAIN_SIZE - 1); i < (DIR_CHAIN_SIZE - 1); i++) {
886 if (fatDir->chain[i].index * blockSize <= filePos &&
887 fatDir->chain[i + 1].index * blockSize > filePos) {
892 *cluster = fatDir->chain[j].cluster;
893 *clusterPos = (fatDir->chain[j].index * blockSize);
897#ifdef BUILDING_USBHDFSD
898static int fat_readSingleSector(
mass_dev *dev,
unsigned int sector,
void *buffer,
int size,
int dataSkip)
900 unsigned char *sbuf = NULL;
903 ret = READ_SECTOR(dev, sector, sbuf);
905 XPRINTF(
"Read sector failed ! sector=%u\n", sector);
909 memcpy(buffer, sbuf + dataSkip, size);
915int fat_readFile(
fat_driver *fatd,
fat_dir *fatDir,
unsigned int filePos,
unsigned char *buffer,
unsigned int size)
918#ifdef BUILDING_USBHDFSD
921 unsigned int i, j, startSector, clusterChainStart, bufSize, sectorSkip, clusterSkip, dataSkip;
922 unsigned char nextChain;
923#ifdef BUILDING_USBHDFSD
927#ifdef BUILDING_IEEE1394_DISK
931 unsigned int bufferPos, fileCluster, clusterPos;
933 M_DEBUG(
"%s\n", __func__);
935 fat_getClusterAtFilePos(fatd, fatDir, filePos, &fileCluster, &clusterPos);
936 sectorSkip = (filePos - clusterPos) / fatd->partBpb.sectorSize;
937 clusterSkip = sectorSkip / fatd->partBpb.clusterSize;
938 sectorSkip %= fatd->partBpb.clusterSize;
939 dataSkip = filePos % fatd->partBpb.sectorSize;
942 XPRINTF(
"fileCluster = %u, clusterPos= %u clusterSkip=%u, sectorSkip=%u dataSkip=%u \n",
943 fileCluster, clusterPos, clusterSkip, sectorSkip, dataSkip);
945 if (fileCluster < 2) {
949#ifdef BUILDING_IEEE1394_DISK
951 bufSize = mass_device->sectorSize;
953#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
954 bufSize = fatd->bd->sectorSize;
957 clusterChainStart = 1;
959 while (nextChain && size > 0) {
962 if ((chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart)) < 0) {
966 clusterChainStart = 0;
967 if (chainSize >= MAX_DIR_CLUSTER) {
968 fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1];
972 while (clusterSkip >= MAX_DIR_CLUSTER) {
973 chainSize = fat_getClusterChain(fatd, fileCluster, fatd->cbuf, MAX_DIR_CLUSTER, clusterChainStart);
974 clusterChainStart = 0;
975 if (chainSize >= MAX_DIR_CLUSTER) {
976 fileCluster = fatd->cbuf[MAX_DIR_CLUSTER - 1];
980 clusterSkip -= MAX_DIR_CLUSTER;
984 for (i = 0 + clusterSkip; i < (
unsigned int)chainSize && size > 0; i++) {
986 startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[i]);
988#ifdef BUILDING_USBHDFSD
990 j = (size + dataSkip) / fatd->partBpb.sectorSize + sectorSkip;
993 if (j >= fatd->partBpb.clusterSize) {
994 toRead += fatd->partBpb.clusterSize;
995 j -= fatd->partBpb.clusterSize;
1002 if ((i >= (
unsigned int)(chainSize - 1)) || (fatd->cbuf[i] != (fatd->cbuf[i + 1] - 1)))
1010 startSector += sectorSkip;
1011 toRead -= sectorSkip;
1015#ifndef BUILDING_USBHDFSD
1016 for (j = 0 + sectorSkip; j < fatd->partBpb.clusterSize && size > 0; j++) {
1017 unsigned char *sbuf = NULL;
1019 ret = READ_SECTOR(DEV_ACCESSOR(fatd), startSector + j, sbuf);
1021 XPRINTF(
"Read sector failed ! sector=%u\n", startSector + j);
1026 if (size < bufSize) {
1027 bufSize = size + dataSkip;
1029#ifdef BUILDING_IEEE1394_DISK
1030 if (bufSize > mass_device->sectorSize) {
1031 bufSize = mass_device->sectorSize;
1034 if (bufSize > fatd->bd->sectorSize) {
1035 bufSize = fatd->bd->sectorSize;
1038 XPRINTF(
"memcopy dst=%u, src=%u, size=%u bufSize=%u \n", bufferPos, dataSkip, bufSize - dataSkip, bufSize);
1039 memcpy(buffer + bufferPos, sbuf + dataSkip, bufSize - dataSkip);
1040 size -= (bufSize - dataSkip);
1041 bufferPos += (bufSize - dataSkip);
1043#ifdef BUILDING_IEEE1394_DISK
1044 bufSize = mass_device->sectorSize;
1046 bufSize = fatd->bd->sectorSize;
1051#ifdef BUILDING_USBHDFSD
1053 bufSize = mass_device->sectorSize - dataSkip;
1057 ret = fat_readSingleSector(fatd->dev, startSector, buffer + bufferPos, bufSize, dataSkip);
1062 if (size + dataSkip >= mass_device->sectorSize)
1066 bufferPos += bufSize;
1072 INVALIDATE_SECTORS(DEV_ACCESSOR(fatd), startSector, toRead);
1073 ret = READ_SECTORS_RAW(DEV_ACCESSOR(fatd), startSector, toRead, buffer + bufferPos);
1075 XPRINTF(
"Read sectors failed ! sector=%u (%u)\n", startSector, toRead);
1079 bufSize = toRead * mass_device->sectorSize;
1081 bufferPos += bufSize;
1082 startSector += toRead;
1085 if (size > 0 && size <= mass_device->sectorSize) {
1088 ret = fat_readSingleSector(fatd->dev, startSector, buffer + bufferPos, bufSize, 0);
1094 bufferPos += bufSize;
1108#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1114 unsigned int startSector, dirSector, dirPos, dirCluster;
1115 unsigned char cont, new_entry;
1117#ifdef BUILDING_USBHDFSD
1120#ifdef BUILDING_IEEE1394_DISK
1125 M_DEBUG(
"%s\n", __func__);
1128 if (fatdlist->direntryCluster == 0xFFFFFFFF || fatDir == NULL) {
1132 dirCluster = fatdlist->direntryCluster;
1138 ret = fat_getDirentrySectorData(fatd, &dirCluster, &startSector, &dirSector);
1142 XPRINTF(
"dirCluster=%u startSector=%u (%u) dirSector=%u \n", dirCluster, startSector, startSector
1143#
if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1144 * fatd->bd->sectorSize,
1146 * mass_device->sectorSize,
1155 dirPos = (fatdlist->direntryIndex * 32) % fatd->partBpb.sectorSize;
1156 for (i = ((fatdlist->direntryIndex * 32) / fatd->partBpb.sectorSize); ((
unsigned int)i < dirSector) && cont; i++) {
1157 unsigned char *sbuf = NULL;
1160 if ((dirCluster != 0) && (new_entry || (i % fatd->partBpb.clusterSize == 0))) {
1161 startSector = fat_cluster2sector(&fatd->partBpb, fatd->cbuf[(i / fatd->partBpb.clusterSize)]) - i + (i % fatd->partBpb.clusterSize);
1164 ret = READ_SECTOR(DEV_ACCESSOR(fatd), startSector + i, sbuf);
1166 XPRINTF(
"Read directory sector failed ! sector=%u\n", startSector + i);
1171 while (cont && (dirPos < fatd->partBpb.sectorSize)) {
1173 cont = fat_getDirentry(fatd->partBpb.fatType, dir_entry, &dir);
1174 fatdlist->direntryIndex++;
1176 fat_setFatDir(fatd, fatDir, dirCluster, &dir_entry->sfn, &dir, 0);
1178 XPRINTF(
"fat_getNextDirentry %c%c%c%c%c%c %x %s %s\n",
1179 (dir.attr & FAT_ATTR_VOLUME_LABEL) ?
'v' :
'-',
1180 (dir.attr & FAT_ATTR_DIRECTORY) ?
'd' :
'-',
1181 (dir.attr & FAT_ATTR_READONLY) ?
'r' :
'-',
1182 (dir.attr & FAT_ATTR_ARCHIVE) ?
'a' :
'-',
1183 (dir.attr & FAT_ATTR_SYSTEM) ?
's' :
'-',
1184 (dir.attr & FAT_ATTR_HIDDEN) ?
'h' :
'-',
1196 fatdlist->direntryCluster = 0xFFFFFFFF;
1204 unsigned int startCluster = 0;
1206 M_DEBUG(
"%s\n", __func__);
1208 ret = fat_getFileStartCluster(fatd, dirName, &startCluster, fatDir_host);
1213 if (!(fatDir_host->attr & FAT_ATTR_DIRECTORY)) {
1216 fatdlist->direntryCluster = startCluster;
1217 fatdlist->direntryIndex = 0;
1218 return fat_getNextDirentry(fatd, fatdlist, fatDir);
1222#if defined(BUILDING_USBHDFSD)
1223int fat_mount(
mass_dev *dev,
unsigned int start,
unsigned int count)
1224#elif defined(BUILDING_IEEE1394_DISK)
1225int fat_mount(
struct SBP2Device *dev,
unsigned int start,
unsigned int count)
1233 M_DEBUG(
"%s\n", __func__);
1235#if defined(BUILDING_USBHDFSD) || defined(BUILDING_IEEE1394_DISK)
1247 for (i = 0; i < NUM_DRIVES && fatd == NULL; ++i) {
1248 if (g_fatd[i] == NULL) {
1249 XPRINTF(
"usb fat: allocate fat_driver %d!\n",
sizeof(
fat_driver));
1251 if (g_fatd[i] != NULL) {
1252#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1253 g_fatd[i]->bd = NULL;
1254 g_fatd[i]->cache = NULL;
1256 g_fatd[i]->dev = NULL;
1261#
if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1272 M_PRINTF(
"unable to allocate drive!\n");
1276#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1277 if (fatd->bd != NULL) {
1278 M_PRINTF(
"mount ERROR: alread mounted\n");
1279 fat_forceUnmount(fatd->bd);
1282 if (fatd->dev != NULL) {
1283 M_PRINTF(
"mount ERROR: alread mounted\n");
1284 fat_forceUnmount(fatd->dev);
1288#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1289 if (fatd->cache != NULL) {
1290 M_PRINTF(
"ERROR: cache already created\n");
1291 scache_kill(fatd->cache);
1296#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1297 if (fat_getPartitionBootSector(bd, bd->sectorOffset, &fatd->partBpb) < 0)
1300 if (fat_getPartitionBootSector(dev, start, &fatd->partBpb) < 0)
1304#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1305 fatd->cache = scache_init(bd);
1306 if (fatd->cache == NULL) {
1307 M_PRINTF(
"Error - scache_init failed\n");
1312#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1318 fatd->clStackIndex = 0;
1319 fatd->clStackLast = 0;
1320 fatd->lastChainCluster = 0xFFFFFFFF;
1321 fatd->lastChainResult = -1;
1326#if defined(BUILDING_USBHDFSD)
1327void fat_forceUnmount(
mass_dev *dev)
1328#elif defined(BUILDING_IEEE1394_DISK)
1336 M_DEBUG(
"%s\n", __func__);
1338#ifdef BUILDING_USBHDFSD
1339 XPRINTF(
"usb fat: forceUnmount devId %i \n", dev->devId);
1341#ifdef BUILDING_IEEE1394_DISK
1342 XPRINTF(
"usb fat: forceUnmount devId %i \n", dev->nodeID);
1345 for (i = 0; i < NUM_DRIVES; ++i) {
1346#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1347 if (g_fatd[i] != NULL && g_fatd[i]->bd == bd)
1349 if (g_fatd[i] != NULL && g_fatd[i]->dev == dev)
1352#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1353 scache_kill(g_fatd[i]->cache);
1364 M_DEBUG(
"%s(%d)\n", __func__, device);
1366 if (device >= NUM_DRIVES)
1369#ifdef BUILDING_USBHDFSD
1370 while (g_fatd[device] == NULL || g_fatd[device]->dev == NULL) {
1371 if (mass_stor_configureNextDevice() <= 0)
1378#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1379 if (g_fatd[device] == NULL || g_fatd[device]->bd == NULL)
1381 if (g_fatd[device] == NULL || g_fatd[device]->dev == NULL)
1384 return g_fatd[device];
1388#if !defined(BUILDING_IEEE1394_DISK) && !defined(BUILDING_USBHDFSD)
1389int fat_stopUnit(
int device)
1393 fatd = fat_getData(device);
1394 return (fatd != NULL) ? fatd->bd->stop(fatd->bd) : -
ENODEV;
1397void fat_stopAll(
void)
1401 for (i = 0; i < NUM_DRIVES; i++) {
1404 fatd = fat_getData(i);
1406 fatd->bd->stop(fatd->bd);
u32 count
start sector of fragmented bd/file