//----------------------------------------------------------------------------- // fl_attach_media: //----------------------------------------------------------------------------- int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) { int res; // If first call to library, initialise CHECK_FL_INIT(); _fs.disk_io.read_sector = rd; _fs.disk_io.write_sector = wr; // Initialise FAT parameters if ((res = fatfs_init(&_fs)) != FAT_INIT_OK) { #ifdef FAT_PRINT FAT_PRINT("FAT_FS: Error could not load FAT details! Formatting...\r\n"); #endif if(fl_format() != 1) { #ifdef FAT_PRINT FAT_PRINT("FAT_FS: Could not format"); #endif res = FAT_INIT_COULD_NOT_FORMAT; return res; } } _filelib_valid = 1; return FAT_INIT_OK; }
int main() { BLOCK_DEVICE *device; FSFILE *file; unsigned char i; unsigned long filepos; /* avoid issues with the interrupt routine hijacking the IY register - not sure how big a problem this really is, but can't hurt... */ #asm di #endasm buffer_emptybuffers(); // TODO: Can this be sensibly incorporated into fatfs_init? printf("Initializing fatfs library\n"); fatfs_init(); printf("opening DivIDE master drive\n"); device = divide_open_drive(DIVIDE_DRIVE_MASTER); printf("opening FATfs filesystem on it\n"); fatfs_fsopen(device, &fs); printf("fatfs filesystem at %04x\n", &fs); open_root_dir(&fs, &dir); printf("dir handle at %04x\n", &dir); for (i = 0; i < 13; i++) { read_dir(&dir, &entry); /* printf("%s\n", entry.filename); */ } printf("dirent at %04x\n", &entry); file = open_dirent(&entry, FILE_MODE_EXC_READ); printf("file handle at %04x\n", file); read_file(file, buffer1, 5); printf("first 5 chars stored at %04x\n", buffer1); seek_file(file, 2L); read_file(file, buffer2, 5); printf("chars 2-6 stored at %04x\n", buffer2); i = read_byte(file); printf("char 7 is %02x\n", i); filepos = get_file_pos(file); printf("file position is now %08lx\n", filepos); close_file(file); #asm ei #endasm return 0; }
static void load(char *filename, char *addr, char *dev) { char *c; unsigned int *addr2; if((*filename == 0) || (*addr == 0)) { printf("load <filename> <address>\n"); return; } addr2 = (unsigned *)strtoul(addr, &c, 0); if(*c != 0) { printf("incorrect address\n"); return; } if(!fatfs_init(BLOCKDEV_MEMORY_CARD)) return; fatfs_load(filename, (char *)addr2, 16*1024*1024, NULL); fatfs_done(); }
void fsboot(int devnr) { int size; unsigned int cmdline_adr, initrdstart_adr, initrdend_adr; printf("I: Booting from filesystem...\n"); if(!fatfs_init(devnr)) { printf("E: Unable to initialize filesystem\n"); return; } if(tryload("BOOT.BIN", SDRAM_BASE) <= 0) { printf("E: Firmware image not found\n"); fatfs_done(); return; } cmdline_adr = SDRAM_BASE+0x1000000; size = tryload("CMDLINE.TXT", cmdline_adr); if(size <= 0) { printf("I: No command line parameters found (CMDLINE.TXT)\n"); cmdline_adr = 0; } else *((char *)(cmdline_adr+size)) = 0x00; initrdstart_adr = SDRAM_BASE+0x1002000; size = tryload("INITRD.BIN", initrdstart_adr); if(size <= 0) { printf("I: No initial ramdisk found (INITRD.BIN)\n"); initrdstart_adr = 0; initrdend_adr = 0; } else initrdend_adr = initrdstart_adr + size - 1; fatfs_done(); printf("I: Booting...\n"); boot(cmdline_adr, initrdstart_adr, initrdend_adr, rescue, SDRAM_BASE); }
static void ls(char *dev) { if(!fatfs_init(BLOCKDEV_MEMORY_CARD)) return; fatfs_list_files(lscb, NULL); fatfs_done(); }
static int fatfs_mount(cyg_fstab_entry *fste, cyg_mtab_entry *mte) { cyg_io_handle_t dev_h; fatfs_disk_t *disk; fatfs_dir_entry_t root_dentry; Cyg_ErrNo err; CYG_TRACE2(TFS, "mount fste=%p mte=%p", fste, mte); init_fatfs_fds(); CYG_TRACE1(TFS, "looking up disk device '%s'", mte->devname); err = cyg_io_lookup(mte->devname, &dev_h); if (err != ENOERR) return err; disk = (fatfs_disk_t *)malloc(sizeof(fatfs_disk_t)); if (NULL == disk) return ENOMEM; CYG_TRACE0(TFS, "initializing block cache"); disk->bcache_mem = (cyg_uint8 *)malloc(CYGNUM_FS_FAT_BLOCK_CACHE_MEMSIZE); if (NULL == disk->bcache_mem) { free(disk); return ENOMEM; } // FIXME: get block size from disk device err = cyg_blib_io_create(dev_h, disk->bcache_mem, CYGNUM_FS_FAT_BLOCK_CACHE_MEMSIZE, 512, &disk->blib); if (err != ENOERR) { free(disk->bcache_mem); free(disk); return err; } disk->dev_h = dev_h; CYG_TRACE0(TFS, "initializing disk"); err = fatfs_init(disk); if (err != ENOERR) { cyg_blib_delete(&disk->blib); free(disk->bcache_mem); free(disk); return err; } #if TFS print_disk_info(disk); #endif CYG_TRACE0(TFS, "initializing node cache"); fatfs_node_cache_init(disk); CYG_TRACE0(TFS, "initializing root node"); fatfs_get_root_dir_entry(disk, &root_dentry); disk->root = fatfs_node_alloc(disk, &root_dentry); fatfs_node_ref(disk, disk->root); mte->root = (cyg_dir)disk->root; mte->data = (CYG_ADDRWORD)disk; CYG_TRACE0(TFS, "disk mounted"); return ENOERR; }