⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdmemcardio.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  DEBUGMSG( SDMEM_ZONE_CARD_IO, (TEXT("SDMemReadMultiple: Reading blocks %d-%d\r\n"), 
        StartBlock, StartBlock+NumBlocks-1));
  // 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;
  }

  // perform block read request
  if (NumBlocks == 1) {
    // for single blocks 
    return SDMemDoBusRequest( pMemCard,
        SD_CMD_READ_SINGLE_BLOCK,
        StartBlock,
        SD_READ,
        ResponseR1,
        NumBlocks,
        SD_BLOCK_SIZE,
        pBuffer,
        0);  

  }
  // multi-block writes use the optimized command
  // we have to auto issue a stop command though
#ifdef _FOR_MOVI_NAND_
  /**
   * 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_READ_MULTIPLE_BLOCK,
        StartBlock,
        SD_READ,
        ResponseR1,
        NumBlocks,
        SD_BLOCK_SIZE,
        pBuffer,
        SD_MOVINAND_PRE_DEFINE);     
  }
#endif
  return SDMemDoBusRequest( pMemCard,
      SD_CMD_READ_MULTIPLE_BLOCK,
      StartBlock,
      SD_READ,
      ResponseR1,
      NumBlocks,
      SD_BLOCK_SIZE,
      pBuffer,
      SD_AUTO_ISSUE_CMD12);  // 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_
  /**
   * 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_
  /**
   * 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);
}

///////////////////////////////////////////////////////////////////////////////
//  SDMemWriteUsingSingleBlocks  - Write using only single block commands
//  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 SDMemWriteUsingSingleBlocks( PSD_MEMCARD_INFO pMemCard,
                                   LONG             StartBlock,
                                   LONG             NumBlocks,
                                   PUCHAR           pBuffer )
{
    DWORD status = SD_API_STATUS_SUCCESS;   // intermediate win32 status
    LONG  block;    // block count

    if (StartBlock + NumBlocks < StartBlock) {
        // Check for arithmetic overflow
        return ERROR_INVALID_PARAMETER;
    }

    if (!pMemCard->HighCapacity) {
        if (ULONG_MAX / SD_BLOCK_SIZE < StartBlock + NumBlocks) {
            return ERROR_INVALID_PARAMETER;
        }
    }

        // Split write operation into single blocks
    for( block=0; block<NumBlocks; block++ ) {
        DEBUGMSG(SDMEM_ZONE_CARD_IO, (TEXT("SDMemWriteUsingSingleBlocks: Writing block %d\r\n"), StartBlock+block));

        DWORD dwOffset = StartBlock + block;
        if (!pMemCard->HighCapacity) {
            dwOffset *= SD_BLOCK_SIZE;
        }
        
            // issue single block write request
        status = SDMemDoBusRequest( pMemCard,
                                    SD_CMD_WRITE_BLOCK,
                                    dwOffset,
                                    SD_WRITE,
                                    ResponseR1,
                                    1,
                                    SD_BLOCK_SIZE,
                                    pBuffer + (block*SD_BLOCK_SIZE),
                                    0);
        
        if( ERROR_SUCCESS != status )
            break;
    }

    return status;
}

// DO NOT REMOVE --- END EXTERNALLY DEVELOPED SOURCE CODE ID --- DO NOT REMOVE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -