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

📄 sddevinf.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  /**
   * Description : Get CSD Spec version Info to know card type
   */
  pParsedCSD->SpecVersion= (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_SPEC_VERSION_BIT_SLICE, 
      SD_CSD_SPEC_VERSION_SLICE_SIZE);
#endif
  // check the CSD version code
  if (Device_SD_Memory == m_DeviceType) {
    if (pParsedCSD->CSDVersion > (SD_CSD_VERSION_CODE_SUPPORTED)) {
      DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDCardInfoQuery: SD CSD version : %d currently not supported \n"),pParsedCSD->CSDVersion));
      DEBUGCHK(FALSE);
      return SD_API_STATUS_DEVICE_UNSUPPORTED;
    }
  } else if (Device_MMC == m_DeviceType) {
#ifdef _MMC_SPEC_42_
  /**
   * Description : If MMC card is HSMMC, should check whether it is bigger than Spec 4.2 or not
   */
  if (pParsedCSD->SpecVersion >= HSMMC_CSD_SPEC_VERSION_CODE_SUPPORTED) 
  {
    MMC_PARSED_REGISTER_EXTCSD ExtCSD;
    m_dwMMCSpecVer = Device_HSMMC40;
    ExtCSD = *(MMC_PARSED_REGISTER_EXTCSD*)m_ucEXTCSD;

    if ( ExtCSD.Sec_Count > 0 )
    {

      SD_COMMAND_RESPONSE         response;  // response
      SD_API_STATUS            status = SD_API_STATUS_SUCCESS;                      

      pParsedCSD->SectorCount = ExtCSD.Sec_Count;

      // if the MMC card is on SPEC42, Block Length must be 512Byte.
      status = SendSDCommand( SD_CMD_SET_BLOCKLEN    , 
          ((DWORD)512), 
          ResponseR1, 
          &response); 
      if (!SD_API_SUCCESS(status))
      {  
        RETAILMSG(true,(TEXT("### SD_CMD_SET_BLOCKLEN is FAILED ###\n")));
      }
      
      // for print the spec version of SD Card.
      #ifdef DEBUG
      DEBUGMSG(SDBUS_ZONE_DEVICE, (TEXT("[SDBUS] MMC Spec Version : >=4.2\n")));
      #endif
    }

  }                 
#endif

  } else {
    DEBUGCHK(FALSE);
    return SD_API_STATUS_INVALID_PARAMETER;
  }

  // get the value
  value = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_TAAC_BIT_SLICE, 
      SD_CSD_TAAC_SLICE_SIZE);
  // extract the time units
  unit  = value & SD_CSD_TAAC_UNIT_MASK;
  // get the timee value into position
  value = (value & SD_CSD_TAAC_VALUE_MASK) >> SD_CSD_TAAC_VALUE_SHIFT;

  switch( value ) {
    case 1:  pParsedCSD->DataAccessTime.TAAC = 1.0; break;
    case 2:  pParsedCSD->DataAccessTime.TAAC = 1.2; break;
    case 3:  pParsedCSD->DataAccessTime.TAAC = 1.3; break;
    case 4:  pParsedCSD->DataAccessTime.TAAC = 1.5; break;
    case 5:  pParsedCSD->DataAccessTime.TAAC = 2.0; break;
    case 6:  pParsedCSD->DataAccessTime.TAAC = 2.5; break;
    case 7:  pParsedCSD->DataAccessTime.TAAC = 3.0; break;
    case 8:  pParsedCSD->DataAccessTime.TAAC = 3.5; break;
    case 9:  pParsedCSD->DataAccessTime.TAAC = 4.0; break;
    case 10: pParsedCSD->DataAccessTime.TAAC = 4.5; break;
    case 11: pParsedCSD->DataAccessTime.TAAC = 5.0; break;
    case 12: pParsedCSD->DataAccessTime.TAAC = 5.5; break;
    case 13: pParsedCSD->DataAccessTime.TAAC = 6.0; break;
    case 14: pParsedCSD->DataAccessTime.TAAC = 7.0; break;
    case 15: pParsedCSD->DataAccessTime.TAAC = 8.0; break;
    default: pParsedCSD->DataAccessTime.TAAC = 0.0; break;
  };

  for( ; unit; unit-- ) {
    pParsedCSD->DataAccessTime.TAAC *= 10; 
  }

  pParsedCSD->DataAccessTime.NSAC = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_NSAC_BIT_SLICE, 
      SD_CSD_NSAC_SLICE_SIZE);


  // Calculate transfer rate in kbit/s
  value = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_TRANS_SPEED_BIT_SLICE, 
      SD_CSD_TRANS_SPEED_SLICE_SIZE);

  unit  = value & SD_CSD_TRANS_SPEED_UNIT_MASK;

  // get value bits into position
  value = (value & SD_CSD_TRANS_SPEED_VALUE_MASK) >> SD_CSD_TRANS_SPEED_VALUE_SHIFT;

  switch( value ) {            
    case 1:  pParsedCSD->MaxDataTransferRate = 100; break;
    case 2:  pParsedCSD->MaxDataTransferRate = 120; break;
    case 3:  pParsedCSD->MaxDataTransferRate = 130; break;
    case 4:  pParsedCSD->MaxDataTransferRate = 150; break;
    case 5:  pParsedCSD->MaxDataTransferRate = 200; break;
    case 6:  pParsedCSD->MaxDataTransferRate = 250; break;
    case 7:  pParsedCSD->MaxDataTransferRate = 300; break;
    case 8:  pParsedCSD->MaxDataTransferRate = 350; break;
    case 9:  pParsedCSD->MaxDataTransferRate = 400; break;
    case 10: pParsedCSD->MaxDataTransferRate = 450; break;
    case 11: pParsedCSD->MaxDataTransferRate = 500; break;
    case 12: pParsedCSD->MaxDataTransferRate = 550; break;
    case 13: pParsedCSD->MaxDataTransferRate = 600; break;
    case 14: pParsedCSD->MaxDataTransferRate = 700; break;
    case 15: pParsedCSD->MaxDataTransferRate = 800; break;
    default: pParsedCSD->MaxDataTransferRate = 0;   break;
  };                              

  for( ; unit; unit-- )   
    pParsedCSD->MaxDataTransferRate *= 10;              


  pParsedCSD->CardCommandClasses = (USHORT)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_CCC_BIT_SLICE, 
      SD_CSD_CCC_SLICE_SIZE);



  rblLength = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD, SD_CSD_READ_BL_LEN_BIT_SLICE, 
      SD_CSD_READ_BL_LEN_SLICE_SIZE);

  DEBUG_CHECK((rblLength < 12), (TEXT("SDCardInfoQuery - Read Block Length %d is invalid \n"),rblLength));

  // Read Block Length
  pParsedCSD->MaxReadBlockLength = 1 << rblLength;

  // Write Block Length
  pParsedCSD->MaxWriteBlockLength = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_WRITE_BL_LEN_BIT_SLICE, 
      SD_CSD_WRITE_BL_LEN_SLICE_SIZE);             

  DEBUG_CHECK((pParsedCSD->MaxWriteBlockLength < 12), (TEXT("SDCardInfoQuery - Write Block Length Length %d is invalid \n"), 
        pParsedCSD->MaxWriteBlockLength));

  pParsedCSD->MaxWriteBlockLength = 1 << pParsedCSD->MaxWriteBlockLength;



  pParsedCSD->ReadBlockPartial =  GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_READ_BL_PARTIAL_BIT_SLICE, 
      SD_CSD_READ_BL_PARTIAL_SLICE_SIZE) 
    ? TRUE:FALSE;

  pParsedCSD->WriteBlockPartial = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_WRITE_BL_PARTIAL_BIT_SLICE, 
      SD_CSD_WRITE_BL_PARTIAL_SLICE_SIZE) 
    ? TRUE:FALSE;


  // Read/Write Block Misalign
  pParsedCSD->WriteBlockMisalign = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_WRITE_BL_MISALIGN_BIT_SLICE, 
      SD_CSD_WRITE_BL_MISALIGN_SLICE_SIZE) 
    ? TRUE:FALSE;


  pParsedCSD->ReadBlockMisalign = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_READ_BL_MISALIGN_BIT_SLICE, 
      SD_CSD_READ_BL_MISALIGN_SLICE_SIZE) 
    ? TRUE:FALSE;



  // DSR Implemented
  pParsedCSD->DSRImplemented = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_DSR_IMP_BIT_SLICE, 
      SD_CSD_DSR_IMP_SLICE_SIZE) 
    ? TRUE:FALSE;

  // Write Protect Group Enabled
  pParsedCSD->WPGroupEnable = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_WP_GRP_ENABLE_BIT_SLICE, 
      SD_CSD_WP_GRP_ENABLE_SLICE_SIZE) 
    ? TRUE:FALSE;



  // Copy Flag
  pParsedCSD->CopyFlag = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_COPY_FLAG_BIT_SLICE, 
      SD_CSD_COPY_FLAG_SLICE_SIZE) 
    ? TRUE:FALSE;

  // Permanent Write Protect
  pParsedCSD->PermanentWP = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_PERM_WR_PROT_BIT_SLICE, 
      SD_CSD_PERM_WR_PROT_SLICE_SIZE) 
    ? TRUE:FALSE;


  // Temporary Write Protect
  pParsedCSD->TemporaryWP = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_TEMP_WR_PROT_BIT_SLICE, 
      SD_CSD_TEMP_WR_PROT_SLICE_SIZE) 
    ? TRUE:FALSE;

  // Calculate the device size as per SD Spec
  cSize =  GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_CSIZE_BIT_SLICE, 
      SD_CSD_CSIZE_SLICE_SIZE);



  cSizeMult = GET_BIT_SLICE_FROM_CSD(pCSD,
      SD_CSD_CSIZE_MULT_BIT_SLICE, 
      SD_CSD_CSIZE_MULT_SLICE_SIZE); 

  DEBUG_CHECK((cSizeMult < 8), (TEXT("SDCardInfoQuery - C_SIZE %d is invalid \n"),cSizeMult));

  // Perform actual device size calculation
  pParsedCSD->DeviceSize = pParsedCSD->MaxReadBlockLength * ((cSize+1) * (1<<(cSizeMult+2)));
  m_SDCardInfo.SDMMCInformation.ullDeviceSize = pParsedCSD->DeviceSize;

  // VDD Read Current Minimum
  pParsedCSD->VDDReadCurrentMin = (USHORT)GET_BIT_SLICE_FROM_CSD(pCSD, SD_CSD_R_CURR_MIN_BIT_SLICE, 
      SD_CSD_R_CURR_MIN_SLICE_SIZE);

  switch( pParsedCSD->VDDReadCurrentMin ) {
    case 0:  pParsedCSD->VDDReadCurrentMin = 1;   break;
    case 1:  pParsedCSD->VDDReadCurrentMin = 1;   break;
    case 2:  pParsedCSD->VDDReadCurrentMin = 5;   break;
    case 3:  pParsedCSD->VDDReadCurrentMin = 10;  break;
    case 4:  pParsedCSD->VDDReadCurrentMin = 25;  break;
    case 5:  pParsedCSD->VDDReadCurrentMin = 35;  break;
    case 6:  pParsedCSD->VDDReadCurrentMin = 60;  break;
    case 7:  pParsedCSD->VDDReadCurrentMin = 100; break;
    default: pParsedCSD->VDDReadCurrentMin = 0;   break;
  }


  // VDD Write Current Minimum
  pParsedCSD->VDDWriteCurrentMin = (USHORT)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_W_CURR_MIN_BIT_SLICE, 
      SD_CSD_W_CURR_MIN_SLICE_SIZE);

  switch( pParsedCSD->VDDWriteCurrentMin ) {
    case 0:  pParsedCSD->VDDWriteCurrentMin = 1;   break;
    case 1:  pParsedCSD->VDDWriteCurrentMin = 1;   break;
    case 2:  pParsedCSD->VDDWriteCurrentMin = 5;   break;
    case 3:  pParsedCSD->VDDWriteCurrentMin = 10;  break;
    case 4:  pParsedCSD->VDDWriteCurrentMin = 25;  break;
    case 5:  pParsedCSD->VDDWriteCurrentMin = 35;  break;
    case 6:  pParsedCSD->VDDWriteCurrentMin = 60;  break;
    case 7:  pParsedCSD->VDDWriteCurrentMin = 100; break;
    default: pParsedCSD->VDDWriteCurrentMin = 0;   break;
  }


  // VDD Read Current Maximum
  pParsedCSD->VDDReadCurrentMax = (USHORT)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_R_CURR_MAX_BIT_SLICE, 
      SD_CSD_R_CURR_MAX_SLICE_SIZE);

  switch( pParsedCSD->VDDReadCurrentMax ) {
    case 0:  pParsedCSD->VDDReadCurrentMax = 1;   break;
    case 1:  pParsedCSD->VDDReadCurrentMax = 5;   break;
    case 2:  pParsedCSD->VDDReadCurrentMax = 10;  break;
    case 3:  pParsedCSD->VDDReadCurrentMax = 25;  break;
    case 4:  pParsedCSD->VDDReadCurrentMax = 35;  break;
    case 5:  pParsedCSD->VDDReadCurrentMax = 45;  break;
    case 6:  pParsedCSD->VDDReadCurrentMax = 80;  break;
    case 7:  pParsedCSD->VDDReadCurrentMax = 200; break;
    default: pParsedCSD->VDDReadCurrentMax = 0;   break;
  }


  // VDD Write Current Maximum
  pParsedCSD->VDDWriteCurrentMax = (USHORT)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_W_CURR_MAX_BIT_SLICE, 
      SD_CSD_W_CURR_MAX_SLICE_SIZE);

  switch( pParsedCSD->VDDWriteCurrentMax ) {
    case 0:  pParsedCSD->VDDWriteCurrentMax = 1;   break;
    case 1:  pParsedCSD->VDDWriteCurrentMax = 5;   break;
    case 2:  pParsedCSD->VDDWriteCurrentMax = 10;  break;
    case 3:  pParsedCSD->VDDWriteCurrentMax = 25;  break;
    case 4:  pParsedCSD->VDDWriteCurrentMax = 35;  break;
    case 5:  pParsedCSD->VDDWriteCurrentMax = 45;  break;
    case 6:  pParsedCSD->VDDWriteCurrentMax = 80;  break;
    case 7:  pParsedCSD->VDDWriteCurrentMax = 200; break;
    default: pParsedCSD->VDDWriteCurrentMax = 0;   break;
  }


  pParsedCSD->WriteSpeedFactor = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_R2W_FACTOR_BIT_SLICE, 
      SD_CSD_R2W_FACTOR_SLICE_SIZE);

  // For CSD Version 2.0 above is wrong the following code correct them.
  if (Device_SD_Memory == m_DeviceType && pParsedCSD->CSDVersion == SD_CSD_VERSION_CODE_2_0 ) { 
    // SD Physical Layer Spec(2.0) 5.3.3
    ASSERT(pParsedCSD->MaxReadBlockLength==0x200);
    ASSERT(pParsedCSD->MaxWriteBlockLength==0x200);
    // THis field no long exist in SD Memory 2.0 So we made them up.
    pParsedCSD->VDDReadCurrentMin = 0;
    pParsedCSD->VDDWriteCurrentMin = 0;
    pParsedCSD->VDDReadCurrentMax = 200;
    pParsedCSD->VDDWriteCurrentMax = 200 ;
    // C_SIZE is different from 1.0.
    m_SDCardInfo.SDMMCInformation.ullDeviceSize = (ULONGLONG)GET_BIT_SLICE_FROM_CSD(pCSD, SD_CSD20_CSIZE_BIT_SLICE,  SD_CSD20_CSIZE_SLICE_SIZE)
      *0x200*0x400; 
    // We had no choic but provide low portion of value for BC. The Full value can get from Card Extention function.
    pParsedCSD->DeviceSize = (ULONG)(m_SDCardInfo.SDMMCInformation.ullDeviceSize/0x200); // return as block size.
  }


  pParsedCSD->WriteSpeedFactor = 1 << pParsedCSD->WriteSpeedFactor;


  fileFormatGroup = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_FILE_GROUP_BIT_SLICE, 
      SD_CSD_FILE_GROUP_SLICE_SIZE);

  fileFormat  = (UCHAR)GET_BIT_SLICE_FROM_CSD(pCSD,SD_CSD_FILE_FORMAT_BIT_SLICE, 
      SD_CSD_FILE_FORMAT_SLICE_SIZE);

  if( fileFormatGroup == 0 ) {
    switch( fileFormat ) {
      case 0:  pParsedCSD->FileSystem = SD_FS_FAT_PARTITION_TABLE;    break;
      case 1:  pParsedCSD->FileSystem = SD_FS_FAT_NO_PARTITION_TABLE; break;
      case 2:  pParsedCSD->FileSystem = SD_FS_UNIVERSAL;              break;
      default: pParsedCSD->FileSystem = SD_FS_OTHER;                  break;
    }
  } else {
    pParsedCSD->FileSystem = SD_FS_OTHER;
  }

  // For MMC cards the WP Group Size is now 5 bits rather than 7, Erase sector size 
  // is calculated from 2 5bit fields. Erase block enable does not exist for MMC cards.
  if( m_DeviceType == Device_MMC ) {

    UCHAR eraseGroupSize, eraseGroupMult;

    // Set EraseBlockEnable to FALSE
    pParsedCSD->EraseBlockEnable = FALSE;

    // Calculate Erase Sector Size from the Erase Group Size and

⌨️ 快捷键说明

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