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 }