/////////////////////////////////////////////////////////////////////////////// // SDMemWriteMultiple - Write multiple 512 byte blocks of data to card // Input: pMemCard - SD memory card structure // StartBlock - Starting 512 byte block for write // NumBlocks - Number of blocks to write // pBuffer - Pointer to buffer containing write data // Output: // Return: win32 status code // Notes: /////////////////////////////////////////////////////////////////////////////// DWORD SDMemWriteMultiple( PSD_MEMCARD_INFO pMemCard, LONG StartBlock, LONG NumBlocks, PUCHAR pBuffer ) { DEBUGMSG(SDMEM_ZONE_CARD_IO, (TEXT("SDMemWriteMultiple: Writing blocks %d-%d\r\n"), StartBlock, StartBlock+NumBlocks-1)); if( pMemCard->SingleBlockWrites || (NumBlocks == 1)) { DEBUGMSG(SDMEM_ZONE_CARD_IO, (TEXT("SDMemWriteMultiple: Sending request to SDMemWriteUsingSingleBlocks\r\n"))); return SDMemWriteUsingSingleBlocks( pMemCard, StartBlock, NumBlocks, pBuffer ); } // high capacity cards just take the block offset. standard cards // take a byte offset. if (!pMemCard->HighCapacity) { if (ULONG_MAX / SD_BLOCK_SIZE < StartBlock) { ASSERT(FALSE); return ERROR_INVALID_PARAMETER; } StartBlock *= SD_BLOCK_SIZE; } // issue multi-block write request return SDMemDoBusRequest( pMemCard, SD_CMD_WRITE_MULTIPLE_BLOCK, StartBlock, SD_WRITE, ResponseR1, NumBlocks, SD_BLOCK_SIZE, pBuffer, SD_AUTO_ISSUE_CMD12); }
/////////////////////////////////////////////////////////////////////////////// // SDMemWriteMultiple - Write multiple 512 byte blocks of data to card // Input: pMemCard - SD memory card structure // StartBlock - Starting 512 byte block for write // NumBlocks - Number of blocks to write // pBuffer - Pointer to buffer containing write data // Output: // Return: win32 status code // Notes: /////////////////////////////////////////////////////////////////////////////// DWORD SDMemWriteMultiple( PSD_MEMCARD_INFO pMemCard, LONG StartBlock, LONG NumBlocks, PUCHAR pBuffer ) { DEBUGMSG(SDMEM_ZONE_CARD_IO, (TEXT("SDMemWriteMultiple: Writing blocks %d-%d\r\n"), StartBlock, StartBlock+NumBlocks-1)); #ifdef _FOR_MOVI_NAND_ // Date : 07.05.28 // Developer : HS.JANG // Description : moviNAND dose not support Single-Block write if ( pMemCard->IsHSMMC == TRUE ) { } else #endif { if( pMemCard->SingleBlockWrites || (NumBlocks == 1)) { DEBUGMSG(SDMEM_ZONE_CARD_IO, (TEXT("SDMemWriteMultiple: Sending request to SDMemWriteUsingSingleBlocks\r\n"))); return SDMemWriteUsingSingleBlocks( pMemCard, StartBlock, NumBlocks, pBuffer ); } } // high capacity cards just take the block offset. standard cards // take a byte offset. if (!pMemCard->HighCapacity) { if (ULONG_MAX / SD_BLOCK_SIZE < StartBlock) { ASSERT(FALSE); return ERROR_INVALID_PARAMETER; } StartBlock *= SD_BLOCK_SIZE; } // issue multi-block write request #ifdef _FOR_MOVI_NAND_ // Date : 07.05.28 // Developer : HS.JANG // Description : To use Pre-Define. Set the flag as // for moviANND. If you do not use moviNAND // Do NOT define FOR_MOVI_NAND if ( pMemCard->IsHSMMC == TRUE ) { return SDMemDoBusRequest( pMemCard, SD_CMD_WRITE_MULTIPLE_BLOCK, StartBlock, SD_WRITE, ResponseR1, NumBlocks, SD_BLOCK_SIZE, pBuffer, SD_MOVINAND_PRE_DEFINE); } #endif return SDMemDoBusRequest( pMemCard, SD_CMD_WRITE_MULTIPLE_BLOCK, StartBlock, SD_WRITE, ResponseR1, NumBlocks, SD_BLOCK_SIZE, pBuffer, SD_AUTO_ISSUE_CMD12); }