Пример #1
0
int FATFileHandle::fsync() {
    FFSDEBUG("fsync()\n");
    FRESULT res = f_sync(&_fh);
    if (res) {
        FFSDEBUG("f_sync() failed (%d, %s)\n", res, FR_ERRORS[res]);
        return -1;
    }
    return 0;
}
Пример #2
0
ssize_t FATFileHandle::read(void* buffer, size_t length) {
    FFSDEBUG("read(%d)\n", length);
    UINT n;
    FRESULT res = f_read(&_fh, buffer, length, &n);
    if(res) {
        FFSDEBUG("f_read() failed (%d, %s)\n", res, FR_ERRORS[res]);
        return -1;
    }
    return n;
}
Пример #3
0
ssize_t FATFileHandle::write(const void* buffer, size_t length) {
    FFSDEBUG("write(%d)\n", length);
    UINT n;
    FRESULT res = f_write(&_fh, buffer, length, &n);
    if(res) { 
        FFSDEBUG("f_write() failed (%d, %s)", res, FR_ERRORS[res]);
        return -1;
    }
    return n;
}
Пример #4
0
DRESULT disk_ioctl (
	BYTE drv,		/* Physical drive nmuber (0..) */
	BYTE ctrl,		/* Control code */
	void *buff		/* Buffer to send/receive control data */
)
{
	FFSDEBUG("disk_ioctl(%d)\n", ctrl);
	switch(ctrl) {
		case CTRL_SYNC:
			if(FATFileSystem::_ffs[drv] == NULL) {
				return RES_NOTRDY;
			} else if(FATFileSystem::_ffs[drv]->disk_sync()) {
				return RES_ERROR;
			}
			return RES_OK;
		case GET_SECTOR_COUNT:
			if(FATFileSystem::_ffs[drv] == NULL) {
				return RES_NOTRDY;
			} else {
				int res = FATFileSystem::_ffs[drv]->disk_sectors();
				if(res > 0) {
					*((DWORD*)buff) = res; // minimum allowed
					return RES_OK;
				} else {
					return RES_ERROR;
				}
			}
		case GET_BLOCK_SIZE:
			*((DWORD*)buff) = 1; // default when not known
			return RES_OK;

	}
	return RES_PARERR;
}
Пример #5
0
DSTATUS disk_status (
	BYTE drv		/* Physical drive nmuber (0..) */
)
{
	FFSDEBUG("disk_status on drv [%d]\n", drv);
	return (DSTATUS)FATFileSystem::_ffs[drv]->disk_status();
}
Пример #6
0
off_t FATFileHandle::lseek(off_t position, int whence) {
    FFSDEBUG("lseek(%i,%i)\n",position,whence);
    if(whence == SEEK_END) {
        position += _fh.fsize;
    } else if(whence==SEEK_CUR) {
        position += _fh.fptr;
    }
    FRESULT res = f_lseek(&_fh, position);
    if(res) {
        FFSDEBUG("lseek failed (%d, %s)\n", res, FR_ERRORS[res]);
        return -1;
    } else {
        FFSDEBUG("lseek OK, returning %i\n", _fh.fptr);
        return _fh.fptr;
    }
}
Пример #7
0
DRESULT disk_write (
	BYTE drv,			/* Physical drive nmuber (0..) */
	const BYTE *buff,	/* Data to be written */
	DWORD sector,		/* Sector address (LBA) */
	BYTE count			/* Number of sectors to write (1..255) */
)
{
	FFSDEBUG("disk_write(sector %d, count %d) on drv [%d]\n", sector, count, drv);
	for(unsigned int s=sector; s<sector+count; s++) {
		FFSDEBUG(" disk_write(sector %d)\n", s);
		int res = FATFileSystem::_ffs[drv]->disk_write((char*)buff, sector);
		if(res) {
			return RES_PARERR;
		}
		buff += 512;
	}
	return RES_OK;
}
Пример #8
0
off_t FATFileHandle::flen() {
    FFSDEBUG("flen\n");
    return _fh.fsize;
}
Пример #9
0
int FATFileHandle::close() {
    FFSDEBUG("close\n");
    int retval = f_close(&_fh);
    delete this;
    return retval;
}