@@ -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