Exemple #1
0
int
fatfs_init(MountEntry *me) {
    struct stat s;

    if( nfs >= MAXDISK ) {
        PANIC("too many FATFS");
    }

    struct FatFS *f = & fsinfo[nfs];
    f->me     = me;
    f->n      = nfs;
    me->fsdat = f;

    fstat(me->fdev, &s);
    f->size = s.size;

    f_mount( nfs, & f->ff );

    char buff[13];
    DWORD sno;
    if( f_getlabel("", buff, &sno)==FR_OK ) {
        bootmsg("%s fatfs volume '%s' s/n %x\n",
                me->name, buff, sno);
    }

    nfs ++;

    return 0;
}
Exemple #2
0
void PFAT::Create(storage_t *sto, uint8_t lv, uint32_t first) {
        label = NULL;
        ffs = NULL;

        set_clock_call((void*)&RTClock);
        uint8_t buf[sto->SectorSize];
        TCHAR lb[256];
        lb[0] = 0x00;
        int i = 0;
        if(lv > PFAT_VOLUMES) return;
        st = (int)(sto->Reads)(first, buf, sto, 1);
        if(!st) {
                fat_boot_t *BR = (fat_boot_t *)buf;
                // verify that the sig is OK.
                if(BR->bootSectorSig0 != 0x55 || BR->bootSectorSig1 != 0xAA) {
                        //printf_P(PSTR("Bad sig? %02x %02x\r\n"), BR->bootSectorSig0, BR->bootSectorSig1);
                        st = -1;
                } else {
                        Offset = first;
                        storage = sto;
                        ffs = new FATFS;
                        ffs->pfat = this;
                        volmap = lv;
                        st = 0xff & f_mount(volmap, ffs);
                        if(!st) {
                                if(label != NULL) {
                                        delete label;
                                        label = NULL;
                                }
                                TCHAR path[4];
                                path[0] = '0' + lv;
                                path[1] = ':';
                                path[2] = '/';
                                path[3] = 0x00;
                                DWORD sn;
                                FRESULT t = f_getlabel(path, lb, &sn);
                                label = (uint8_t *)(operator new[] (13));
                                label[0] = '/';
                                label[1] = 0x00;
                                if(!t) {
                                        for(i = 0; lb[i] != 0x00 && i < 12; i++)
                                                label[i + 1] = lb[i];
                                        label[i + 1] = 0x00;
                                        // We will need to convert 'wide' chars, etc? yuck!
                                        // Life would be a whole lot easier if everything was just UTF-8!
                                }
                                //printf_P(PSTR("VOLUME %i @ '%s'\r\n"), volmap, &label[0]);
                        } else {
                                // Unmount it
                                f_mount(volmap, NULL);
                                //printf_P(PSTR("Mount failed %i(%x)\r\n"), st, st);
                        }
                }
        }
}
Exemple #3
0
char* diskdrive_volume_label()
{
	disk_interface_t* disk = diskdrive_get_disk(current_drive);
	if(disk)
	{
		DWORD vsn;
		f_getlabel(disk->volume.lvn, disk->volume.label, &vsn);
		return disk->volume.label;
	}
	return NULL;
}
Exemple #4
0
FRESULT DFATFS::fsgetlabel(const char* path, char * label, uint32_t* vsn) 
{
    return(f_getlabel(path, label, vsn));
}
Exemple #5
0
FRESULT FatFs::getlabel(const char* path, char* label, uint32_t* serial)
{
    return f_getlabel(path, label, serial);
}
Exemple #6
0
void main (void)
{
    FIL f1, f2;      /* 文件对象 */
    FRESULT res;         /* FatFs 函数公共结果代码 */
    char  cmd[100];
    TCHAR *ptr, *ptr2, pool[50];
    long p1, p2, p3;
    BYTE *buf;
    UINT s1, s2, cnt;
    WORD w;
    DWORD dw, ofs = 0, sect = 0, drv = 0;
    static const BYTE ft[] = {0, 12, 16, 32};
    FATFS *fs;              /* Pointer to file system object */
    DIR dir;                /* Directory object */
    FIL file[2];            /* File objects */


while(1){
    ptr=cmd;
    printf(">");
    scanf("%s",ptr);
    switch (*ptr++){
        case 'q': return 0;
        case '?': printf("%s\n",HelpStr ); break;
        case 'd' :  /* Disk I/O command */
            switch (*ptr++) {   /* 第二个指令 */
            case 'd' :  /* dd [<pd#> <sect>] - Dump a secrtor */
                if (!xatoi(&ptr, &p1)) {
                    p1 = drv; p2 = sect;
                } else {
                    if (!xatoi(&ptr, &p2)) break;
                }
                res = disk_read((BYTE)p1, Buff, p2, 1);
                if (res) { printf("rc=%d\n", (WORD)res); break; }
                printf("Drive:%u Sector:%lu\n", p1, p2);
                if (disk_ioctl((BYTE)p1, GET_SECTOR_SIZE, &w) != RES_OK) break;
                sect = p2 + 1; drv = p1; 
                for (buf = Buff, ofs = 0; ofs < w; buf += 16, ofs += 16)
                    put_dump(buf, ofs, 16);
                break;

                
            case 'i' :  /* di <pd#> - 磁盘初始化 */
                if (!xatoi(&ptr, &p1)) break;
                res = disk_initialize((BYTE)p1);
                printf("rc=%d\n", res);
                if (disk_ioctl((BYTE)p1, GET_SECTOR_SIZE, &w) == RES_OK)
                    printf("Sector size = %u\n", w);
                if (disk_ioctl((BYTE)p1, GET_SECTOR_COUNT, &dw) == RES_OK)
                    printf("Number of sectors = %u\n", dw);
                break;
            case 's':
                if (!xatoi(&ptr, &p1)) break;
                if (disk_ioctl((BYTE)p1, GET_SECTOR_SIZE, &w) == RES_OK)
                    printf("Sector size = %u\n", w);
                if (disk_ioctl((BYTE)p1, GET_SECTOR_COUNT, &dw) == RES_OK)
                    printf("Number of sectors = %u\n", dw);
            }

        case 'f' :  /* FatFs test command */
            switch (*ptr++) {   /* Branch by secondary command character */
            case  'i':/*挂载fi <ld#> [<mount>]*/
                if (!xatoi(&ptr, &p1) || (UINT)p1 > 9) break;
                if (!xatoi(&ptr, &p2)) p2 = 0;
                sprintf(ptr, "%d:", p1);
                res=f_mount(&FatFs[p1], ptr, (BYTE)p2);
                printf("%d\n",res );
                break;
            case 's':/*状态fs [<path>]*/
                while (*ptr == ' ') ptr++;
                ptr2 = ptr;
#if _FS_READONLY
                res = f_opendir(&dir, ptr);
                if (res) {
                    fs = dir.fs;
                    f_closedir(&dir);
                }
#else
                res = f_getfree(ptr, (DWORD*)&p1, &fs);
#endif
                if (res) { put_rc(res); break; }
                printf("FAT type = FAT%u\nNumber of FATs = %u\n", ft[fs->fs_type & 3], fs->n_fats);
                printf("Cluster size = %u sectors, %lu bytes\n",
#if _MAX_SS != 512
                    fs->csize, (DWORD)fs->csize * fs->ssize);
#else
                    fs->csize, (DWORD)fs->csize * 512);
#endif
                if (fs->fs_type != FS_FAT32) printf("Root DIR entries = %u\n", fs->n_rootdir);
                printf("Sectors/FAT = %lu\nNumber of clusters = %lu\nVolume start sector = %lu\nFAT start sector = %lu\nRoot DIR start %s = %lu\nData start sector = %lu\n\n",
                    fs->fsize, fs->n_fatent - 2, fs->volbase, fs->fatbase, fs->fs_type == FS_FAT32 ? _T("cluster") : _T("sector"), fs->dirbase, fs->database);
#if _USE_LABEL
                res = f_getlabel(ptr2, pool, &dw);
                if (res) { put_rc(res); break; }
                _tprintf(pool[0] ? _T("Volume name is %s\n") : _T("No volume label\n"), pool);
                _tprintf(_T("Volume S/N is %04X-%04X\n"), dw >> 16, dw & 0xFFFF);
#endif
                printf("...");
                AccSize = AccFiles = AccDirs = 0;
                res = scan_files(ptr);
                if (res) { put_rc(res); break; }
                p2 = (fs->n_fatent - 2) * fs->csize;
                p3 = p1 * fs->csize;
#if _MAX_SS != 512
                p2 *= fs->ssize / 512;
                p3 *= fs->ssize / 512;
#endif
                p2 /= 2;
                p3 /= 2;
                printf("\r%u files, %I64u bytes.\n%u folders.\n%lu KiB total disk space.\n",
                        AccFiles, AccSize, AccDirs, p2);
#if !FS_READONLY
                printf("%lu KiB available.\n", p3);
#endif
                break;



        }

    }
}
    /* 为逻辑驱动器注册工作区 */
    printf("%d\n",f_mount(&fs[0],"",1));
    printf("%d\n",f_mkfs("",0,0) );
    getch();
    printf("%d\n",f_mkdir("test"));
    printf("%d\n",f_mkdir("test\\test1"));
    f_open(&f1, "message.txt", FA_CREATE_NEW);
    printf("%d\n",f_mkdir("test2"));
    return;

}