//------------------------------------------------------------------------------ //! \brief Writes data on the a LUN starting at the specified block address. //! \param pLUN Pointer to a MSDLun instance //! \param blockAddress First block address to write //! \param data Pointer to the data to write //! \param length Number of blocks to write //! \param callback Optional callback to invoke when the write finishes //! \return Operation result code //------------------------------------------------------------------------------ unsigned char LUN_Write(MSDLun *lun, unsigned int blockAddress, void *data, unsigned int length, TransferCallback callback, void *argument) { unsigned int address; unsigned char status; TRACE_INFO_WP("LUNWrite(%u) ", blockAddress); // Check that the data is not too big if ((length * lun->blockSize) > (lun->size - lun->blockSize * blockAddress)) { TRACE_WARNING("LUN_Write: Data too big\n\r"); status = USBD_STATUS_ABORTED; } else { // Compute write start address address = lun->media->baseAddress + lun->baseAddress + blockAddress * lun->blockSize; // Start write operation status = MED_Write(lun->media, address, data, length * lun->blockSize, (MediaCallback) callback, argument); // Check operation result code if (status == MED_STATUS_SUCCESS) { status = USBD_STATUS_SUCCESS; } else { TRACE_WARNING("LUN_Write: Cannot write media\n\r"); status = USBD_STATUS_ABORTED; } } return status; }
esint8 if_writeBuf(hwInterface* file,euint32 address,euint8* buf) { unsigned int result; euint32 addr, len; translate_media(file->pMedia, address, &addr, &len); result = MED_Write(file->pMedia, addr, (void*)buf, len, NULL, NULL); if( result != MED_STATUS_SUCCESS ) { TRACE_INFO("MED_WRITE pb: 0x%X\n\r", result); } return(0); }
DRESULT disk_write ( BYTE drv, /* Physical drive number (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector number (LBA) */ BYTE count /* Sector count (1..255) */ ) { DRESULT res=RES_PARERR; unsigned int result; void * tmp; tmp = (void *) buff; unsigned int addr, len; if (medias[drv].blockSize < SECTOR_SIZE_DEFAULT) { addr = sector * (SECTOR_SIZE_DEFAULT / medias[drv].blockSize); len = count * (SECTOR_SIZE_DEFAULT / medias[drv].blockSize); } else { addr = sector; len = count; } result = MED_Write(&medias[drv], addr, // address (void*)tmp, // data len, // data size NULL, NULL); if( result == MED_STATUS_SUCCESS ) { res = RES_OK; } else { TRACE_ERROR("MED_Write pb: 0x%X\n\r", result); res = RES_ERROR; } return res; }
DRESULT disk_write ( BYTE drv, /* Physical drive number (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector number (LBA) */ BYTE count /* Sector count (1..255) */ ) { DRESULT res=RES_PARERR; unsigned int result; unsigned sectorSize; if (drv == DRV_SDRAM) { sectorSize = SECTOR_SIZE_SDRAM; } else if(drv == DRV_MMC) { sectorSize = SECTOR_SIZE_SDCARD; } result = MED_Write(&medias[drv], medias[drv].baseAddress + (sector * sectorSize), // address (void*)buff, // data count * sectorSize, // data size NULL, NULL); if( result == MED_STATUS_SUCCESS ) { res = RES_OK; } else { TRACE_ERROR("MED_Write pb: 0x%X\n\r", result); res = RES_ERROR; } return res; }