FreeCalypso > hg > freecalypso-tools
comparison doc/SE-K2x0-FFS @ 922:3152e23399a2
document SE K2x0 FFS quirks and our support for them
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 02 Jan 2023 00:50:19 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
921:74d284add54d | 922:3152e23399a2 |
---|---|
1 Flash file system in Sony Ericsson K200/220 phones | |
2 ================================================== | |
3 | |
4 SE K200/220 phones are based on our familiar Calypso chipset, their firmware is | |
5 based on the standard chipset reference fw from TI, and they use TIFFS as their | |
6 flexible data storage mechanism. Their TIFFS instance is located in the first | |
7 3328 KiB of the 2nd flash bank; the geometry is 256x13 or 64x52 depending on | |
8 which flash chip was used in each given phone. (Some specimen have Spansion | |
9 S71PL129NB0 chips with 256 KiB flash sectors, others feature Samsung K5L2931CAM | |
10 chips with 64 KiB flash sectors.) | |
11 | |
12 Calibration data and self-regenerating ability | |
13 ============================================== | |
14 | |
15 SE's FFS life cycle design on these phones is interesting in that vital per-unit | |
16 calibration data (RF, AFC and MADC calibrations) are stored in two places: | |
17 (1) in the FFS in TI's standard format and locations, and (2) in a dedicated | |
18 flash sector outside of FFS that appears to be written once at the factory and | |
19 never touched afterward. | |
20 | |
21 SE's firmware design allows the FFS to be fully erased without breaking the | |
22 phone: whenever the fw boots in a state where the FFS area of the flash is fully | |
23 erased (you can of course erase those FFS sectors with fc-loadtool, but it | |
24 appears that some official tools also provide the same operation) but the | |
25 separate factory calibration data sector is valid, the firmware formats and | |
26 initializes a new FFS, and furthermore copies all essential calibration records | |
27 from SE's proprietary sector structure into their standard TIFFS locations! | |
28 | |
29 But it gets even more interesting - when we examine FFS images read out of | |
30 various SE K2x0 specimen, we see two different occurrences: | |
31 | |
32 1) In some specimen the FFS content is exactly the same as what we would get by | |
33 erasing the FFS with fc-loadtool and letting the firmware regenerate a fresh | |
34 one on its next boot. We can thus reasonably assume that the FFS in these | |
35 specimen is indeed the product of such intervention at some point in the | |
36 phone's history. | |
37 | |
38 2) In other specimen we see some additional files beyond those that exist with | |
39 the life cycle of the previous paragraph. One readily noticeable addition | |
40 is the presence of /gsm/rf/tx/ramps.* files, which are absent in the self- | |
41 regenerated FFS where the phone's fw copied calibration records from SE's | |
42 dedicated calibration data sector. How are these Tx ramp tables different | |
43 from all other RF calibration records? Answer: in the present SE K2x0 | |
44 design, and also in all other Calypso phone and modem designs known to this | |
45 Mother, Tx ramps are calibrated per design and not per unit. Because the | |
46 correct Tx ramp tables are compiled into the firmware, having them in FFS is | |
47 redundant. | |
48 | |
49 Based on the above evidence, I (Mother Mychaela) hereby make the following | |
50 reconstruction of how these two kinds of FFS found in the wild likely came into | |
51 being: | |
52 | |
53 * In the case of Compal (Mot C1xx and SE J100) and Pirelli DP-L10 we know by | |
54 simple deductive reasoning that those firmwares must have had their l1_cust.c | |
55 code modified to read calibration records from their respective proprietary | |
56 flash data structures instead of TI's original FFS files. However, in the | |
57 case of SE K2x0 it is plausible that their l1_cust.c did NOT have to be | |
58 likewise modified - they could plausibly still have TI's original l1_cust.c | |
59 code that reads RF tables from FFS on initialization and writes them back | |
60 into FFS upon those special MISC_ENABLE commands that are issued at the end | |
61 of TI's original calibration procedures. | |
62 | |
63 * If my hypothesis above is correct, then it follows that when SE or their ODM | |
64 did their factory production line calibration, the results were initially | |
65 written into FFS and not into SE's separate factory calibration data sector. | |
66 If they are using unmodified l1_cust.c code from TI, then the presence of | |
67 redundant /gsm/rf/tx/ramps.* files is explained - TI's standard calibration | |
68 procedure results in these files being written into FFS because the canonical | |
69 l1_cust.c code classifies them as "Tx calibration" rather than "Tx config" - | |
70 see our RF_tables article. | |
71 | |
72 * In a separate step after all standard calibration procedures, they must have | |
73 copied all important calibration records into their non-standard flash sector | |
74 at 0x01FD0000, specifically to produce a more durable copy that can persist | |
75 through full erasure of FFS. Tx ramp tables were not included because they | |
76 are relatively large and redundant, not actually calibrated per unit. | |
77 | |
78 * Those SE K2x0 specimen whose FFS contains /gsm/rf/tx/ramps.* files and some | |
79 other files that aren't found in auto-regenerated FFS probably exhibit the | |
80 original FFS from the factory production line that was never subjected to | |
81 being blown away and regenerated! | |
82 | |
83 SE's non-standard extension to TIFFS | |
84 ==================================== | |
85 | |
86 There is one aspect of SE K2x0 FFS that creates a pain point for our tools: | |
87 they made their own non-standard extension to TIFFS in terms of extended UCS-2 | |
88 filenames, and given our natural desire to be able to use our tiffs tool (TIFFS | |
89 IVA) to examine FFS images from these SE phones, we had to extend our tool so | |
90 that it parses SE's extension instead of throwing up errors like it did before. | |
91 | |
92 As explained in our TIFFS-Overview article, classic TIFFS requires every | |
93 elementary filename to consist of printable ASCII characters from the sensibly | |
94 narrow set of [A-Za-z0-9_.,+%$#-], further limited to a maximum of 20 | |
95 characters. However, SE K2x0 FFS images often contain some files that violate | |
96 this constraint; deeper examination reveals that SE (or their ODM) devised a | |
97 feature to allow filenames composed of UCS-2 characters, implemented as follows: | |
98 | |
99 * The first "character" of the filename written into TIFFS is \x02, i.e., NOT a | |
100 printable ASCII character; | |
101 | |
102 * The next "character" in the TIFFS object name is another binary byte encoding | |
103 the length of the UCS-2 string: for example, if the "high-level" name consists | |
104 of 6 UCS-2 characters, this second TIFFS object name "character" is \x06; | |
105 | |
106 * These two non-printable-ASCII chars are followed by a long string of [0-9A-F] | |
107 ASCII characters, encoding the "high-level" UCS-2 name in hex; | |
108 | |
109 * The whole arrangement ends with a terminating NUL, allowing the rest of TIFFS | |
110 to work unchanged. | |
111 | |
112 Seen from TIFFS perspective, these extended filenames created by SE K2x0 fw | |
113 violate traditional canon in two ways: | |
114 | |
115 1) The overall length of the mostly-hex-encoded filename string usually exceeds | |
116 the traditional 20 character limit; | |
117 | |
118 2) The set of allowed characters is grossly violated: not an innocuous extension | |
119 of allowing some additional "sane" characters, but non-printable-ASCII binary | |
120 chars that are barely compatible with C string functions by virtue of not | |
121 containing zero bytes. | |
122 | |
123 Please see the new section titled "Support for SE K2x0 extended filenames" in | |
124 our TIFFS-IVA-usage article for the explanation of how we handle these extended | |
125 filenames in our TIFFS IVA tool. | |
126 | |
127 fc-fsio considerations | |
128 ====================== | |
129 | |
130 In addition to "in vitro" analysis with our tiffs tool, SE K2x0 FFS can also be | |
131 accessed "in vivo" with fc-fsio in the following two scenarios: | |
132 | |
133 1) SE K2x0 firmware does not have RVTMUX enabled by default, but they have | |
134 non-volatile flags in their FFS (which can be set via a hidden menu entered | |
135 via secret MMI code #*87223564#) that enable RVTMUX on the MODEM UART that | |
136 is brought out, and their RVTMUX includes ETM and TMFFS2 protocols. | |
137 | |
138 2) We can run TI's original FFS code against SE K2x0 FFS bodies by adding the | |
139 necessary configuration to our fc-xram based FFS editor tool described in | |
140 our TIFFS-Overview article. | |
141 | |
142 The expected behaviour in scenario 2 can be predicted statically by studying | |
143 the code, whereas scenario 1 calls for experimentation. Experiments with | |
144 RVTMUX-enabled SE K2x0 original fw reveal that it does behave (at least as far | |
145 as visible behaviour over TMFFS2) exactly like TI's original FFS code in terms | |
146 of readdir output when listing directories with extended filenames in them: as | |
147 long as they fit into TMFFS2 string buffer, these extended filenames are | |
148 returned just as one would naively expect. | |
149 | |
150 In light of these observations, fc-fsio has also been patched up to behave | |
151 gracefully when faced with such previously unexpected readdir results from the | |
152 target. Specifically: | |
153 | |
154 * The short form of 'ls' command will print whatever the target firmware | |
155 returns, including extended filenames; any non-printable-ASCII characters are | |
156 escaped in \x hex form. | |
157 | |
158 * 'ls -l' or 'll' will throw up an error if one attempts to list a directory | |
159 that contains one or more extended filenames, caught either at the level of | |
160 the readdir result not fitting into the buffer sized for standard TIFFS | |
161 filenames or (for SE K2x0 extended filenames of 4 or fewer UCS-2 characters) | |
162 at the level of this readdir result containing non-printable-ASCII chars. | |
163 | |
164 Finally, the following limitations need to be kept in mind: | |
165 | |
166 * There is no way to address an FFS object with an extended filename by entering | |
167 a pathname in fc-fsio commands; | |
168 | |
169 * File systems or subtrees containing extended filenames cannot be read out with | |
170 fc-fsio cpout command: it will fail just like ls -l; | |
171 | |
172 * rm-subtree and cleandir commands will likewise fail and stop whenever they | |
173 encounter a filename longer than 20 characters (invalid for the purpose of | |
174 pathname generation based on fixed-length buffers) anywhere in the subtree to | |
175 be deleted. | |
176 | |
177 The last limitation (inability to delete "bad" files) may seem like a serious | |
178 flaw in the design of fc-fsio at first, but please realize that the primary | |
179 mission of FreeCalypso is to work with our own hardware and firmware, not alien | |
180 - and the original FFS code from TI, which is what we use in FreeCalypso, will | |
181 never allow file system objects with such bad filenames to be created in the | |
182 first place. Therefore, the limitation of fc-fsio being unable to manipulate | |
183 certain files to the extent of not even being able to delete them is specific | |
184 to the peculiar scenario of operating on *alien* FFS from Sony Ericsson. |