Skip to content

Commit 2daa813

Browse files
authored
Add support for Transcend cards
Vendor provides code in Github but their code was not used for this patch. Compiled and tested using a brand new 230I 32GB card on my T6 ARM board: sudo ./sdmon /dev/mmcblk0 { { "version": "abc222", "date": "2024-01-04T21:38:28.000Z", "device":"/dev/mmcblk0", "addTime": "false", "signature":"0x54 0x72", "Transcend":"true", "Secured mode": 0, "Bus width": 4 bits "Speed mode": Class 10 "UHS speed grade": 30MB/s and higher "New bad blocks cnt": 0x00, "Runtime spare blocks cnt": 0x33, "Abnormal power loss": 0, "Minimum erase cnt": 0, "Maximum erase cnt": 1, "Average erase cnt": 0, "Remaining card life": 100%, "Total write CRC cnt": 0, "Power cycle cnt": 0, "NAND flash ID": 0x45,0x3c,0x98,0xb3,0x76,0x6b, "IC": SM2707E, "fw version": T0408 , "success":true } Cards below 8GB have different offsets for their data so they will not work properly.
1 parent 2de4f03 commit 2daa813

1 file changed

Lines changed: 69 additions & 0 deletions

File tree

src/sdmon.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,75 @@ int main(int argc, const char *argv[]) {
252252
exit(0);
253253
}
254254

255+
//try transcend argument
256+
cmd56_arg = 0x110005f9;
257+
ret = CMD56_data_in(fd, cmd56_arg, data_in);
258+
// we assume success when the call was successful AND the signature is not 0xff 0xff
259+
if (ret == 0 && !((data_in[0] == 0xff && data_in[1] == 0xff) || (data_in[0] == 0x00 && data_in[1] == 0x00))) {
260+
printf("\"signature\":\"0x%x 0x%x\",\n", data_in[0], data_in[1]);
261+
if (data_in[0] == 0x54 && data_in[1] == 0x72) {
262+
printf("\"Transcend\":\"true\",\n");
263+
printf("\"Secured mode\": %d,\n", (int)(data_in[11]));
264+
switch (data_in[16])
265+
{
266+
case 0x00:
267+
printf("\"Bus width\": 1 bit\n");
268+
break;
269+
case 0x10:
270+
printf("\"Bus width\": 4 bits\n");
271+
break;
272+
}
273+
switch (data_in[18])
274+
{
275+
case 0x00:
276+
printf("\"Speed mode\": Class 0\n");
277+
break;
278+
case 0x01:
279+
printf("\"Speed mode\": Class 2\n");
280+
break;
281+
case 0x02:
282+
printf("\"Speed mode\": Class 4\n");
283+
break;
284+
case 0x03:
285+
printf("\"Speed mode\": Class 6\n");
286+
break;
287+
case 0x04:
288+
printf("\"Speed mode\": Class 10\n");
289+
break;
290+
}
291+
switch (data_in[19])
292+
{
293+
case 0x00:
294+
printf("\"UHS speed grade\": Less than 10MB/s\n");
295+
break;
296+
case 0x01:
297+
printf("\"UHS speed grade\": 10MB/s and higher\n");
298+
break;
299+
case 0x03:
300+
printf("\"UHS speed grade\": 30MB/s and higher\n");
301+
break;
302+
}
303+
printf("\"New bad blocks cnt\": 0x%02x,\n", data_in[26]);
304+
printf("\"Runtime spare blocks cnt\": 0x%02x,\n", data_in[27]);
305+
printf("\"Abnormal power loss\": %ld,\n", (long)((data_in[31] << 24) + (data_in[30] << 16) + (data_in[29] << 8) + data_in[28]));
306+
printf("\"Minimum erase cnt\": %d,\n", (long)((data_in[35] << 24) + (data_in[34] << 16) + (data_in[33] << 8) + data_in[32]));
307+
printf("\"Maximum erase cnt\": %d,\n", (long)((data_in[39]) + (data_in[38]) + (data_in[37]) + data_in[36]));
308+
printf("\"Average erase cnt\": %d,\n", (long)((data_in[47] << 24) + (data_in[46] << 16) + (data_in[45] << 8) + data_in[44]));
309+
310+
printf("\"Remaining card life\": %d%,\n", (int)(data_in[70]));
311+
printf("\"Total write CRC cnt\": %d,\n", bytes_to_int(data_in[72], data_in[73], data_in[74], data_in[75]));
312+
printf("\"Power cycle cnt\": %d,\n", bytes_to_int(0, 0, data_in[76], data_in[77]));
313+
314+
printf("\"NAND flash ID\": 0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,\n", data_in[80], data_in[81], data_in[82], data_in[83], data_in[84], data_in[85]);
315+
printf("\"IC\": %c%c%c%c%c%c%c%c,\n", data_in[87], data_in[88], data_in[89], data_in[90], data_in[91], data_in[92], data_in[93], data_in[94]);
316+
printf("\"fw version\": %c%c%c%c%c%c,\n", data_in[128], data_in[129], data_in[130], data_in[131], data_in[132], data_in[133]);
317+
318+
close(fd);
319+
printf("\"success\":true\n}\n");
320+
exit(0);
321+
}
322+
}
323+
255324
// try micron argument
256325
cmd56_arg = 0x110005fb;
257326
ret = CMD56_data_in(fd, cmd56_arg, data_in);

0 commit comments

Comments
 (0)