diff --git a/src/diskio.h b/src/diskio.h index 40a002f..05787ad 100644 --- a/src/diskio.h +++ b/src/diskio.h @@ -55,7 +55,7 @@ DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); #if _READONLY == 0 DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); #endif -#define disk_ioctl(a,b,c) RES_OK +DRESULT disk_ioctl (BYTE, BYTE, void*); void disk_init(void); diff --git a/src/sdnative.c b/src/sdnative.c index d1f67e5..fad2d86 100644 --- a/src/sdnative.c +++ b/src/sdnative.c @@ -857,10 +857,38 @@ void write_block(uint32_t address, uint8_t* buf) { } } +/* send STOP_TRANSMISSION after multiple block write + * and reset during_blocktrans status */ + +void flush_write(void) { + cmd_fast(STOP_TRANSMISSION, 0, 0x61, NULL, rsp); + wait_busy(); + during_blocktrans = TRANS_NONE; +} + // // Public functions // +DRESULT sdn_ioctl(BYTE drv, BYTE cmd, void *buffer) { + DRESULT res; + if(drv >= MAX_CARDS) { + res = STA_NOINIT|STA_NODISK; + } else { + switch(cmd) { + case CTRL_SYNC: + flush_write(); + res = RES_OK; + break; + + default: + res = RES_PARERR; + } + } + return res; +} +DRESULT disk_ioctl(BYTE drv, BYTE cmd, void *buffer) __attribute__ ((weak, alias("sdn_ioctl"))); + DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) { uint8_t sec; if(drv >= MAX_CARDS) { @@ -876,7 +904,7 @@ DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) { } DRESULT disk_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) __attribute__ ((weak, alias("sdn_read"))); -DRESULT sdn_initialize(BYTE drv) { +DSTATUS sdn_initialize(BYTE drv) { uint8_t rsp[17]; /* space for response */ int rsplen; diff --git a/src/sdnative.h b/src/sdnative.h index 39a76e5..c8cfae1 100644 --- a/src/sdnative.h +++ b/src/sdnative.h @@ -22,6 +22,7 @@ DSTATUS sdn_initialize(BYTE drv); DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count); DRESULT sdn_write(BYTE drv, const BYTE *buffer, DWORD sector, BYTE count); DRESULT sdn_getinfo(BYTE drv, BYTE page, void *buffer); +DRESULT sdn_ioctl(BYTE drv, BYTE cmd, void *buffer); void sdn_changed(void); uint8_t* sdn_getcid(void);