annotate loadtools/flashid.c @ 921:74d284add54d

fc-fsio: guard against bogus readdir results from the target If the FFS being operated on contains SE K2x0 extended filenames, readdir will return strings that are bad for printing. We need to guard against this possibility, and also against possible other bogosity that could be sent by other alien firmwares.
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 31 Dec 2022 22:55:23 +0000
parents 54a0bc149d9c
children 7c18eac91457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Flash device detection code lives here
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <sys/types.h>
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <stdio.h>
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdint.h>
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <stdlib.h>
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include "flash.h"
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 extern struct flash_device flashdev_28F160C3T;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 extern struct flash_device flashdev_28F320C3T;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 extern struct flash_device flashdev_28F640C3T;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 extern struct flash_device flashdev_28F640C3B;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 extern struct flash_device flashdev_28F640W30T;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 extern struct flash_device flashdev_28F640W30B;
553
3886a8a40809 fc-loadtool: added support for old Am29DL640G flash chip
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
17 extern struct flash_device flashdev_Am29DL640G;
559
f229efbfd581 fc-loadtool: added support for S29PL032J/S71PL032J flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 553
diff changeset
18 extern struct flash_device flashdev_PL032J;
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 extern struct flash_device flashdev_PL129J;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 extern struct flash_device flashdev_PL129N;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 extern struct flash_device flashdev_K5A32xx_T;
523
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
22 extern struct flash_device flashdev_K5L33xx_A;
916
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
23 extern struct flash_device flashdev_K5L29xx_A;
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 extern int flash_global_config;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 extern struct flash_bank_info flash_bank_info[2];
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 run_cfi_check(bi, table)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 struct cfi_check *table;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 struct cfi_check *tp;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 uint16_t rdword;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 for (tp = table; tp->offset >= 0; tp++) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 if (do_r16(bi->base_addr + (tp->offset << 1), &rdword) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 if (rdword != tp->expect_val)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 return(1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 try_device(bi, dev)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 struct flash_device *dev;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 int rc;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 printf("Appears to be %s or compatible, checking CFI\n", dev->name);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 if (do_w16(bi->base_addr + 0xAA, 0x98)) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 fprintf(stderr, "unexpected response to w16 - aborting\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 rc = run_cfi_check(bi, dev->cfi_table);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 if (!rc) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 fprintf(stderr, "Error: CFI mismatch, unsafe to continue\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 printf("Confirmed %s or compatible\n", dev->name);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 bi->device = dev;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 static
916
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
70 try_device_amdreset(bi, dev)
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
71 struct flash_bank_info *bi;
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
72 struct flash_device *dev;
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
73 {
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
74 int rc;
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
75
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
76 printf("Appears to be %s or compatible, checking CFI\n", dev->name);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
77 /* need to go back to read array first, CFI cmd ignored otherwise */
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
78 if (do_w16(bi->base_addr + 0xAAA, 0xF0)) {
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
79 bad_w16: fprintf(stderr, "unexpected response to w16 - aborting\n");
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
80 return(-1);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
81 }
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
82 if (do_w16(bi->base_addr + 0xAA, 0x98))
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
83 goto bad_w16;
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
84 rc = run_cfi_check(bi, dev->cfi_table);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
85 if (rc < 0)
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
86 return(rc);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
87 if (!rc) {
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
88 fprintf(stderr, "Error: CFI mismatch, unsafe to continue\n");
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
89 return(-1);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
90 }
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
91 printf("Confirmed %s or compatible\n", dev->name);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
92 bi->device = dev;
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
93 return(0);
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
94 }
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
95
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
96 static
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 spansion_pl129j_or_n(bi)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 int rc;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 printf("Spansion PL129J or PL129N, looking at CFI\n");
507
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
103 /* need to go back to read array first, CFI cmd ignored otherwise */
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
104 if (do_w16(bi->base_addr + 0xAAA, 0xF0)) {
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
105 bad_w16: fprintf(stderr, "unexpected response to w16 - aborting\n");
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 }
507
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
108 if (do_w16(bi->base_addr + 0xAAA, 0x98))
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
109 goto bad_w16;
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 rc = run_cfi_check(bi, flashdev_PL129N.cfi_table);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 if (rc) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 printf("Found PL129N\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 bi->device = &flashdev_PL129N;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 rc = run_cfi_check(bi, flashdev_PL129J.cfi_table);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 if (rc) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 printf("Found PL129J\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 bi->device = &flashdev_PL129J;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 fprintf(stderr, "Error: no matching CFI found\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 amd_extended_id(bi)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 uint16_t ext1, ext2;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135
507
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
136 printf("AMD-style extended ID device, reading extended ID\n");
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 if (do_r16(bi->base_addr + 0x1C, &ext1) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 if (do_r16(bi->base_addr + 0x1E, &ext2) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 printf("Extended ID: %04X %04X\n", ext1, ext2);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 if (ext1 == 0x2221 && ext2 == 0x2200)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 return spansion_pl129j_or_n(bi);
553
3886a8a40809 fc-loadtool: added support for old Am29DL640G flash chip
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
144 if (ext1 == 0x2202 && ext2 == 0x2201)
3886a8a40809 fc-loadtool: added support for old Am29DL640G flash chip
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
145 return try_device(bi, &flashdev_Am29DL640G);
559
f229efbfd581 fc-loadtool: added support for S29PL032J/S71PL032J flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 553
diff changeset
146 if (ext1 == 0x220A && ext2 == 0x2201)
f229efbfd581 fc-loadtool: added support for S29PL032J/S71PL032J flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 553
diff changeset
147 return try_device(bi, &flashdev_PL032J);
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 fprintf(stderr, "Error: unknown device ID\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151
523
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
152 static
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
153 samsung_extended_id(bi)
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
154 struct flash_bank_info *bi;
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
155 {
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
156 uint16_t ext1, ext2;
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
157
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
158 printf("Samsung extended ID device, reading extended ID\n");
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
159 if (do_r16(bi->base_addr + 0x1C, &ext1) < 0)
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
160 return(-1);
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
161 if (do_r16(bi->base_addr + 0x1E, &ext2) < 0)
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
162 return(-1);
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
163 printf("Extended ID: %04X %04X\n", ext1, ext2);
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
164 if (ext1 == 0x2503 && ext2 == 0x2501)
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
165 return try_device(bi, &flashdev_K5L33xx_A);
916
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
166 if (ext1 == 0x2508 && ext2 == 0x2501)
54a0bc149d9c fc-loadtool: add support for Samsung K5L29xx_A flash
Mychaela Falconia <falcon@freecalypso.org>
parents: 559
diff changeset
167 return try_device_amdreset(bi, &flashdev_K5L29xx_A);
523
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
168 fprintf(stderr, "Error: unknown device ID\n");
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
169 return(-1);
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
170 }
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
171
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 static struct idmap {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 uint16_t manuf_id;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 uint16_t dev_id;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 int (*handler)();
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 void *extra_arg;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 } device_id_table[] = {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 /* AMD/Spansion devices */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 {0x0001, 0x227E, amd_extended_id, 0},
511
0212edcec4d2 loadtools/flashid.c: added alt ID for 28F320C3T equiv in Mot C139
Mychaela Falconia <falcon@freecalypso.org>
parents: 507
diff changeset
180 /* 28F160C3T and 28F320C3T equivalents found in some Mot C1xx phones */
0212edcec4d2 loadtools/flashid.c: added alt ID for 28F320C3T equiv in Mot C139
Mychaela Falconia <falcon@freecalypso.org>
parents: 507
diff changeset
181 {0x0020, 0x88BA, try_device, &flashdev_28F320C3T},
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 {0x0020, 0x88CE, try_device, &flashdev_28F160C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 /* Intel flash chips */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 {0x0089, 0x8854, try_device, &flashdev_28F640W30T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 {0x0089, 0x8855, try_device, &flashdev_28F640W30B},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 {0x0089, 0x8864, try_device, &flashdev_28F640W30T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 {0x0089, 0x88C2, try_device, &flashdev_28F160C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 {0x0089, 0x88C4, try_device, &flashdev_28F320C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 {0x0089, 0x88CC, try_device, &flashdev_28F640C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 {0x0089, 0x88CD, try_device, &flashdev_28F640C3B},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 /* Samsung flash */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 {0x00EC, 0x22A0, try_device, &flashdev_K5A32xx_T},
523
9a478d33b3ca fc-loadtool: added Samsung K5L33xx_A flash support for GTM900
Mychaela Falconia <falcon@freecalypso.org>
parents: 511
diff changeset
193 {0x00EC, 0x257E, samsung_extended_id, 0},
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 /* table search terminator */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 {0, 0, 0, 0}
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 };
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 flash_detect(bank, repeat)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 uint16_t manuf_id, dev_id;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 struct idmap *tp;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 int rc;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 bi = flash_bank_info + bank;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 if (bi->detect_done && !repeat)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 printf("Autodetecting flash chip type\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 if (do_w16(bi->base_addr + 0xAAA, 0xAA)) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 bad_w16: fprintf(stderr,
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 "unexpected response to w16 in read ID cmd sequence - aborting\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 if (do_w16(bi->base_addr + 0x554, 0x55))
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 goto bad_w16;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 if (do_w16(bi->base_addr + 0xAAA, 0x90))
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 goto bad_w16;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 if (do_r16(bi->base_addr, &manuf_id) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 if (do_r16(bi->base_addr + 2, &dev_id) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 printf("Basic device ID: %04X %04X\n", manuf_id, dev_id);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 for (tp = device_id_table; tp->handler; tp++)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 if (tp->manuf_id == manuf_id && tp->dev_id == dev_id)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 break;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 if (!tp->handler) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 fprintf(stderr, "Error: unknown device ID\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 rc = tp->handler(bi, tp->extra_arg);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 /* got the device, see if it is compatible with global config */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 if (bi->device->required_global_config > flash_global_config) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 fprintf(stderr,
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 "Error: detected flash device is not compatible with the configured mapping\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 /* good to go */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 if (bi->device->bank_geom[1] && bank)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 bi->geom = bi->device->bank_geom[1];
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 else
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 bi->geom = bi->device->bank_geom[0];
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 bi->ops = bi->device->cmdset;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 bi->detect_done = 1;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 /* return device to read array mode */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 return bi->ops->reset_cmd(bi);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 }