FreeCalypso > hg > freecalypso-reveng
comparison pirelli/rfcal @ 220:2cc7a17c3859
pirelli/rfcal: new understanding
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 16 Nov 2017 04:19:58 +0000 |
| parents | 30ba25056ecd |
| children |
comparison
equal
deleted
inserted
replaced
| 219:e3bbb8cfbbc0 | 220:2cc7a17c3859 |
|---|---|
| 1 The 64 KiB flash sector at 0x027F0000 (the last sector of the 2nd flash bank) | 1 The 64 KiB flash sector at 0x027F0000 (the last sector of the 2nd flash bank) |
| 2 contains per-unit factory data, including the IMEI and RF calibration values. | 2 contains per-unit factory data, including the IMEI and RF calibration values. |
| 3 The location of the IMEI record (at offset 0x504) was found back in 2013-07 and | 3 The location of the IMEI record (at offset 0x504) was found back in 2013-07 and |
| 4 its encryption was figured out in 2013-11, but it took a bit longer to find the | 4 its encryption was figured out in 2013-11, but it took a bit longer to find the |
| 5 RF calibration data. But I finally found most of the latter as well. Here | 5 RF calibration data. Most of the RF calibration bits were found in 2014-07, |
| 6 they are: | 6 but the complete picture presented below has only been reconstructed in 2017-11. |
| 7 | |
| 8 The data structure corresponding to TI's RF calibration files listed in the | |
| 9 config_files_common[] and config_files_band[] arrays in l1_cust.c begins at | |
| 10 offset 0x528, and has space allocated for each and every one of the files | |
| 11 listed in those arrays in TI's canonical version, in the same order as in that | |
| 12 canonical version, with the single exception of /sys/uartswitch. Behold: | |
| 7 | 13 |
| 8 Hex offset Corresponding FFS file in TI's canonical version | 14 Hex offset Corresponding FFS file in TI's canonical version |
| 9 ---------------------------------------------------------------- | 15 ---------------------------------------------------------------- |
| 16 0528 /gsm/rf/afcdac | |
| 17 052A checksum byte | |
| 18 052B 442 (0x1BA) unused (all FF) bytes making room for: | |
| 19 /gsm/rf/stdmap | |
| 20 /gsm/rf/afcparams | |
| 21 /gsm/rf/rx/agcglobals | |
| 22 /gsm/rf/rx/il2agc | |
| 23 /gsm/rf/rx/agcwords | |
| 24 | |
| 10 06E5 /sys/adccal | 25 06E5 /sys/adccal |
| 11 0709 checksum byte | 26 0709 checksum byte |
| 27 070A 33 (0x21) unused (all FF) bytes making room for: | |
| 28 /sys/abb | |
| 12 | 29 |
| 13 072B /gsm/rf/tx/ramps.900 | 30 072B /gsm/rf/tx/ramps.900 |
| 14 092B checksum byte | 31 092B checksum byte |
| 15 092C /gsm/rf/tx/levels.900 | 32 092C /gsm/rf/tx/levels.900 |
| 16 09AC checksum byte | 33 09AC checksum byte |
| 26 0F31 checksum byte | 43 0F31 checksum byte |
| 27 0F32 /gsm/rf/tx/levels.1900 | 44 0F32 /gsm/rf/tx/levels.1900 |
| 28 0FB2 checksum byte | 45 0FB2 checksum byte |
| 29 0FB3 /gsm/rf/tx/calchan.1900 | 46 0FB3 /gsm/rf/tx/calchan.1900 |
| 30 1033 checksum byte | 47 1033 checksum byte |
| 48 1034 123 (0x7B) unused (all FF) bytes making room for: | |
| 49 /gsm/rf/tx/caltemp.900 | |
| 50 /gsm/rf/tx/caltemp.1800 | |
| 51 /gsm/rf/tx/caltemp.1900 | |
| 31 | 52 |
| 32 10AF /gsm/rf/rx/calchan.900 | 53 10AF /gsm/rf/rx/calchan.900 |
| 33 10D7 checksum byte | 54 10D7 checksum byte |
| 34 10D8 /gsm/rf/rx/agcparams.900 | 55 10D8 /gsm/rf/rx/agcparams.900 |
| 35 10E0 checksum byte | 56 10E0 checksum byte |
| 39 1112 checksum byte | 60 1112 checksum byte |
| 40 1113 /gsm/rf/rx/calchan.1900 | 61 1113 /gsm/rf/rx/calchan.1900 |
| 41 113B checksum byte | 62 113B checksum byte |
| 42 113C /gsm/rf/rx/agcparams.1900 | 63 113C /gsm/rf/rx/agcparams.1900 |
| 43 1144 checksum byte | 64 1144 checksum byte |
| 65 1145 more than enough unused (all FF) bytes to fit: | |
| 66 /gsm/rf/rx/caltemp.900 | |
| 67 /gsm/rf/rx/caltemp.1800 | |
| 68 /gsm/rf/rx/caltemp.1900 | |
| 69 | |
| 70 TI's canonical version classifies each of the files listed in those | |
| 71 config_files_common[] and config_files_band[] arrays into one of 8 categories: | |
| 72 | |
| 73 f = RF calibration | |
| 74 F = RF config | |
| 75 r = Rx calibration | |
| 76 R = Rx config | |
| 77 t = Tx calibration | |
| 78 T = Tx config | |
| 79 s = system calibration | |
| 80 S = system config | |
| 81 | |
| 82 Pirelli's factory data structure allocates space for all of the possible files | |
| 83 in all 8 categories, but out of all these spaces, the only ones that are | |
| 84 actually filled with bits (not all FF) are the ones corresponding to the 4 | |
| 85 "calibration" categories, and not the "config" ones. It is my (Mychaela's) | |
| 86 guess that Foxconn folks probably preserved the logic invoked by me 102 through | |
| 87 me 109 commands unchanged from TI's original, and thus had the theoretical | |
| 88 ability to write everything into their invented data structure, but only issued | |
| 89 the me 102/104/106/108 commands in their factory production flow, hence only | |
| 90 the "calibration" record slots got filled. | |
| 91 | |
| 92 Please note that the slots corresponding to the missing files in the "config" | |
| 93 categories are filled with all FF bytes, and do NOT contain the "standard" or | |
| 94 "never changed" bits compiled into the firmware. Because these bits are not | |
| 95 present in the factory record in the flash, any aftermarket firmware running on | |
| 96 these phones needs to provide these bits on its own. This category very notably | |
| 97 includes the afcparams table. | |
| 44 | 98 |
| 45 Each calibration record is followed by a checksum byte. It is a simple ripple- | 99 Each calibration record is followed by a checksum byte. It is a simple ripple- |
| 46 carry sum of all bytes in the preceding record. Note that this checksum byte | 100 carry sum of all bytes in the preceding record. Note that this checksum byte |
| 47 is always 0 for the ramps records, as each correctly-formed ramp adds up to 128 | 101 is always 0 for the ramps records, as each correctly-formed ramp adds up to 128 |
| 48 (0x80), and the array has an even number of ramps in total. | 102 (0x80), and the array has an even number of ramps in total. It is also my |
| 103 (Mychaela's) guess that Pirelli's fw probably uses this checksum byte to detect | |
| 104 that the "config" files are missing and avoid loading the FF bytes into the | |
| 105 corresponding L1 RAM data structures: the sum of all FF bytes in the data space | |
| 106 does not equal FF unless the record length is 1 byte or 257 or 513... bytes, | |
| 107 and none of TI's calibration/config records match those byte lengths. | |
| 49 | 108 |
| 50 Unfortunately though, I have not been able to locate these two records: | 109 Absence of the afcparams table |
| 110 ============================== | |
| 51 | 111 |
| 52 /gsm/rf/afcdac | 112 The afcparams table is placed in the "RF config" category in TI's TCS211 |
| 53 /gsm/rf/afcparams | 113 reference fw, rather than "RF calibration". It appears that in the very old |
| 114 days of Sara RF (before the D-Sample) this table contained only the Psi | |
| 115 constants (no min/max/nominal DAC), and these Psi constants were tweaked in the | |
| 116 source code in l1_rfN.h, rather than via per-unit calibration - hence the | |
| 117 "config" rather than "calibration" classification. Then RF 10 (Clara) came | |
| 118 along, TI started using "plain" VCXOs without the "TC" part, they implemented a | |
| 119 new AFC algorithm (VCXO_ALGO), and the min/max/nominal DAC fields got added to | |
| 120 the afcparams table. The complete story is not clear, but the end result is | |
| 121 that when the days of Openmoko came around, FIC (OM's factory) had a production | |
| 122 line calibration program, presumably from TI (I never got a copy of it, but I | |
| 123 was told it was a Windows binary sans source), that performed individual | |
| 124 per-unit calibration of the VCXO along with the expected Rx and Tx band | |
| 125 calibrations, and the afcparams table is calibrated per unit on Openmoko | |
| 126 devices. | |
| 54 | 127 |
| 55 These two files appear in Openmoko's FFS on GTA02 modems, and the byte content | 128 Both theory and practice indicate that OM's way of calibrating the afcparams |
| 56 differs for each physical unit, so I assume that these values really do need to | 129 table on a per-unit basis is not the only way: the per-unit calibration does |
| 57 be calibrated per unit, but I haven't been able to locate them in Pirelli's | 130 not help much in practice because of the strong temperature sensitivity, and |
| 58 factory data block. /gsm/rf/afcdac is only 2 bytes long, thus very hard to | 131 the new AFC algorithm implemented by TI has to deal with wide uncertainties in |
| 59 spot visually in a hex dump of an unknown larger data structure; | 132 the initial VCXO frequency. Instead it appears to be sufficient to calibrate |
| 60 /gsm/rf/afcparams is 24 bytes long and has some structure to it, so I was | 133 the VCXO and the settings in the afcparams table on a per-design basis, rather |
| 61 hoping to recognize the latter, but no luck. | 134 than per unit, and it appears that Motorola/Compal did just that on their C1xx |
| 135 phones - which use a "plain" VCXO and not a VCTCXO like the Pirelli. | |
| 62 | 136 |
| 63 We will have to try running uncalibrated, or perhaps we'll find the code in | 137 Querying Pirelli's fw for the actively used afcparams table via rftr 9 returns |
| 64 Pirelli's fw that fills the parts of the T_RF structure that are normally read | 138 the following: |
| 65 from these files. | 139 |
| 140 rf_table afcparams | |
| 141 | |
| 142 6974 # psi_sta_inv | |
| 143 8 # psi_st | |
| 144 492713 # psi_st_32 | |
| 145 8717 # psi_st_inv | |
| 146 | |
| 147 888 # dac_center | |
| 148 -9568 # dac_min | |
| 149 11352 # dac_max | |
| 150 2560 # snr_thr | |
| 151 | |
| 152 Because the slot in the factory data structure where the afcparams record ought | |
| 153 to go is all FF bytes, the table returned by the fw above can only be hard-coded | |
| 154 in the fw itself. The 4 numbers in the second group are exactly the same as | |
| 155 the hard-coded numbers in l1_rf12.h in TI's reference fw, but the Psi numbers | |
| 156 are different - Foxconn/Pirelli folks must have tuned them for their VCTCXO. | |
| 157 | |
| 158 In this light, it is worthy to note that the afcdac record *is* present in | |
| 159 Pirelli's factory data block, and it differs from one unit to the next, i.e., | |
| 160 it has been calibrated on a per-unit basis. TI's reference fw selects the | |
| 161 ALGO_AFC_LQG_PREDICTOR AFC algorithm which does not use this afcdac setting | |
| 162 at all, but perhaps Pirelli's fw does something different because of their use | |
| 163 of a VCTCXO instead of a "plain" VCXO - we don't know, and the reverse eng | |
| 164 effort to find the needed answers would be more than we can currently justify. |
