in common/recipes-lib/obmc-mmc/files/lsmmc.c [617:1238]
void print_sd_csd(struct config *config, char *csd)
{
unsigned int csd_structure;
unsigned int taac_timevalue;
unsigned int taac_timeunit;
unsigned int nsac;
unsigned int tran_speed_timevalue;
unsigned int tran_speed_transferrateunit;
unsigned int ccc;
unsigned int read_bl_len;
unsigned int read_bl_partial;
unsigned int write_blk_misalign;
unsigned int read_blk_misalign;
unsigned int dsr_imp;
unsigned int c_size;
unsigned int vdd_r_curr_min;
unsigned int vdd_r_curr_max;
unsigned int vdd_w_curr_min;
unsigned int vdd_w_curr_max;
unsigned int c_size_mult;
unsigned int erase_blk_en;
unsigned int sector_size;
unsigned int wp_grp_size;
unsigned int wp_grp_enable;
unsigned int r2w_factor;
unsigned int write_bl_len;
unsigned int write_bl_partial;
unsigned int file_format_grp;
unsigned int copy;
unsigned int perm_write_protect;
unsigned int tmp_write_protect;
unsigned int file_format;
unsigned int crc;
unsigned int taac;
unsigned int tran_speed;
parse_bin(csd, "2u", &csd_structure);
if (csd_structure == 0) {
parse_bin(csd, "2u6r1r4u3u8u1r4u3u12u4u1u1u1u1u2r12u3u3u3u3u3u"
"1u7u7u1u2r3u4u1u5r1u1u1u1u2u2r7u1r",
NULL, &taac_timevalue, &taac_timeunit, &nsac,
&tran_speed_timevalue,
&tran_speed_transferrateunit, &ccc,
&read_bl_len, &read_bl_partial,
&write_blk_misalign, &read_blk_misalign,
&dsr_imp, &c_size, &vdd_r_curr_min,
&vdd_r_curr_max, &vdd_w_curr_min,
&vdd_w_curr_max, &c_size_mult, &erase_blk_en,
§or_size, &wp_grp_size, &wp_grp_enable,
&r2w_factor, &write_bl_len, &write_bl_partial,
&file_format_grp, ©, &perm_write_protect,
&tmp_write_protect, &file_format, &crc);
} else if (csd_structure == 1) {
parse_bin(csd, "2u6r1r4u3u8u1r4u3u12u4u1u1u1u1u6r22u1r1u7u7u1u"
"2r3u4u1u5r1u1u1u1u2u2r7u1r",
NULL, &taac_timevalue, &taac_timeunit, &nsac,
&tran_speed_timevalue,
&tran_speed_transferrateunit, &ccc,
&read_bl_len, &read_bl_partial,
&write_blk_misalign, &read_blk_misalign,
&dsr_imp, &c_size, &erase_blk_en, §or_size,
&wp_grp_size, &wp_grp_enable, &r2w_factor,
&write_bl_len, &write_bl_partial,
&file_format_grp, ©, &perm_write_protect,
&tmp_write_protect, &file_format, &crc);
vdd_r_curr_min = 0;
c_size_mult = 0;
} else {
printf("Unknown CSD structure: 0x%1x\n", csd_structure);
return;
}
taac = taac_timevalue << 3 | taac_timeunit;
tran_speed = tran_speed_timevalue << 3 | tran_speed_transferrateunit;
if (config->verbose) {
float value;
unsigned long long blocks = 0;
int block_size = 0;
unsigned long long memory_capacity;
printf("======SD/CSD======\n");
printf("\tCSD_STRUCTURE: %d\n", csd_structure);
printf("\tTAAC: 0x%02x (", taac);
switch (taac_timevalue) {
case 0x0:
value = 0.0f;
break;
case 0x1:
value = 1.0f;
break;
case 0x2:
value = 1.2f;
break;
case 0x3:
value = 1.3f;
break;
case 0x4:
value = 1.5f;
break;
case 0x5:
value = 2.0f;
break;
case 0x6:
value = 2.5f;
break;
case 0x7:
value = 3.0f;
break;
case 0x8:
value = 3.5f;
break;
case 0x9:
value = 4.0f;
break;
case 0xa:
value = 4.5f;
break;
case 0xb:
value = 5.0f;
break;
case 0xc:
value = 5.5f;
break;
case 0xd:
value = 6.0f;
break;
case 0xe:
value = 7.0f;
break;
case 0xf:
value = 8.0f;
break;
default:
value = 0.0f;
break;
}
switch (taac_timeunit) {
case 0x0:
printf("%.2fns)\n", value * 1.0f);
break;
case 0x1:
printf("%.2fns)\n", value * 10.0f);
break;
case 0x2:
printf("%.2fns)\n", value * 100.0f);
break;
case 0x3:
printf("%.2fus)\n", value * 1.0f);
break;
case 0x4:
printf("%.2fus)\n", value * 10.0f);
break;
case 0x5:
printf("%.2fus)\n", value * 100.0f);
break;
case 0x6:
printf("%.2fms)\n", value * 1.0f);
break;
case 0x7:
printf("%.2fms)\n", value * 10.0f);
break;
}
if (csd_structure == 1 && taac != 0x0e)
printf("Warn: Invalid TAAC (should be 0x0e)\n");
printf("\tNSAC: %d clocks\n", nsac);
if (csd_structure == 1 && nsac != 0x00)
printf("Warn: Invalid NSAC (should be 0x00)\n");
printf("\tTRAN_SPEED: 0x%02x (", tran_speed);
switch (tran_speed_timevalue) {
case 0x0:
value = 0.0f;
break;
case 0x1:
value = 1.0f;
break;
case 0x2:
value = 1.2f;
break;
case 0x3:
value = 1.3f;
break;
case 0x4:
value = 1.5f;
break;
case 0x5:
value = 2.0f;
break;
case 0x6:
value = 2.5f;
break;
case 0x7:
value = 3.0f;
break;
case 0x8:
value = 3.5f;
break;
case 0x9:
value = 4.0f;
break;
case 0xa:
value = 4.5f;
break;
case 0xb:
value = 5.0f;
break;
case 0xc:
value = 5.5f;
break;
case 0xd:
value = 6.0f;
break;
case 0xe:
value = 7.0f;
break;
case 0xf:
value = 8.0f;
break;
default:
value = 0.0f;
break;
}
switch (tran_speed_transferrateunit) {
case 0x0:
printf("%.2fkbit/s)\n", value * 100.0f);
break;
case 0x1:
printf("%.2fMbit/s)\n", value * 1.0f);
break;
case 0x2:
printf("%.2fMbit/s)\n", value * 10.0f);
break;
case 0x3:
printf("%.2fMbit/s)\n", value * 100.0f);
break;
default:
printf("reserved)\n");
break;
}
if (csd_structure == 0 &&
(tran_speed != 0x32 && tran_speed != 0x5a))
printf("Warn: Invalid TRAN_SPEED "
"(should be 0x32 or 0x5a)\n");
if (csd_structure == 1 && tran_speed != 0x32 &&
tran_speed != 0x5a && tran_speed != 0x0b &&
tran_speed != 0x2b)
printf("Warn: Invalid TRAN_SPEED "
"(should be 0x32, 0x5a, 0x0b or 0x2b\n");
printf("\tCCC: 0x%03x (class: ", ccc);
if (ccc & 0x800)
printf("11, ");
if (ccc & 0x400)
printf("10, ");
if (ccc & 0x200)
printf("9, ");
if (ccc & 0x100)
printf("8, ");
if (ccc & 0x080)
printf("7, ");
if (ccc & 0x040)
printf("6, ");
if (ccc & 0x020)
printf("5, ");
if (ccc & 0x010)
printf("4, ");
if (ccc & 0x008)
printf("3, ");
if (ccc & 0x004)
printf("2, ");
if (ccc & 0x002)
printf("1, ");
if (ccc & 0x001)
printf("0, ");
printf(" )\n");
if (csd_structure == 0 &&
(ccc != 0x5b5 && ccc != 0x7b5 && ccc != 0x5f5))
printf("Warn: Invalid CCC (should be 0x5b5, "
"0x7b5 or 0x5f5)\n");
else if (csd_structure == 1 && ccc != 0x5b5 && ccc != 0x7b5)
printf("Warn: Invalid CCC (should be 0x5b5 or 0x7b5)\n");
printf("\tREAD_BL_LEN: 0x%01x (", read_bl_len);
switch (read_bl_len) {
case 0x9:
printf("512 bytes)\n");
break;
case 0xa:
printf("1024 bytes)\n");
break;
case 0xb:
printf("2048 bytes)\n");
break;
default:
printf("reserved bytes)\n");
break;
}
if (csd_structure == 1 && read_bl_len != 0x9)
printf("Warn: Invalid READ_BL_LEN (should be 0x9)\n");
printf("\tREAD_BL_PARTIAL: 0x%01x\n", read_bl_partial);
if (csd_structure == 0 && read_bl_partial != 0x01)
printf("Warn: Invalid READ_BL_PARTIAL (should be 0x01)\n");
else if (csd_structure == 1 && read_bl_partial != 0x00)
printf("Warn: Invalid READ_BL_PARTIAL (should be 0x00)\n");
printf("\tWRITE_BLK_MISALIGN: 0x%01x\n", write_blk_misalign);
if (csd_structure == 1 && write_blk_misalign != 0x00)
printf("Warn: Invalid WRITE_BLK_MISALIGN (should be 0x00)\n");
printf("\tREAD_BLK_MISALIGN: 0x%01x\n", read_blk_misalign);
if (csd_structure == 1 && read_blk_misalign != 0x00)
printf("Warn: Invalid READ_BLK_MISALIGN (should be 0x00)\n");
printf("\tDSR_IMP: 0x%01x\n", dsr_imp);
if (csd_structure == 0) {
int mult;
int blocknr;
int block_len;
printf("\tC_SIZE: 0x%03x\n", c_size);
printf("\tVDD_R_CURR_MIN: 0x%01x (", vdd_r_curr_min);
switch (vdd_r_curr_min) {
case 0x0:
printf("0.5mA)\n");
break;
case 0x1:
printf("1mA)\n");
break;
case 0x2:
printf("5mA)\n");
break;
case 0x3:
printf("10mA)\n");
break;
case 0x4:
printf("25mA)\n");
break;
case 0x5:
printf("35mA)\n");
break;
case 0x6:
printf("60mA)\n");
break;
case 0x7:
printf("100mA)\n");
break;
}
printf("\tVDD_R_CURR_MAX: 0x%01x (", vdd_r_curr_max);
switch (vdd_r_curr_max) {
case 0x0:
printf("1mA)\n");
break;
case 0x1:
printf("5mA)\n");
break;
case 0x2:
printf("10mA)\n");
break;
case 0x3:
printf("25mA)\n");
break;
case 0x4:
printf("35mA)\n");
break;
case 0x5:
printf("45mA)\n");
break;
case 0x6:
printf("80mA)\n");
break;
case 0x7:
printf("200mA)\n");
break;
}
printf("\tVDD_W_CURR_MIN: 0x%01x (", vdd_w_curr_min);
switch (vdd_w_curr_min) {
case 0x0:
printf("0.5mA)\n");
break;
case 0x1:
printf("1mA)\n");
break;
case 0x2:
printf("5mA)\n");
break;
case 0x3:
printf("10mA)\n");
break;
case 0x4:
printf("25mA)\n");
break;
case 0x5:
printf("35mA)\n");
break;
case 0x6:
printf("60mA)\n");
break;
case 0x7:
printf("100mA)\n");
break;
}
printf("\tVDD_W_CURR_MAX: 0x%01x (", vdd_w_curr_max);
switch (vdd_w_curr_max) {
case 0x0:
printf("1mA)\n");
break;
case 0x1:
printf("5mA)\n");
break;
case 0x2:
printf("10mA)\n");
break;
case 0x3:
printf("25mA)\n");
break;
case 0x4:
printf("35mA)\n");
break;
case 0x5:
printf("45mA)\n");
break;
case 0x6:
printf("80mA)\n");
break;
case 0x7:
printf("200mA)\n");
break;
}
printf("\tC_SIZE_MULT: 0x%01x\n", c_size_mult);
mult = 1 << (c_size_mult + 2);
blocknr = (c_size + 1) * mult;
block_len = 1 << read_bl_len;
blocks = blocknr;
block_size = block_len;
} else if (csd_structure == 1) {
printf("\tC_SIZE: 0x%06x\n", c_size);
printf("\tERASE_BLK_EN: 0x%01x\n", erase_blk_en);
if (erase_blk_en != 0x01)
printf("Warn: Invalid ERASE_BLK_EN (should be 0x01)\n");
printf("\tSECTOR_SIZE: 0x%02x (Erasable sector: %d blocks)\n",
sector_size, sector_size + 1);
if (sector_size != 0x7f)
printf("Warn: Invalid SECTOR_SIZE (should be 0x7f)\n");
printf("\tWP_GRP_SIZE: 0x%02x (Write protect group: %d blocks)\n",
wp_grp_size, wp_grp_size + 1);
if (wp_grp_size != 0x00)
printf("Warn: Invalid WP_GRP_SIZE (should be 0x00)\n");
printf("\tWP_GRP_ENABLE: 0x%01x\n", wp_grp_enable);
if (wp_grp_enable != 0x00)
printf("Warn: Invalid WP_GRP_ENABLE (should be 0x00)\n");
printf("\tR2W_FACTOR: 0x%01x (Write %d times read)\n",
r2w_factor, r2w_factor);
if (r2w_factor != 0x02)
printf("Warn: Invalid R2W_FACTOR (should be 0x02)\n");
printf("\tWRITE_BL_LEN: 0x%01x (", write_bl_len);
switch (write_bl_len) {
case 9:
printf("512 bytes)\n");
break;
case 10:
printf("1024 bytes)\n");
break;
case 11:
printf("2048 bytes)\n");
break;
default:
printf("reserved)\n");
break;
}
if (write_bl_len != 0x09)
printf("Warn: Invalid WRITE_BL_LEN (should be 0x09)\n");
printf("\tWRITE_BL_PARTIAL: 0x%01x\n", write_bl_partial);
if (write_bl_partial != 0x00)
printf("Warn: Invalid WRITE_BL_PARTIAL (should be 0x00)\n");
printf("\tFILE_FORMAT_GRP: 0x%01x\n", file_format_grp);
if (file_format_grp != 0x00)
printf("Warn: Invalid FILE_FORMAT_GRP (should be 0x00)\n");
printf("\tCOPY: 0x%01x\n", copy);
printf("\tPERM_WRITE_PROTECT: 0x%01x\n",
perm_write_protect);
printf("\tTMP_WRITE_PROTECT: 0x%01x\n",
tmp_write_protect);
printf("\tFILE_FORMAT: 0x%01x (",
file_format);
if (file_format_grp == 1) {
printf("reserved)\n");
} else {
switch (file_format) {
case 0:
printf("partition table)\n");
break;
case 1:
printf("no partition table)\n");
break;
case 2:
printf("Universal File Format)\n");
break;
case 3:
printf("Others/unknown)\n");
break;
}
}
if (file_format != 0x00)
printf("Warn: Invalid FILE_FORMAT (should be 0x00)\n");
printf("\tCRC: 0x%01x\n", crc);
memory_capacity = (c_size + 1) * 512ull * 1024ull;
block_size = 512;
blocks = memory_capacity / block_size;
}
memory_capacity = blocks * block_size;
printf("\tCAPACITY: ");
if (memory_capacity / (1024ull * 1024ull * 1024ull) > 0)
printf("%.2fGbyte",
memory_capacity / (1024.0 * 1024.0 * 1024.0));
else if (memory_capacity / (1024ull * 1024ull) > 0)
printf("%.2fMbyte", memory_capacity / (1024.0 * 1024.0));
else if (memory_capacity / (1024ull) > 0)
printf("%.2fKbyte", memory_capacity / (1024.0));
else
printf("%.2fbyte", memory_capacity * 1.0);
printf(" (%lld bytes, %lld sectors, %d bytes each)\n",
memory_capacity, blocks, block_size);
} else {
unsigned long long blocks = 0;
int block_size = 0;
unsigned long long memory_capacity;
printf("card classes: ");
if (ccc & 0x800)
printf("11 extension, ");
if (ccc & 0x400)
printf("10 switch, ");
if (ccc & 0x200)
printf("9 I/O mode, ");
if (ccc & 0x100)
printf("8 application specific, ");
if (ccc & 0x080)
printf("7 lock card, ");
if (ccc & 0x040)
printf("6 write protection, ");
if (ccc & 0x020)
printf("5 erase, ");
if (ccc & 0x010)
printf("4 block write, ");
if (ccc & 0x008)
printf("3 reserved, ");
if (ccc & 0x004)
printf("2 block read, ");
if (ccc & 0x002)
printf("1 reserved, ");
if (ccc & 0x001)
printf("0 basic, ");
printf("\b\b\n");
if (csd_structure == 0) {
int mult;
int blocknr;
int block_len;
mult = 1 << (c_size_mult + 2);
blocknr = (c_size + 1) * mult;
block_len = 1 << read_bl_len;
blocks = blocknr;
block_size = block_len;
} else if (csd_structure == 1) {
memory_capacity = (c_size + 1) * 512ull * 1024ull;
block_size = 512;
blocks = memory_capacity / block_size;
}
memory_capacity = blocks * block_size;
printf("capacity: ");
if (memory_capacity / (1024ull * 1024ull * 1024ull) > 0)
printf("%.2fGbyte",
memory_capacity / (1024.0 * 1024.0 * 1024.0));
else if (memory_capacity / (1024ull * 1024ull) > 0)
printf("%.2fMbyte", memory_capacity / (1024.0 * 1024.0));
else if (memory_capacity / (1024ull) > 0)
printf("%.2fKbyte", memory_capacity / (1024.0));
else
printf("%.2fbyte", memory_capacity * 1.0);
printf(" (%lld bytes, %lld sectors, %d bytes each)\n",
memory_capacity, blocks, block_size);
}
}