FreeCalypso > hg > freecalypso-tools
annotate doc/Loadtool-flash-support @ 619:f82551c77e58
libserial-newlnx: ASYNC_LOW_LATENCY patch reverted
Reports from Das Signal indicate that loadtools performance on Debian
is about the same as on Slackware, and that including or omitting the
ASYNC_LOW_LATENCY patch from Serg makes no difference. Because the
patch in question does not appear to be necessary, it is being reverted
until and unless someone other than Serg reports an actual real-world
system on which loadtools operation times are slowed compared to the
Mother's Slackware reference and on which Slackware-like performance
can be restored by setting the ASYNC_LOW_LATENCY flag.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 27 Feb 2020 01:09:48 +0000 |
parents | 809829dbc58a |
children |
rev | line source |
---|---|
517
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 fc-loadtool is our tool for reading and writing the non-volatile flash memory |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 on all of our supported target devices, and the set of targets which it needs |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 to support keeps growing. Here are some of the challenges we have to deal with: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * Some Calypso board designs use AMD-style flash, others use Intel-style flash. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 Initially we only supported AMD-style flash chips that were used in our first |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 targets (Openmoko GTA02 and Pirelli DP-L10), then we got other targets that |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 have Intel-style flash. So far we have not yet run into a case where both |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 kinds of flash can be encountered on the same target family, but our current |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 design supports this possibility. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * All Calypso devices which we currently support have flash chips with non- |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 uniform sector geometries, i.e., the area that would otherwise be the first |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 or the last sector is subdivided into smaller sectors (erase units). Both |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 "top boot" (small sectors at high addresses) and "bottom boot" (small sectors |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 at low addresses) geometries are found among our targets, as well as flashes |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 that have small sectors at both ends. The exact sector geometry needs to be |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 known to the flash manipulation tool in order to perform correct flash erase |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 and program operations. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 * While most Calypso devices have a single flash chip providing a single bank |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 of flash (can be as small as 2 MiB or as big as 8 MiB), some of our targets |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 (our own FCDEV3B and the Pirelli DP-L10 phone from which the idea was copied) |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 provide two flash chip select banks of 8 MiB each. To make the matters even |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 more complicated, all of that flash is actually a single 16 MiB chip that has |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 two chip selects instead of one, specifically designed for processors like |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 our Calypso that can only address a maximum of 8 MiB per chip select. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 * It is a fixed target property whether a given board is wired for only one |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 flash chip select or allows the possibility of dual-bank flash, and if a |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 second flash chip select is provided for, which Calypso chip select it is |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 wired to. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 Given the existence of the CFI (Common Flash Interface) standard and the fact |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 that every flash chip we have encountered so far in a Calypso device does have |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 a readable CFI structure, one may naively think that the most sensible way to |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 support all of our possible flash configurations would be to read and parse the |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 CFI structure in a device-agnostic way (i.e., without special cases for specific |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 chip types) and thus support "everything". But here are the problems with this |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 simplistic approach: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 * On boards that have 16 MiB of flash in a Spansion S71PL129J or S71PL129N chip, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 it makes the most sense for us to treat this big flash as two separate banks |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 of 8 MiB each - but the CFI structure describes a single 16 MiB flash chip. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 * AMD-style flashes with "top boot" geometries are among our repertoire of |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 devices to be supported, and they have their regions listed in the wrong order |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 in the CFI structure - one needs to look in the AMD-specific part outside of |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 the vendor-neutral geometry structure to see the true "top boot" geometry. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 * Intel-style flashes with independent read/write partitions such that each |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 partition has its own status register and its own "read array" vs. "read SR" |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 state require special handling in our architecture, but autoconfiguring this |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 quirk agnostically from CFI seems too difficult to me, and I wouldn't trust |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 it. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 Our previous architectural attempts |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 =================================== |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 Initially we only supported two flash chip types, Samsung K5A32xx_T (Openmoko |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 GTA02) and Spansion S71PL129N (Pirelli DP-L10) with strictly manual selection: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 -h gta02 selected one and -h pirelli selected the other via hardware parameter |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 files. There was an ID check to prevent bogosity from wrong manual selection, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 but no autodetection or autoconfiguration. Then we added Compal target support; |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 aside from Mot C155/156 which has partition quirks that were only discovered |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 much later, these phones have simple Intel-style flashes without any of the CFI |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 problems listed above, thus they were handled via CFI. Thus we had a hybrid |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 architecture: Openmoko, Pirelli and FCDEV3B targets were handled by way of |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 manual selection and ID checks to catch errors, whereas Compal targets were |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 handled by way of CFI-based autodetection and autoconfiguration. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 Then it was discovered that the 8 MiB Intel-style flash on the D-Sample board |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 and on Mot C155/156 has partition quirks which our CFI-based autoconfiguration |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 (looking at vendor-agnostic geometry bits only) could not take care of, and the |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 solution was to move these targets from CFI-based autoconfiguration to the same |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 kind of fixed device selection and configuration as was used for AMD flashes. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 At that point our flash handling architecture became a mess, and when I started |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 questioning how to extend it further as the need arises to support more |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 different flash chip types on a wide variety of Calypso targets, it became |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 clear that a redesign was needed. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 Our current architecture |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 ======================== |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 In our current architecture the only flash configuration that is indicated |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 statically in the hardware parameter files (selected with the -h option, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 practically meaning predefined target configurations) is board wiring |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 information. There are 3 possibilities that can be configured: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 flash single-4M base_addr -- wired for 1 bank of up to 4 MiB |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 flash single-8M base_addr -- wired for 1 bank of up to 8 MiB |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 flash dual-8M bank0_base bank1_base -- wired for 2 banks of up to 8 MiB each |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 Naturally the dual-8M configuration only makes sense for boards that are wired |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 with a provision for a second flash bank, in which case the second bank base |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 address will depend on the board wiring, i.e., which Calypso chip select it is. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 (Bank 0 base address will normally be 0x03000000, i.e., the alternate nCS0 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 mapping that needs to be used when the boot ROM is mapped at 0.) The choice |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 between single-4M and single-8M needs to match whether or not the associated |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 init script includes a "w16 fffef006 0008" command to enable ADD22. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 Beyond this board wiring configuration, the rest of flash support is based on a |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 hard-coded table of all supported devices (a table that can grow indefinitely) |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 plus autodetection amongst this supported set. In other words, fc-loadtool will |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 only operate on a given flash chip if it explicitly knows about that chip, but |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 the set of supported chips can be indefinitely extended without hitting |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 architectural barriers, and our autodetection logic will detect and handle any |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 supported chip on any board target. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 Autodetection details |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 ===================== |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 The flash chip autodetection operation proceeds as follows: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 * A sequence of writes is done to put the chip into the Read ID mode, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 equivalent to the following hypothetical C code with base_addr being an |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 integer: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 *(volatile uint16_t *)(base_addr + 0xAAA) = 0xAA; |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 *(volatile uint16_t *)(base_addr + 0x554) = 0x55; |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 *(volatile uint16_t *)(base_addr + 0xAAA) = 0x90; |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 * 16-bit words at base_addr offsets of 0 and 2 (where the manufacturer and |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 device ID codes are expected to reside) are read, and this ID is looked up in |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 a table. If the ID code is not known, we give up and don't allow any flash |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 operations. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 * For most ID codes, if we have found the code in our table, we know what device |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 we should expect. But before we go ahead and assume that the command set and |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 the geometry are as we think based on the ID code, we also do a CFI check. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 Specifically, we put the flash chip into CFI query mode, read a defined set |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 of word locations (can be different for each chip type), and require these |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 words to match our compiled-in table. Thus we guard against the possibility |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 of some other flash chip having the same ID code (yes, there are known |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 instances of ID code reuse) but having a different geometry. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 * Some ID codes receive more complex handling. Right now the only such case is |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 Spansion PL-J/PL-N flash. PL129J and PL129N flashes have different geometries |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 and thus must be distinguished, but they have exactly the same ID codes and |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 can only be distinguished by CFI. We have CFI match tables for PL129J and |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 for PL129N; we try to match the CFI bits provided by the chip against one |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 table first, and if it fails to match, we try the other. (As an optimization, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 we try the PL129N table first, as the N flash is the one found in real-world |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 Pirelli DP-L10 specimen and used on our FCDEV3B.) If the CFI matches neither |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 table, we give up and don't allow any flash operations. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 The end effect of this logic is that we err on the side of caution: we only |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 allow flash erase and program operations if we detect a flash chip which is |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 fully known to us and fully matches our expectations, with both the ID codes |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 and the CFI structure being as we expect. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 Adding support for new flash chip types |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 ======================================= |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 All supported flash devices are listed in the fldevs.c source module; new |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 devices that differ in geometry, command set or quirks need to be added there. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 The description of each flash device in fldevs.c also includes the CFI table |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 that needs to matched to confirm the device in question. A different module |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 named flashid.c contains the autodetection function and the table of device ID |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 codes; the latter table always needs to be extended, sometimes adding an |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 entirely new device, othertimes adding a newly found ID code for some flash |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 chip that is fully equivalent to an already supported one in terms of geometry, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 command set and relevant quirks. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 What do you do if you are an end user (not a FreeCalypso developer) and you got |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 a Calypso device whose flash chip is not being recognized by fc-loadtool? |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 Answer: you send the output of the "flash id" command (contains ID codes) and a |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 dump of the CFI structure to Mother Mychaela for analysis. To make a dump of |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 the CFI structure, execute the following commands: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
170 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 loadtool> w16 030000aa 98 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 loadtool> dump2bin 03000000 200 cfidump.bin |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 Handling of dual-bank 16 MiB flash chips |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
175 ======================================== |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
177 The Calypso can only address a maximum of 8 MiB per chip select, thus 16 MiB or |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
178 larger flash chips with a single chip select cannot be used in Calypso board |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 designs. However, there are some special 16 MiB flash chips that present |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 themselves as two banks of 8 MiB each (even though the CFI structure describes |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 a single 16 MiB chip), and such flash chips are used on the Pirelli DP-L10 and |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 on our own FCDEV3B. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 The flash handling architecture of fc-loadtool allows two banks to be configured |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 via a flash dual-8M setting in the hardware parameter file, and when that |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 configuration is used (-h fcfam and -h pirelli), the two banks are treated as |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 being entirely independent. All regular flash commands operate only on the main |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 bank, and a parallel set of flash2 commands operates on the secondary bank. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
189 The autodetection logic and the resulting configuration are done independently |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 on each flash bank when it is first accessed, thus fc-loadtool would happily |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
191 handle two separate flash chips of different types, even though such arrangement |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
192 is not expected to occur in any Calypso device. But when a PL129J or PL129N |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 device is detected (the two dual-bank devices we currently support) on the |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 autodetection probe of either bank, the operating geometry is configured |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 appropriately based on which bank it is. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 Primary flash bank mapping at 0x03000000 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 ======================================== |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 When loadagent runs on the Calypso target controlled by fc-loadtool, the Calypso |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 boot ROM will usually be mapped at 0, thus the alternate nCS0 mapping at |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 0x03000000 needs to be used for flash access. However, the Calypso chip (all |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 versions we work with) has a little design bug in this part of the silicon: |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 this alternate nCS0 mapping at 0x03000000 works only when the debug visibility |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 bit in the API-RHEA control register (bit 6 in the FFFF:FB0E register) is set, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 and does not work otherwise. This bit is initially set as the Calypso comes |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 out of reset, and on most platforms we gain loadtool access via the boot ROM, |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 hence the problem does not occur - but on Compal targets we gain loadtool |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 access either through Compal's bootloader or via tfc139, and in both cases |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 Compal's fw (either the full fw or the bootloader part) has already set the |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 register in question to the runtime operational value of 0x2A (unchanged from |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 TI's TCS211 reference fw), with the debug visibility bit cleared, hence the |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 0x03000000 flash mapping no longer works. |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 There are two possible solutions: we can write into the FFFF:FB10 register to |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 disable the boot ROM and use the "regular" flash mapping at 0, which is what we |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 used to do, or we can write into the FFFF:FB0E register and re-enable the debug |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 visibility mode. Right now we do the latter, allowing us to use the same |
809829dbc58a
new flash support documented
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 0x03000000 flash mapping on all targets for consistency. |