📄 sdbusrequest.cpp
字号:
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;
#ifdef SD_SPEC_20
/*************************************************************************/
/****** Date : 07.05.04 ******/
/****** Developer : HS.JANG ******/
/****** Description : Block length of SDHC must be 512 byte. ******/
/*************************************************************************/
if (g_bIsSupportSDHC)
pParsedCSD->MaxReadBlockLength = 512;
/*************************************************************************/
#endif
// 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);
#ifdef SD_SPEC_20
/*************************************************************************/
/****** Date : 07.05.04 ******/
/****** Developer : HS.JANG ******/
/****** Description : CSD register of SDCard that support SDHC ******/
/****** is differnt from other one. ******/
/*************************************************************************/
if (g_bIsSupportSDHC)
{
cSize = GET_BIT_SLICE_FROM_CSD(pCSD,
48,
22);
}
/*************************************************************************/
#endif
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)));
#ifdef SD_SPEC_20
/*************************************************************************/
/****** Date : 07.05.04 ******/
/****** Developer : HS.JANG ******/
/****** Description : CSD register of SDCard that support SDHC ******/
/****** is differnt from other one. ******/
/*************************************************************************/
if (g_bIsSupportSDHC)
{
pParsedCSD->DeviceSize = (cSize + 1) * 1024;
}
/*************************************************************************/
#endif
// 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);
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(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -