Firmware: optimize non-sector-aligned SD DMA reads (bugfix)

This commit is contained in:
ikari 2012-01-14 11:58:20 +01:00
parent d7ad740843
commit b8f4c9b584
2 changed files with 13 additions and 5 deletions

View File

@ -2639,8 +2639,16 @@ FRESULT f_lseek (
fp->flag &= ~FA__DIRTY;
}
#endif
if (disk_read(fp->fs->drv, fp->buf, dsc, 1) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
if(!ff_sd_offload) {
sd_offload_partial=0;
if (disk_read(fp->fs->drv, fp->buf, dsc, 1) != RES_OK)
ABORT(fp->fs, FR_DISK_ERR);
} else {
sd_offload_partial=1;
sd_offload_partial_start = fp->fptr % SS(fp->fs);
}
// if (disk_read(fp->fs->drv, fp->buf, dsc, 1) != RES_OK)
// ABORT(fp->fs, FR_DISK_ERR);
#endif
fp->dsect = dsc;
}

View File

@ -800,10 +800,10 @@ void read_block(uint32_t address, uint8_t *buf) {
&& last_block == address
&& last_offset == sd_offload_partial_start
&& sd_offload_partial) {
stream_datablock(buf);
last_offset = sd_offload_partial_end & 0x1ff;
sd_offload_partial_start |= 0x8000;
stream_datablock(buf);
during_blocktrans = TRANS_READ;
last_offset = sd_offload_partial_end & 0x1ff;
sd_offload_partial = 0;
} else {
if(during_blocktrans) {
@ -812,6 +812,7 @@ void read_block(uint32_t address, uint8_t *buf) {
/* send STOP_TRANSMISSION to end an open READ/WRITE_MULTIPLE_BLOCK */
cmd_fast(STOP_TRANSMISSION, 0, 0x61, NULL, rsp);
}
during_blocktrans = TRANS_READ;
last_block = address;
if(!ccs) {
address <<= 9;
@ -825,7 +826,6 @@ void read_block(uint32_t address, uint8_t *buf) {
cmd_fast(READ_MULTIPLE_BLOCK, address, 0, buf, rsp);
#endif
sd_offload_partial = 0;
during_blocktrans = TRANS_READ;
}
// printf("trans state = %d\n", during_blocktrans);
}