diff options
-rw-r--r-- | utils/nwztools/scsitools/scsitool.c | 118 |
1 files changed, 66 insertions, 52 deletions
diff --git a/utils/nwztools/scsitools/scsitool.c b/utils/nwztools/scsitools/scsitool.c index 3bff9b90fd..02fa2efe6a 100644 --- a/utils/nwztools/scsitools/scsitool.c +++ b/utils/nwztools/scsitools/scsitool.c | |||
@@ -46,20 +46,10 @@ | |||
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | bool g_debug = false; | 48 | bool g_debug = false; |
49 | bool g_force = false; | 49 | const char *g_force_series = NULL; |
50 | char *g_out_prefix = NULL; | 50 | char *g_out_prefix = NULL; |
51 | int g_dev_fd = 0; | 51 | int g_dev_fd = 0; |
52 | 52 | ||
53 | #define let_the_force_flow(x) do { if(!g_force) return x; } while(0) | ||
54 | #define continue_the_force(x) if(x) let_the_force_flow(x) | ||
55 | |||
56 | #define check_field(v_exp, v_have, str_ok, str_bad) \ | ||
57 | if((v_exp) != (v_have)) \ | ||
58 | { cprintf(RED, str_bad); let_the_force_flow(__LINE__); } \ | ||
59 | else { cprintf(RED, str_ok); } | ||
60 | |||
61 | #define errorf(...) do { cprintf(GREY, __VA_ARGS__); return __LINE__; } while(0) | ||
62 | |||
63 | #if 0 | 53 | #if 0 |
64 | void *buffer_alloc(int sz) | 54 | void *buffer_alloc(int sz) |
65 | { | 55 | { |
@@ -362,42 +352,66 @@ int get_dnk_prop(int argc, char **argv) | |||
362 | 352 | ||
363 | int get_model_and_series(int *model_index, int *series_index) | 353 | int get_model_and_series(int *model_index, int *series_index) |
364 | { | 354 | { |
365 | /* we need to get the model ID: code stolen from get_dnk_prop */ | 355 | /* if the user forced the series, simply match by name, special for '?' which |
366 | uint8_t mid_buf[4]; | 356 | * prompts the list */ |
367 | int mid_buf_size = sizeof(mid_buf); | 357 | if(g_force_series) |
368 | int ret = do_dnk_cmd(true, 0x23, 9, 0, mid_buf, &mid_buf_size); | 358 | { |
369 | if(ret) | 359 | cprintf(RED, "User forced series, auto-detection disabled\n"); |
370 | { | 360 | *series_index = -1; |
371 | printf("Cannot get model ID from device: %d\n", ret); | 361 | *model_index = -1; |
372 | return 2; | 362 | for(int i = 0; i < NWZ_SERIES_COUNT; i++) |
363 | if(strcmp(nwz_series[i].codename, g_force_series) == 0) | ||
364 | *series_index = i; | ||
365 | /* display list on error */ | ||
366 | if(*series_index == -1) | ||
367 | { | ||
368 | if(strcmp(g_force_series, "?") != 0) | ||
369 | cprintf(GREY, "Unrecognized series '%s'\n", g_force_series); | ||
370 | cprintf(OFF, "Series list:\n"); | ||
371 | for(int i = 0; i < NWZ_SERIES_COUNT; i++) | ||
372 | printf(" %-10s %s\n", nwz_series[i].codename, nwz_series[i].name); | ||
373 | return -1; | ||
374 | } | ||
373 | } | 375 | } |
374 | if(mid_buf_size != sizeof(mid_buf)) | 376 | else |
375 | { | 377 | { |
376 | printf("Cannot get model ID from device: device didn't send the expected amount of data\n"); | 378 | /* we need to get the model ID: code stolen from get_dnk_prop */ |
377 | return 3; | 379 | uint8_t mid_buf[4]; |
380 | int mid_buf_size = sizeof(mid_buf); | ||
381 | int ret = do_dnk_cmd(true, 0x23, 9, 0, mid_buf, &mid_buf_size); | ||
382 | if(ret) | ||
383 | { | ||
384 | cprintf(RED, "Cannot get model ID from device: %d\n", ret); | ||
385 | return 2; | ||
386 | } | ||
387 | if(mid_buf_size != sizeof(mid_buf)) | ||
388 | { | ||
389 | cprintf(RED, "Cannot get model ID from device: device didn't send the expected amount of data\n"); | ||
390 | return 3; | ||
391 | } | ||
392 | unsigned long model_id = get_big_endian32(&mid_buf); | ||
393 | *model_index = -1; | ||
394 | for(int i = 0; i < NWZ_MODEL_COUNT; i++) | ||
395 | if(nwz_model[i].mid == model_id) | ||
396 | *model_index = i; | ||
397 | if(*model_index == -1) | ||
398 | { | ||
399 | cprintf(RED, "Your device is not supported. Please contact developers.\n"); | ||
400 | return 3; | ||
401 | } | ||
402 | *series_index = -1; | ||
403 | for(int i = 0; i < NWZ_SERIES_COUNT; i++) | ||
404 | for(int j = 0; j < nwz_series[i].mid_count; j++) | ||
405 | if(nwz_series[i].mid[j] == model_id) | ||
406 | *series_index = i; | ||
407 | if(*series_index == -1) | ||
408 | { | ||
409 | printf("Your device is not supported. Please contact developers.\n"); | ||
410 | return 3; | ||
411 | } | ||
378 | } | 412 | } |
379 | unsigned long model_id = get_big_endian32(&mid_buf); | ||
380 | *model_index = -1; | ||
381 | for(int i = 0; i < NWZ_MODEL_COUNT; i++) | ||
382 | if(nwz_model[i].mid == model_id) | ||
383 | *model_index = i; | ||
384 | cprintf_field("Model: ", "%s\n", *model_index == -1 ? "Unknown" : nwz_model[*model_index].name); | 413 | cprintf_field("Model: ", "%s\n", *model_index == -1 ? "Unknown" : nwz_model[*model_index].name); |
385 | if(*model_index == -1) | ||
386 | { | ||
387 | printf("Your device is not supported. Please contact developers.\n"); | ||
388 | return 3; | ||
389 | } | ||
390 | *series_index = -1; | ||
391 | for(int i = 0; i < NWZ_SERIES_COUNT; i++) | ||
392 | for(int j = 0; j < nwz_series[i].mid_count; j++) | ||
393 | if(nwz_series[i].mid[j] == model_id) | ||
394 | *series_index = i; | ||
395 | cprintf_field("Series: ", "%s\n", *series_index == -1 ? "Unknown" : nwz_series[*series_index].name); | 414 | cprintf_field("Series: ", "%s\n", *series_index == -1 ? "Unknown" : nwz_series[*series_index].name); |
396 | if(*series_index == -1) | ||
397 | { | ||
398 | printf("Your device is not supported. Please contact developers.\n"); | ||
399 | return 3; | ||
400 | } | ||
401 | return 0; | 415 | return 0; |
402 | } | 416 | } |
403 | 417 | ||
@@ -847,11 +861,11 @@ static void usage(void) | |||
847 | { | 861 | { |
848 | printf("Usage: scsitool [options] <dev> <command> [arguments]\n"); | 862 | printf("Usage: scsitool [options] <dev> <command> [arguments]\n"); |
849 | printf("Options:\n"); | 863 | printf("Options:\n"); |
850 | printf(" -o <prefix>\tSet output prefix\n"); | 864 | printf(" -o <prefix> Set output prefix\n"); |
851 | printf(" -f/--force\tForce to continue on errors\n"); | 865 | printf(" -?/--help Display this message\n"); |
852 | printf(" -?/--help\tDisplay this message\n"); | 866 | printf(" -d/--debug Display debug messages\n"); |
853 | printf(" -d/--debug\tDisplay debug messages\n"); | 867 | printf(" -c/--no-color Disable color output\n"); |
854 | printf(" -c/--no-color\tDisable color output\n"); | 868 | printf(" -s/--series <name> Force series (disable auto-detection, use '?' for the list)\n"); |
855 | printf("Commands:\n"); | 869 | printf("Commands:\n"); |
856 | for(unsigned i = 0; i < NR_CMDS; i++) | 870 | for(unsigned i = 0; i < NR_CMDS; i++) |
857 | printf(" %s\t%s\n", cmd_list[i].name, cmd_list[i].desc); | 871 | printf(" %s\t%s\n", cmd_list[i].name, cmd_list[i].desc); |
@@ -867,11 +881,11 @@ int main(int argc, char **argv) | |||
867 | {"help", no_argument, 0, '?'}, | 881 | {"help", no_argument, 0, '?'}, |
868 | {"debug", no_argument, 0, 'd'}, | 882 | {"debug", no_argument, 0, 'd'}, |
869 | {"no-color", no_argument, 0, 'c'}, | 883 | {"no-color", no_argument, 0, 'c'}, |
870 | {"force", no_argument, 0, 'f'}, | 884 | {"series", required_argument, 0, 's'}, |
871 | {0, 0, 0, 0} | 885 | {0, 0, 0, 0} |
872 | }; | 886 | }; |
873 | 887 | ||
874 | int c = getopt_long(argc, argv, "?dcfo:", long_options, NULL); | 888 | int c = getopt_long(argc, argv, "?dcfo:s:", long_options, NULL); |
875 | if(c == -1) | 889 | if(c == -1) |
876 | break; | 890 | break; |
877 | switch(c) | 891 | switch(c) |
@@ -884,15 +898,15 @@ int main(int argc, char **argv) | |||
884 | case 'd': | 898 | case 'd': |
885 | g_debug = true; | 899 | g_debug = true; |
886 | break; | 900 | break; |
887 | case 'f': | ||
888 | g_force = true; | ||
889 | break; | ||
890 | case '?': | 901 | case '?': |
891 | usage(); | 902 | usage(); |
892 | break; | 903 | break; |
893 | case 'o': | 904 | case 'o': |
894 | g_out_prefix = optarg; | 905 | g_out_prefix = optarg; |
895 | break; | 906 | break; |
907 | case 's': | ||
908 | g_force_series = optarg; | ||
909 | break; | ||
896 | default: | 910 | default: |
897 | abort(); | 911 | abort(); |
898 | } | 912 | } |