Firmware/SD: implement FatFs CTRL_SYNC ioctl (issue #4)

This commit is contained in:
Maximilian Rehkopf 2012-07-01 03:20:27 +02:00
parent 71aef898d2
commit 2eeaaefcef
3 changed files with 31 additions and 2 deletions

View File

@ -55,7 +55,7 @@ DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);
#if _READONLY == 0 #if _READONLY == 0
DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE);
#endif #endif
#define disk_ioctl(a,b,c) RES_OK DRESULT disk_ioctl (BYTE, BYTE, void*);
void disk_init(void); void disk_init(void);

View File

@ -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 // 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) { DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count) {
uint8_t sec; uint8_t sec;
if(drv >= MAX_CARDS) { 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 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 */ uint8_t rsp[17]; /* space for response */
int rsplen; int rsplen;

View File

@ -22,6 +22,7 @@ DSTATUS sdn_initialize(BYTE drv);
DRESULT sdn_read(BYTE drv, BYTE *buffer, DWORD sector, BYTE count); 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_write(BYTE drv, const BYTE *buffer, DWORD sector, BYTE count);
DRESULT sdn_getinfo(BYTE drv, BYTE page, void *buffer); DRESULT sdn_getinfo(BYTE drv, BYTE page, void *buffer);
DRESULT sdn_ioctl(BYTE drv, BYTE cmd, void *buffer);
void sdn_changed(void); void sdn_changed(void);
uint8_t* sdn_getcid(void); uint8_t* sdn_getcid(void);