annotate loadtools/flashid.c @ 509:49ee210fc4fb

loadtools/scripts/*.config: new flash config
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 28 May 2019 07:42:39 +0000
parents c942be3c7997
children 0212edcec4d2
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;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 extern struct flash_device flashdev_PL129J;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 extern struct flash_device flashdev_PL129N;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 extern struct flash_device flashdev_K5A32xx_T;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 extern int flash_global_config;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 extern struct flash_bank_info flash_bank_info[2];
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 run_cfi_check(bi, table)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 struct cfi_check *table;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 struct cfi_check *tp;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 uint16_t rdword;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 for (tp = table; tp->offset >= 0; tp++) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 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
34 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 if (rdword != tp->expect_val)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 }
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 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 try_device(bi, dev)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 struct flash_device *dev;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 int rc;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 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
49 if (do_w16(bi->base_addr + 0xAA, 0x98)) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 fprintf(stderr, "unexpected response to w16 - aborting\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 rc = run_cfi_check(bi, dev->cfi_table);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 if (!rc) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 fprintf(stderr, "Error: CFI mismatch, unsafe to continue\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 printf("Confirmed %s or compatible\n", dev->name);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 bi->device = dev;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 return(0);
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
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 spansion_pl129j_or_n(bi)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 struct flash_bank_info *bi;
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 int rc;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 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
72 /* 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
73 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
74 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
75 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 }
507
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
77 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
78 goto bad_w16;
506
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 rc = run_cfi_check(bi, flashdev_PL129N.cfi_table);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 if (rc) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 printf("Found PL129N\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 bi->device = &flashdev_PL129N;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 rc = run_cfi_check(bi, flashdev_PL129J.cfi_table);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 if (rc) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 printf("Found PL129J\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 bi->device = &flashdev_PL129J;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 fprintf(stderr, "Error: no matching CFI found\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 static
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 amd_extended_id(bi)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 uint16_t ext1, ext2;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104
507
c942be3c7997 new flash support works for PL129N on the Pirelli
Mychaela Falconia <falcon@freecalypso.org>
parents: 506
diff changeset
105 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
106 if (do_r16(bi->base_addr + 0x1C, &ext1) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 if (do_r16(bi->base_addr + 0x1E, &ext2) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 printf("Extended ID: %04X %04X\n", ext1, ext2);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 if (ext1 == 0x2221 && ext2 == 0x2200)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 return spansion_pl129j_or_n(bi);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 fprintf(stderr, "Error: unknown device ID\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 static struct idmap {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 uint16_t manuf_id;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 uint16_t dev_id;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 int (*handler)();
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 void *extra_arg;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 } device_id_table[] = {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 /* AMD/Spansion devices */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 {0x0001, 0x227E, amd_extended_id, 0},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 /* 28F160C3T equivalent found in a C11x phone in the wild */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 {0x0020, 0x88CE, try_device, &flashdev_28F160C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 /* Intel flash chips */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 {0x0089, 0x8854, try_device, &flashdev_28F640W30T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 {0x0089, 0x8855, try_device, &flashdev_28F640W30B},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 {0x0089, 0x8864, try_device, &flashdev_28F640W30T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 {0x0089, 0x88C2, try_device, &flashdev_28F160C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 {0x0089, 0x88C4, try_device, &flashdev_28F320C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 {0x0089, 0x88CC, try_device, &flashdev_28F640C3T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 {0x0089, 0x88CD, try_device, &flashdev_28F640C3B},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 /* Samsung flash */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 {0x00EC, 0x22A0, try_device, &flashdev_K5A32xx_T},
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 /* table search terminator */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 {0, 0, 0, 0}
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 };
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 flash_detect(bank, repeat)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 struct flash_bank_info *bi;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 uint16_t manuf_id, dev_id;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 struct idmap *tp;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 int rc;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 bi = flash_bank_info + bank;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 if (bi->detect_done && !repeat)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 return(0);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 printf("Autodetecting flash chip type\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 if (do_w16(bi->base_addr + 0xAAA, 0xAA)) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 bad_w16: fprintf(stderr,
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 "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
155 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 if (do_w16(bi->base_addr + 0x554, 0x55))
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 goto bad_w16;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 if (do_w16(bi->base_addr + 0xAAA, 0x90))
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 goto bad_w16;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 if (do_r16(bi->base_addr, &manuf_id) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 if (do_r16(bi->base_addr + 2, &dev_id) < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 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
166 for (tp = device_id_table; tp->handler; tp++)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 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
168 break;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 if (!tp->handler) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 fprintf(stderr, "Error: unknown device ID\n");
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 rc = tp->handler(bi, tp->extra_arg);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 if (rc < 0)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 return(rc);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 /* 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
177 if (bi->device->required_global_config > flash_global_config) {
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 fprintf(stderr,
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 "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
180 return(-1);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 }
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 /* good to go */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 if (bi->device->bank_geom[1] && bank)
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 bi->geom = bi->device->bank_geom[1];
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 else
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 bi->geom = bi->device->bank_geom[0];
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 bi->ops = bi->device->cmdset;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 bi->detect_done = 1;
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 /* return device to read array mode */
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 return bi->ops->reset_cmd(bi);
0dd2c87c1b63 fc-loadtool flash support overhaul
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 }