Skip to content

Commit 527f934

Browse files
authored
Merge pull request #20 from J-Twin/master
Add support for Transcend cards
2 parents 2de4f03 + 2daa813 commit 527f934

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)