FreeCalypso > hg > freecalypso-tools
comparison loadtools/flprotreg.c @ 713:cf7bd5e705ed
fc-loadtool: flash compal-imei command implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 05 Jun 2020 07:54:33 +0000 |
parents | a167d7b376b7 |
children |
comparison
equal
deleted
inserted
replaced
712:a167d7b376b7 | 713:cf7bd5e705ed |
---|---|
35 data[3], data[4]); | 35 data[3], data[4]); |
36 printf("User words: %04X %04X %04X %04X\n", data[5], data[6], data[7], | 36 printf("User words: %04X %04X %04X %04X\n", data[5], data[6], data[7], |
37 data[8]); | 37 data[8]); |
38 return(0); | 38 return(0); |
39 } | 39 } |
40 | |
41 static int | |
42 compute_cd(digits) | |
43 u_char *digits; | |
44 { | |
45 int i, dig, sum; | |
46 | |
47 sum = 0; | |
48 for (i = 0; i < 14; i++) { | |
49 dig = digits[i]; | |
50 if (i & 1) { | |
51 dig *= 2; | |
52 if (dig > 9) | |
53 dig -= 9; | |
54 } | |
55 sum += dig; | |
56 } | |
57 dig = sum % 10; | |
58 if (dig) | |
59 dig = 10 - dig; | |
60 return dig; | |
61 } | |
62 | |
63 static void | |
64 format_imei(digits, strout) | |
65 u_char *digits; | |
66 char *strout; | |
67 { | |
68 int i; | |
69 char *dp; | |
70 | |
71 dp = strout; | |
72 for (i = 0; i < 15; i++) { | |
73 if (i == 8 || i == 14) | |
74 *dp++ = '-'; | |
75 *dp++ = digits[i] + '0'; | |
76 } | |
77 *dp = '\0'; | |
78 } | |
79 | |
80 flashcmd_compal_imei(argc, argv, bank) | |
81 char **argv; | |
82 { | |
83 struct flash_bank_info *bi; | |
84 uint16_t data[9]; | |
85 u_char nibbles[16], *dp; | |
86 char imei_str[18]; | |
87 int rc, i, j; | |
88 FILE *of; | |
89 | |
90 if (argc > 3) { | |
91 fprintf(stderr, "error: too many arguments\n"); | |
92 return(-1); | |
93 } | |
94 if (flash_detect(bank, 0) < 0) | |
95 return(-1); | |
96 bi = flash_bank_info + bank; | |
97 rc = bi->ops->read_prot_reg(bi, data); | |
98 if (rc) | |
99 return(rc); | |
100 dp = nibbles; | |
101 for (i = 0; i < 4; i++) { | |
102 rc = data[i + 5]; | |
103 for (j = 0; j < 4; j++) { | |
104 *dp++ = rc & 0xF; | |
105 rc >>= 4; | |
106 } | |
107 } | |
108 for (i = 1; i < 16; i++) { | |
109 if (nibbles[i] > 9) { | |
110 bad_imei: fprintf(stderr, "No Compal IMEI found\n"); | |
111 return(-1); | |
112 } | |
113 } | |
114 if (compute_cd(nibbles+1) != nibbles[15]) | |
115 goto bad_imei; | |
116 format_imei(nibbles+1, imei_str); | |
117 puts(imei_str); | |
118 if (argc < 3) | |
119 return(0); | |
120 of = fopen(argv[2], "w"); | |
121 if (!of) { | |
122 perror(argv[2]); | |
123 return(-1); | |
124 } | |
125 fprintf(of, "%s\n", imei_str); | |
126 fclose(of); | |
127 printf("Saved to %s\n", argv[2]); | |
128 return(0); | |
129 } |