FreeCalypso > hg > freecalypso-tools
annotate doc/Loadtool-flash-support @ 885:16e259bff02b
fc-pwt-comp: explicitly reject empty input
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sun, 03 Apr 2022 03:55:02 +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. | 
