//-----------------------------------------------------------------------------
// 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;
}
Пример #2
0
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;
}
Пример #3
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();
}
Пример #4
0
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);
}
Пример #5
0
static void ls(char *dev)
{
	if(!fatfs_init(BLOCKDEV_MEMORY_CARD)) return;
	fatfs_list_files(lscb, NULL);
	fatfs_done();
}
Пример #6
0
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;
}