6a3054f1c32c11fef1df35b0d4a1e5d51408b900
[openwrt/svn-archive/archive.git] / utils / calvaria / files / src / cal2p54.c
1 /*
2 * cal2p54 - CAL to p54spi EEPROM converter
3 *
4 * Copyright (c) 2011 Michael Buesch <mb@bu3sch.de>
5 *
6 * Licensed under the GNU General Public License version 2.
7 */
8
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <errno.h>
13 #include <stdint.h>
14 #include <unistd.h>
15 #include <fcntl.h>
16 #include <sys/mman.h>
17
18
19 /* Template data from Linux p54spi_eeprom.h:
20 *
21 * Copyright (C) 2003 Conexant Americas Inc. All Rights Reserved.
22 * Copyright (C) 2004, 2005, 2006 Nokia Corporation
23 * Copyright 2008 Johannes Berg <johannes@sipsolutions.net>
24 * Copyright 2008 Christian Lamparter <chunkeey@web.de>
25 *
26 * based on:
27 * - cx3110x's pda.h from Nokia
28 * - cx3110-transfer.log by Johannes Berg
29 */
30
31 static const uint8_t template_eeprom_pda_wrap[] = {
32 /* struct eeprom_pda_wrap */
33 0x47, 0x4d, 0x55, 0xaa, /* magic */
34 0x00, 0x00, /* pad */
35 0x00, 0x00, /* eeprom_pda_data_wrap length */
36 0x00, 0x00, 0x00, 0x00, /* arm opcode */
37 };
38
39 static const uint8_t template_mac_address[] = {
40 /* bogus MAC address */
41 0x04, 0x00, 0x01, 0x01, /* PDR_MAC_ADDRESS */
42 0x00, 0x02, 0xee, 0xc0, 0xff, 0xee,
43 };
44
45 static const uint8_t template_bootrec_exp_if[] = {
46 /* struct bootrec_exp_if */
47 0x06, 0x00, 0x01, 0x10, /* PDR_INTERFACE_LIST */
48 0x00, 0x00, /* role */
49 0x0f, 0x00, /* if_id */
50 0x85, 0x00, /* variant = Longbow RF, 2GHz */
51 0x01, 0x00, /* btm_compat */
52 0x1f, 0x00, /* top_compat */
53
54 0x03, 0x00, 0x02, 0x10, /* PDR_HARDWARE_PLATFORM_COMPONENT_ID */
55 0x03, 0x20, 0x00, 0x43,
56 };
57
58 static const uint8_t template_pda_country_list[] = {
59 /* struct pda_country[6] */
60 0x0d, 0x00, 0x07, 0x10, /* PDR_COUNTRY_LIST */
61 0x10, 0x00, 0x00, 0x00,
62 0x20, 0x00, 0x00, 0x00,
63 0x30, 0x00, 0x00, 0x00,
64 0x31, 0x00, 0x00, 0x00,
65 0x32, 0x00, 0x00, 0x00,
66 0x40, 0x00, 0x00, 0x00,
67 };
68
69 static const uint8_t template_pda_country[] = {
70 /* struct pda_country */
71 0x03, 0x00, 0x08, 0x10, /* PDR_DEFAULT_COUNTRY */
72 0x30, 0x00, 0x00, 0x00, /* ETSI */
73
74 0x03, 0x00, 0x00, 0x11, /* PDR_ANTENNA_GAIN */
75 0x08, 0x08, 0x08, 0x08,
76
77 0x09, 0x00, 0xad, 0xde, /* PDR_RSSI_LINEAR_APPROXIMATION_CUSTOM */
78 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80 };
81
82 static const uint8_t template_pa_cal_curve[] = {
83 /* struct pda_custom_wrapper */
84 0x10, 0x06, 0x5d, 0xb0, /* PDR_PRISM_PA_CAL_CURVE_DATA_CUSTOM */
85 0x0d, 0x00, 0xee, 0x00, /* 13 entries, 238 bytes per entry */
86 0x00, 0x00, 0x16, 0x0c, /* no offset, 3094 total len */
87 /* 2412 MHz */
88 0x6c, 0x09,
89 0x10, 0x01, 0x9a, 0x84,
90 0xaa, 0x8a, 0xaa, 0x8a, 0xaa, 0x8a, 0xaa, 0x8a,
91 0x3c, 0xb6, 0x3c, 0xb6, 0x3c, 0xb6, 0x3c, 0xb6,
92 0x3c, 0xb6, 0x3c, 0xb6, 0x3c, 0xb6, 0x3c, 0xb6,
93 0xf0, 0x00, 0x94, 0x6c,
94 0x99, 0x82, 0x99, 0x82, 0x99, 0x82, 0x99, 0x82,
95 0x2b, 0xae, 0x2b, 0xae, 0x2b, 0xae, 0x2b, 0xae,
96 0x2b, 0xae, 0x2b, 0xae, 0x2b, 0xae, 0x2b, 0xae,
97 0xd0, 0x00, 0xaa, 0x5a,
98 0x88, 0x7a, 0x88, 0x7a, 0x88, 0x7a, 0x88, 0x7a,
99 0x1a, 0xa6, 0x1a, 0xa6, 0x1a, 0xa6, 0x1a, 0xa6,
100 0x1a, 0xa6, 0x1a, 0xa6, 0x1a, 0xa6, 0x1a, 0xa6,
101 0xa0, 0x00, 0xf3, 0x47,
102 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e,
103 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a,
104 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x9a,
105 0x50, 0x00, 0x59, 0x36,
106 0x43, 0x5a, 0x43, 0x5a, 0x43, 0x5a, 0x43, 0x5a,
107 0xd5, 0x85, 0xd5, 0x85, 0xd5, 0x85, 0xd5, 0x85,
108 0xd5, 0x85, 0xd5, 0x85, 0xd5, 0x85, 0xd5, 0x85,
109 0x00, 0x00, 0xe4, 0x2d,
110 0x18, 0x46, 0x18, 0x46, 0x18, 0x46, 0x18, 0x46,
111 0xaa, 0x71, 0xaa, 0x71, 0xaa, 0x71, 0xaa, 0x71,
112 0xaa, 0x71, 0xaa, 0x71, 0xaa, 0x71, 0xaa, 0x71,
113 0x00, 0x80, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x80, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
123
124 /* 2417 MHz */
125 0x71, 0x09,
126 0x10, 0x01, 0xb9, 0x83,
127 0x7d, 0x8a, 0x7d, 0x8a, 0x7d, 0x8a, 0x7d, 0x8a,
128 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6,
129 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6,
130 0xf0, 0x00, 0x2e, 0x6c,
131 0x68, 0x82, 0x68, 0x82, 0x68, 0x82, 0x68, 0x82,
132 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad,
133 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad,
134 0xd0, 0x00, 0x8d, 0x5a,
135 0x52, 0x7a, 0x52, 0x7a, 0x52, 0x7a, 0x52, 0x7a,
136 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5,
137 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5,
138 0xa0, 0x00, 0x0a, 0x48,
139 0x32, 0x6e, 0x32, 0x6e, 0x32, 0x6e, 0x32, 0x6e,
140 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99,
141 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99,
142 0x50, 0x00, 0x7c, 0x36,
143 0xfc, 0x59, 0xfc, 0x59, 0xfc, 0x59, 0xfc, 0x59,
144 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85,
145 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85,
146 0x00, 0x00, 0xf5, 0x2d,
147 0xc6, 0x45, 0xc6, 0x45, 0xc6, 0x45, 0xc6, 0x45,
148 0x58, 0x71, 0x58, 0x71, 0x58, 0x71, 0x58, 0x71,
149 0x58, 0x71, 0x58, 0x71, 0x58, 0x71, 0x58, 0x71,
150 0x00, 0x80, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x80, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
160
161 /* 2422 MHz */
162 0x76, 0x09,
163 0x10, 0x01, 0xb9, 0x83,
164 0x7d, 0x8a, 0x7d, 0x8a, 0x7d, 0x8a, 0x7d, 0x8a,
165 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6,
166 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6, 0x0f, 0xb6,
167 0xf0, 0x00, 0x2e, 0x6c,
168 0x68, 0x82, 0x68, 0x82, 0x68, 0x82, 0x68, 0x82,
169 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad,
170 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad, 0xfa, 0xad,
171 0xd0, 0x00, 0x8d, 0x5a,
172 0x52, 0x7a, 0x52, 0x7a, 0x52, 0x7a, 0x52, 0x7a,
173 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5,
174 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5, 0xe4, 0xa5,
175 0xa0, 0x00, 0x0a, 0x48,
176 0x32, 0x6e, 0x32, 0x6e, 0x32, 0x6e, 0x32, 0x6e,
177 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99,
178 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99, 0xc4, 0x99,
179 0x50, 0x00, 0x7c, 0x36,
180 0xfc, 0x59, 0xfc, 0x59, 0xfc, 0x59, 0xfc, 0x59,
181 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85,
182 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85, 0x8e, 0x85,
183 0x00, 0x00, 0xf5, 0x2d,
184 0xc6, 0x45, 0xc6, 0x45, 0xc6, 0x45, 0xc6, 0x45,
185 0x58, 0x71, 0x58, 0x71, 0x58, 0x71, 0x58, 0x71,
186 0x58, 0x71, 0x58, 0x71, 0x58, 0x71, 0x58, 0x71,
187 0x00, 0x80, 0x00, 0x00,
188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
189 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
191 0x00, 0x80, 0x00, 0x00,
192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195 0x00, 0x00, 0x00, 0x00,
196 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
197
198 /* 2427 MHz */
199 0x7b, 0x09,
200 0x10, 0x01, 0x48, 0x83,
201 0x67, 0x8a, 0x67, 0x8a, 0x67, 0x8a, 0x67, 0x8a,
202 0xf9, 0xb5, 0xf9, 0xb5, 0xf9, 0xb5, 0xf9, 0xb5,
203 0xf9, 0xb5, 0xf9, 0xb5, 0xf9, 0xb5, 0xf9, 0xb5,
204 0xf0, 0x00, 0xfb, 0x6b,
205 0x50, 0x82, 0x50, 0x82, 0x50, 0x82, 0x50, 0x82,
206 0xe2, 0xad, 0xe2, 0xad, 0xe2, 0xad, 0xe2, 0xad,
207 0xe2, 0xad, 0xe2, 0xad, 0xe2, 0xad, 0xe2, 0xad,
208 0xd0, 0x00, 0x7e, 0x5a,
209 0x38, 0x7a, 0x38, 0x7a, 0x38, 0x7a, 0x38, 0x7a,
210 0xca, 0xa5, 0xca, 0xa5, 0xca, 0xa5, 0xca, 0xa5,
211 0xca, 0xa5, 0xca, 0xa5, 0xca, 0xa5, 0xca, 0xa5,
212 0xa0, 0x00, 0x15, 0x48,
213 0x14, 0x6e, 0x14, 0x6e, 0x14, 0x6e, 0x14, 0x6e,
214 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99,
215 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99, 0xa6, 0x99,
216 0x50, 0x00, 0x8e, 0x36,
217 0xd9, 0x59, 0xd9, 0x59, 0xd9, 0x59, 0xd9, 0x59,
218 0x6b, 0x85, 0x6b, 0x85, 0x6b, 0x85, 0x6b, 0x85,
219 0x6b, 0x85, 0x6b, 0x85, 0x6b, 0x85, 0x6b, 0x85,
220 0x00, 0x00, 0xfe, 0x2d,
221 0x9d, 0x45, 0x9d, 0x45, 0x9d, 0x45, 0x9d, 0x45,
222 0x2f, 0x71, 0x2f, 0x71, 0x2f, 0x71, 0x2f, 0x71,
223 0x2f, 0x71, 0x2f, 0x71, 0x2f, 0x71, 0x2f, 0x71,
224 0x00, 0x80, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x80, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
234
235 /* 2432 MHz */
236 0x80, 0x09,
237 0x10, 0x01, 0xd7, 0x82,
238 0x51, 0x8a, 0x51, 0x8a, 0x51, 0x8a, 0x51, 0x8a,
239 0xe3, 0xb5, 0xe3, 0xb5, 0xe3, 0xb5, 0xe3, 0xb5,
240 0xe3, 0xb5, 0xe3, 0xb5, 0xe3, 0xb5, 0xe3, 0xb5,
241 0xf0, 0x00, 0xc8, 0x6b,
242 0x37, 0x82, 0x37, 0x82, 0x37, 0x82, 0x37, 0x82,
243 0xc9, 0xad, 0xc9, 0xad, 0xc9, 0xad, 0xc9, 0xad,
244 0xc9, 0xad, 0xc9, 0xad, 0xc9, 0xad, 0xc9, 0xad,
245 0xd0, 0x00, 0x6f, 0x5a,
246 0x1d, 0x7a, 0x1d, 0x7a, 0x1d, 0x7a, 0x1d, 0x7a,
247 0xaf, 0xa5, 0xaf, 0xa5, 0xaf, 0xa5, 0xaf, 0xa5,
248 0xaf, 0xa5, 0xaf, 0xa5, 0xaf, 0xa5, 0xaf, 0xa5,
249 0xa0, 0x00, 0x20, 0x48,
250 0xf6, 0x6d, 0xf6, 0x6d, 0xf6, 0x6d, 0xf6, 0x6d,
251 0x88, 0x99, 0x88, 0x99, 0x88, 0x99, 0x88, 0x99,
252 0x88, 0x99, 0x88, 0x99, 0x88, 0x99, 0x88, 0x99,
253 0x50, 0x00, 0x9f, 0x36,
254 0xb5, 0x59, 0xb5, 0x59, 0xb5, 0x59, 0xb5, 0x59,
255 0x47, 0x85, 0x47, 0x85, 0x47, 0x85, 0x47, 0x85,
256 0x47, 0x85, 0x47, 0x85, 0x47, 0x85, 0x47, 0x85,
257 0x00, 0x00, 0x06, 0x2e,
258 0x74, 0x45, 0x74, 0x45, 0x74, 0x45, 0x74, 0x45,
259 0x06, 0x71, 0x06, 0x71, 0x06, 0x71, 0x06, 0x71,
260 0x06, 0x71, 0x06, 0x71, 0x06, 0x71, 0x06, 0x71,
261 0x00, 0x80, 0x00, 0x00,
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
265 0x00, 0x80, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
271
272 /* 2437 MHz */
273 0x85, 0x09,
274 0x10, 0x01, 0x67, 0x82,
275 0x3a, 0x8a, 0x3a, 0x8a, 0x3a, 0x8a, 0x3a, 0x8a,
276 0xcc, 0xb5, 0xcc, 0xb5, 0xcc, 0xb5, 0xcc, 0xb5,
277 0xcc, 0xb5, 0xcc, 0xb5, 0xcc, 0xb5, 0xcc, 0xb5,
278 0xf0, 0x00, 0x95, 0x6b,
279 0x1f, 0x82, 0x1f, 0x82, 0x1f, 0x82, 0x1f, 0x82,
280 0xb1, 0xad, 0xb1, 0xad, 0xb1, 0xad, 0xb1, 0xad,
281 0xb1, 0xad, 0xb1, 0xad, 0xb1, 0xad, 0xb1, 0xad,
282 0xd0, 0x00, 0x61, 0x5a,
283 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x7a, 0x02, 0x7a,
284 0x94, 0xa5, 0x94, 0xa5, 0x94, 0xa5, 0x94, 0xa5,
285 0x94, 0xa5, 0x94, 0xa5, 0x94, 0xa5, 0x94, 0xa5,
286 0xa0, 0x00, 0x2c, 0x48,
287 0xd8, 0x6d, 0xd8, 0x6d, 0xd8, 0x6d, 0xd8, 0x6d,
288 0x6a, 0x99, 0x6a, 0x99, 0x6a, 0x99, 0x6a, 0x99,
289 0x6a, 0x99, 0x6a, 0x99, 0x6a, 0x99, 0x6a, 0x99,
290 0x50, 0x00, 0xb1, 0x36,
291 0x92, 0x59, 0x92, 0x59, 0x92, 0x59, 0x92, 0x59,
292 0x24, 0x85, 0x24, 0x85, 0x24, 0x85, 0x24, 0x85,
293 0x24, 0x85, 0x24, 0x85, 0x24, 0x85, 0x24, 0x85,
294 0x00, 0x00, 0x0f, 0x2e,
295 0x4b, 0x45, 0x4b, 0x45, 0x4b, 0x45, 0x4b, 0x45,
296 0xdd, 0x70, 0xdd, 0x70, 0xdd, 0x70, 0xdd, 0x70,
297 0xdd, 0x70, 0xdd, 0x70, 0xdd, 0x70, 0xdd, 0x70,
298 0x00, 0x80, 0x00, 0x00,
299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x80, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
306 0x00, 0x00, 0x00, 0x00,
307 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
308
309 /* 2442 MHz */
310 0x8a, 0x09,
311 0x10, 0x01, 0xf6, 0x81,
312 0x24, 0x8a, 0x24, 0x8a, 0x24, 0x8a, 0x24, 0x8a,
313 0xb6, 0xb5, 0xb6, 0xb5, 0xb6, 0xb5, 0xb6, 0xb5,
314 0xb6, 0xb5, 0xb6, 0xb5, 0xb6, 0xb5, 0xb6, 0xb5,
315 0xf0, 0x00, 0x62, 0x6b,
316 0x06, 0x82, 0x06, 0x82, 0x06, 0x82, 0x06, 0x82,
317 0x98, 0xad, 0x98, 0xad, 0x98, 0xad, 0x98, 0xad,
318 0x98, 0xad, 0x98, 0xad, 0x98, 0xad, 0x98, 0xad,
319 0xd0, 0x00, 0x52, 0x5a,
320 0xe7, 0x79, 0xe7, 0x79, 0xe7, 0x79, 0xe7, 0x79,
321 0x79, 0xa5, 0x79, 0xa5, 0x79, 0xa5, 0x79, 0xa5,
322 0x79, 0xa5, 0x79, 0xa5, 0x79, 0xa5, 0x79, 0xa5,
323 0xa0, 0x00, 0x37, 0x48,
324 0xba, 0x6d, 0xba, 0x6d, 0xba, 0x6d, 0xba, 0x6d,
325 0x4c, 0x99, 0x4c, 0x99, 0x4c, 0x99, 0x4c, 0x99,
326 0x4c, 0x99, 0x4c, 0x99, 0x4c, 0x99, 0x4c, 0x99,
327 0x50, 0x00, 0xc2, 0x36,
328 0x6e, 0x59, 0x6e, 0x59, 0x6e, 0x59, 0x6e, 0x59,
329 0x00, 0x85, 0x00, 0x85, 0x00, 0x85, 0x00, 0x85,
330 0x00, 0x85, 0x00, 0x85, 0x00, 0x85, 0x00, 0x85,
331 0x00, 0x00, 0x17, 0x2e,
332 0x22, 0x45, 0x22, 0x45, 0x22, 0x45, 0x22, 0x45,
333 0xb4, 0x70, 0xb4, 0x70, 0xb4, 0x70, 0xb4, 0x70,
334 0xb4, 0x70, 0xb4, 0x70, 0xb4, 0x70, 0xb4, 0x70,
335 0x00, 0x80, 0x00, 0x00,
336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
339 0x00, 0x80, 0x00, 0x00,
340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x00, 0x00, 0x00, 0x00,
344 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
345
346 /* 2447 MHz */
347 0x8f, 0x09,
348 0x10, 0x01, 0x75, 0x83,
349 0x61, 0x8a, 0x61, 0x8a, 0x61, 0x8a, 0x61, 0x8a,
350 0xf3, 0xb5, 0xf3, 0xb5, 0xf3, 0xb5, 0xf3, 0xb5,
351 0xf3, 0xb5, 0xf3, 0xb5, 0xf3, 0xb5, 0xf3, 0xb5,
352 0xf0, 0x00, 0x4b, 0x6c,
353 0x3f, 0x82, 0x3f, 0x82, 0x3f, 0x82, 0x3f, 0x82,
354 0xd1, 0xad, 0xd1, 0xad, 0xd1, 0xad, 0xd1, 0xad,
355 0xd1, 0xad, 0xd1, 0xad, 0xd1, 0xad, 0xd1, 0xad,
356 0xd0, 0x00, 0xda, 0x5a,
357 0x1c, 0x7a, 0x1c, 0x7a, 0x1c, 0x7a, 0x1c, 0x7a,
358 0xae, 0xa5, 0xae, 0xa5, 0xae, 0xa5, 0xae, 0xa5,
359 0xae, 0xa5, 0xae, 0xa5, 0xae, 0xa5, 0xae, 0xa5,
360 0xa0, 0x00, 0x6d, 0x48,
361 0xe9, 0x6d, 0xe9, 0x6d, 0xe9, 0x6d, 0xe9, 0x6d,
362 0x7b, 0x99, 0x7b, 0x99, 0x7b, 0x99, 0x7b, 0x99,
363 0x7b, 0x99, 0x7b, 0x99, 0x7b, 0x99, 0x7b, 0x99,
364 0x50, 0x00, 0xc6, 0x36,
365 0x92, 0x59, 0x92, 0x59, 0x92, 0x59, 0x92, 0x59,
366 0x24, 0x85, 0x24, 0x85, 0x24, 0x85, 0x24, 0x85,
367 0x24, 0x85, 0x24, 0x85, 0x24, 0x85, 0x24, 0x85,
368 0x00, 0x00, 0x15, 0x2e,
369 0x3c, 0x45, 0x3c, 0x45, 0x3c, 0x45, 0x3c, 0x45,
370 0xce, 0x70, 0xce, 0x70, 0xce, 0x70, 0xce, 0x70,
371 0xce, 0x70, 0xce, 0x70, 0xce, 0x70, 0xce, 0x70,
372 0x00, 0x80, 0x00, 0x00,
373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
376 0x00, 0x80, 0x00, 0x00,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x00, 0x00, 0x00, 0x00,
381 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
382
383 /* 2452 MHz */
384 0x94, 0x09,
385 0x10, 0x01, 0xf4, 0x84,
386 0x9e, 0x8a, 0x9e, 0x8a, 0x9e, 0x8a, 0x9e, 0x8a,
387 0x30, 0xb6, 0x30, 0xb6, 0x30, 0xb6, 0x30, 0xb6,
388 0x30, 0xb6, 0x30, 0xb6, 0x30, 0xb6, 0x30, 0xb6,
389 0xf0, 0x00, 0x34, 0x6d,
390 0x77, 0x82, 0x77, 0x82, 0x77, 0x82, 0x77, 0x82,
391 0x09, 0xae, 0x09, 0xae, 0x09, 0xae, 0x09, 0xae,
392 0x09, 0xae, 0x09, 0xae, 0x09, 0xae, 0x09, 0xae,
393 0xd0, 0x00, 0x62, 0x5b,
394 0x50, 0x7a, 0x50, 0x7a, 0x50, 0x7a, 0x50, 0x7a,
395 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5,
396 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5, 0xe2, 0xa5,
397 0xa0, 0x00, 0xa2, 0x48,
398 0x17, 0x6e, 0x17, 0x6e, 0x17, 0x6e, 0x17, 0x6e,
399 0xa9, 0x99, 0xa9, 0x99, 0xa9, 0x99, 0xa9, 0x99,
400 0xa9, 0x99, 0xa9, 0x99, 0xa9, 0x99, 0xa9, 0x99,
401 0x50, 0x00, 0xc9, 0x36,
402 0xb7, 0x59, 0xb7, 0x59, 0xb7, 0x59, 0xb7, 0x59,
403 0x49, 0x85, 0x49, 0x85, 0x49, 0x85, 0x49, 0x85,
404 0x49, 0x85, 0x49, 0x85, 0x49, 0x85, 0x49, 0x85,
405 0x00, 0x00, 0x12, 0x2e,
406 0x57, 0x45, 0x57, 0x45, 0x57, 0x45, 0x57, 0x45,
407 0xe9, 0x70, 0xe9, 0x70, 0xe9, 0x70, 0xe9, 0x70,
408 0xe9, 0x70, 0xe9, 0x70, 0xe9, 0x70, 0xe9, 0x70,
409 0x00, 0x80, 0x00, 0x00,
410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413 0x00, 0x80, 0x00, 0x00,
414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
417 0x00, 0x00, 0x00, 0x00,
418 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
419
420 /* 2452 MHz */
421 0x99, 0x09,
422 0x10, 0x01, 0x74, 0x86,
423 0xdb, 0x8a, 0xdb, 0x8a, 0xdb, 0x8a, 0xdb, 0x8a,
424 0x6d, 0xb6, 0x6d, 0xb6, 0x6d, 0xb6, 0x6d, 0xb6,
425 0x6d, 0xb6, 0x6d, 0xb6, 0x6d, 0xb6, 0x6d, 0xb6,
426 0xf0, 0x00, 0x1e, 0x6e,
427 0xb0, 0x82, 0xb0, 0x82, 0xb0, 0x82, 0xb0, 0x82,
428 0x42, 0xae, 0x42, 0xae, 0x42, 0xae, 0x42, 0xae,
429 0x42, 0xae, 0x42, 0xae, 0x42, 0xae, 0x42, 0xae,
430 0xd0, 0x00, 0xeb, 0x5b,
431 0x85, 0x7a, 0x85, 0x7a, 0x85, 0x7a, 0x85, 0x7a,
432 0x17, 0xa6, 0x17, 0xa6, 0x17, 0xa6, 0x17, 0xa6,
433 0x17, 0xa6, 0x17, 0xa6, 0x17, 0xa6, 0x17, 0xa6,
434 0xa0, 0x00, 0xd8, 0x48,
435 0x46, 0x6e, 0x46, 0x6e, 0x46, 0x6e, 0x46, 0x6e,
436 0xd8, 0x99, 0xd8, 0x99, 0xd8, 0x99, 0xd8, 0x99,
437 0xd8, 0x99, 0xd8, 0x99, 0xd8, 0x99, 0xd8, 0x99,
438 0x50, 0x00, 0xcd, 0x36,
439 0xdb, 0x59, 0xdb, 0x59, 0xdb, 0x59, 0xdb, 0x59,
440 0x6d, 0x85, 0x6d, 0x85, 0x6d, 0x85, 0x6d, 0x85,
441 0x6d, 0x85, 0x6d, 0x85, 0x6d, 0x85, 0x6d, 0x85,
442 0x00, 0x00, 0x10, 0x2e,
443 0x71, 0x45, 0x71, 0x45, 0x71, 0x45, 0x71, 0x45,
444 0x03, 0x71, 0x03, 0x71, 0x03, 0x71, 0x03, 0x71,
445 0x03, 0x71, 0x03, 0x71, 0x03, 0x71, 0x03, 0x71,
446 0x00, 0x80, 0x00, 0x00,
447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
449 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450 0x00, 0x80, 0x00, 0x00,
451 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454 0x00, 0x00, 0x00, 0x00,
455 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
456
457 /* 2557 MHz */
458 0x9e, 0x09,
459 0x10, 0x01, 0xf3, 0x87,
460 0x17, 0x8b, 0x17, 0x8b, 0x17, 0x8b, 0x17, 0x8b,
461 0xa9, 0xb6, 0xa9, 0xb6, 0xa9, 0xb6, 0xa9, 0xb6,
462 0xa9, 0xb6, 0xa9, 0xb6, 0xa9, 0xb6, 0xa9, 0xb6,
463 0xf0, 0x00, 0x07, 0x6f,
464 0xe9, 0x82, 0xe9, 0x82, 0xe9, 0x82, 0xe9, 0x82,
465 0x7b, 0xae, 0x7b, 0xae, 0x7b, 0xae, 0x7b, 0xae,
466 0x7b, 0xae, 0x7b, 0xae, 0x7b, 0xae, 0x7b, 0xae,
467 0xd0, 0x00, 0x73, 0x5c,
468 0xba, 0x7a, 0xba, 0x7a, 0xba, 0x7a, 0xba, 0x7a,
469 0x4c, 0xa6, 0x4c, 0xa6, 0x4c, 0xa6, 0x4c, 0xa6,
470 0x4c, 0xa6, 0x4c, 0xa6, 0x4c, 0xa6, 0x4c, 0xa6,
471 0xa0, 0x00, 0x0d, 0x49,
472 0x74, 0x6e, 0x74, 0x6e, 0x74, 0x6e, 0x74, 0x6e,
473 0x06, 0x9a, 0x06, 0x9a, 0x06, 0x9a, 0x06, 0x9a,
474 0x06, 0x9a, 0x06, 0x9a, 0x06, 0x9a, 0x06, 0x9a,
475 0x50, 0x00, 0xd1, 0x36,
476 0xff, 0x59, 0xff, 0x59, 0xff, 0x59, 0xff, 0x59,
477 0x91, 0x85, 0x91, 0x85, 0x91, 0x85, 0x91, 0x85,
478 0x91, 0x85, 0x91, 0x85, 0x91, 0x85, 0x91, 0x85,
479 0x00, 0x00, 0x0e, 0x2e,
480 0x8b, 0x45, 0x8b, 0x45, 0x8b, 0x45, 0x8b, 0x45,
481 0x1d, 0x71, 0x1d, 0x71, 0x1d, 0x71, 0x1d, 0x71,
482 0x1d, 0x71, 0x1d, 0x71, 0x1d, 0x71, 0x1d, 0x71,
483 0x00, 0x80, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x80, 0x00, 0x00,
488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491 0x00, 0x00, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
493
494 /* 2562 MHz */
495 0xa3, 0x09,
496 0x10, 0x01, 0x72, 0x89,
497 0x54, 0x8b, 0x54, 0x8b, 0x54, 0x8b, 0x54, 0x8b,
498 0xe6, 0xb6, 0xe6, 0xb6, 0xe6, 0xb6, 0xe6, 0xb6,
499 0xe6, 0xb6, 0xe6, 0xb6, 0xe6, 0xb6, 0xe6, 0xb6,
500 0xf0, 0x00, 0xf0, 0x6f,
501 0x21, 0x83, 0x21, 0x83, 0x21, 0x83, 0x21, 0x83,
502 0xb3, 0xae, 0xb3, 0xae, 0xb3, 0xae, 0xb3, 0xae,
503 0xb3, 0xae, 0xb3, 0xae, 0xb3, 0xae, 0xb3, 0xae,
504 0xd0, 0x00, 0xfb, 0x5c,
505 0xee, 0x7a, 0xee, 0x7a, 0xee, 0x7a, 0xee, 0x7a,
506 0x80, 0xa6, 0x80, 0xa6, 0x80, 0xa6, 0x80, 0xa6,
507 0x80, 0xa6, 0x80, 0xa6, 0x80, 0xa6, 0x80, 0xa6,
508 0xa0, 0x00, 0x43, 0x49,
509 0xa3, 0x6e, 0xa3, 0x6e, 0xa3, 0x6e, 0xa3, 0x6e,
510 0x35, 0x9a, 0x35, 0x9a, 0x35, 0x9a, 0x35, 0x9a,
511 0x35, 0x9a, 0x35, 0x9a, 0x35, 0x9a, 0x35, 0x9a,
512 0x50, 0x00, 0xd4, 0x36,
513 0x24, 0x5a, 0x24, 0x5a, 0x24, 0x5a, 0x24, 0x5a,
514 0xb6, 0x85, 0xb6, 0x85, 0xb6, 0x85, 0xb6, 0x85,
515 0xb6, 0x85, 0xb6, 0x85, 0xb6, 0x85, 0xb6, 0x85,
516 0x00, 0x00, 0x0b, 0x2e,
517 0xa6, 0x45, 0xa6, 0x45, 0xa6, 0x45, 0xa6, 0x45,
518 0x38, 0x71, 0x38, 0x71, 0x38, 0x71, 0x38, 0x71,
519 0x38, 0x71, 0x38, 0x71, 0x38, 0x71, 0x38, 0x71,
520 0x00, 0x80, 0x00, 0x00,
521 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
524 0x00, 0x80, 0x00, 0x00,
525 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
527 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
528 0x00, 0x00, 0x00, 0x00,
529 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
530
531 /* 2572 MHz */
532 0xa8, 0x09,
533 0x10, 0x01, 0xf1, 0x8a,
534 0x91, 0x8b, 0x91, 0x8b, 0x91, 0x8b, 0x91, 0x8b,
535 0x23, 0xb7, 0x23, 0xb7, 0x23, 0xb7, 0x23, 0xb7,
536 0x23, 0xb7, 0x23, 0xb7, 0x23, 0xb7, 0x23, 0xb7,
537 0xf0, 0x00, 0xd9, 0x70,
538 0x5a, 0x83, 0x5a, 0x83, 0x5a, 0x83, 0x5a, 0x83,
539 0xec, 0xae, 0xec, 0xae, 0xec, 0xae, 0xec, 0xae,
540 0xec, 0xae, 0xec, 0xae, 0xec, 0xae, 0xec, 0xae,
541 0xd0, 0x00, 0x83, 0x5d,
542 0x23, 0x7b, 0x23, 0x7b, 0x23, 0x7b, 0x23, 0x7b,
543 0xb5, 0xa6, 0xb5, 0xa6, 0xb5, 0xa6, 0xb5, 0xa6,
544 0xb5, 0xa6, 0xb5, 0xa6, 0xb5, 0xa6, 0xb5, 0xa6,
545 0xa0, 0x00, 0x78, 0x49,
546 0xd1, 0x6e, 0xd1, 0x6e, 0xd1, 0x6e, 0xd1, 0x6e,
547 0x63, 0x9a, 0x63, 0x9a, 0x63, 0x9a, 0x63, 0x9a,
548 0x63, 0x9a, 0x63, 0x9a, 0x63, 0x9a, 0x63, 0x9a,
549 0x50, 0x00, 0xd8, 0x36,
550 0x48, 0x5a, 0x48, 0x5a, 0x48, 0x5a, 0x48, 0x5a,
551 0xda, 0x85, 0xda, 0x85, 0xda, 0x85, 0xda, 0x85,
552 0xda, 0x85, 0xda, 0x85, 0xda, 0x85, 0xda, 0x85,
553 0x00, 0x00, 0x09, 0x2e,
554 0xc0, 0x45, 0xc0, 0x45, 0xc0, 0x45, 0xc0, 0x45,
555 0x52, 0x71, 0x52, 0x71, 0x52, 0x71, 0x52, 0x71,
556 0x52, 0x71, 0x52, 0x71, 0x52, 0x71, 0x52, 0x71,
557 0x00, 0x80, 0x00, 0x00,
558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
559 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
560 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
561 0x00, 0x80, 0x00, 0x00,
562 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
563 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 0x00, 0x00, 0x00, 0x00,
566 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00,
567 };
568
569 /*
570 * Not really sure if this is actually the power_limit database,
571 * it looks a bit "related" to PDR_PRISM_ZIF_TX_IQ_CALIBRATION
572 */
573 static const uint8_t template_pa_cal_output_power_limits[] = {
574 /* struct pda_custom_wrapper */
575 0xae, 0x00, 0xef, 0xbe, /* PDR_PRISM_PA_CAL_OUTPUT_POWER_LIMITS_CUSTOM */
576 0x0d, 0x00, 0x1a, 0x00, /* 13 entries, 26 bytes per entry */
577 0x00, 0x00, 0x52, 0x01, /* no offset, 338 bytes total */
578
579 /* 2412 MHz */
580 0x6c, 0x09,
581 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
582 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xe0, 0x00,
583 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
584
585 /* 2417 MHz */
586 0x71, 0x09,
587 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
588 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
589 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
590
591 /* 2422 MHz */
592 0x76, 0x09,
593 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
594 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
595 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
596
597 /* 2427 MHz */
598 0x7b, 0x09,
599 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
600 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
601 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
602
603 /* 2432 MHz */
604 0x80, 0x09,
605 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
606 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
607 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
608
609 /* 2437 MHz */
610 0x85, 0x09,
611 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
612 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
613 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
614
615 /* 2442 MHz */
616 0x8a, 0x09,
617 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
618 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
619 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
620
621 /* 2447 MHz */
622 0x8f, 0x09,
623 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
624 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
625 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
626
627 /* 2452 MHz */
628 0x94, 0x09,
629 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
630 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
631 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
632
633 /* 2457 MHz */
634 0x99, 0x09,
635 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
636 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
637 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
638
639 /* 2462 MHz */
640 0x9e, 0x09,
641 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
642 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
643 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
644
645 /* 2467 MHz */
646 0xa3, 0x09,
647 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
648 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
649 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
650
651 /* 2472 MHz */
652 0xa8, 0x09,
653 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01,
654 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00,
655 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00,
656 };
657
658 static const uint8_t template_pda_iq_autocal[] = {
659 /* struct pda_iq_autocal_entry[13] */
660 0x42, 0x00, 0x06, 0x19, /* PDR_PRISM_ZIF_TX_IQ_CALIBRATION */
661 /* 2412 MHz */
662 0x6c, 0x09, 0x26, 0x00, 0xf8, 0xff, 0xf7, 0xff, 0xff, 0x00,
663 /* 2417 MHz */
664 0x71, 0x09, 0x26, 0x00, 0xf8, 0xff, 0xf7, 0xff, 0xff, 0x00,
665 /* 2422 MHz */
666 0x76, 0x09, 0x26, 0x00, 0xf8, 0xff, 0xf7, 0xff, 0xff, 0x00,
667 /* 2427 MHz */
668 0x7b, 0x09, 0x26, 0x00, 0xf8, 0xff, 0xf7, 0xff, 0xff, 0x00,
669 /* 2432 MHz */
670 0x80, 0x09, 0x25, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00,
671 /* 2437 MHz */
672 0x85, 0x09, 0x25, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00,
673 /* 2442 MHz */
674 0x8a, 0x09, 0x25, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00,
675 /* 2447 MHz */
676 0x8f, 0x09, 0x25, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00,
677 /* 2452 MHz */
678 0x94, 0x09, 0x25, 0x00, 0xf7, 0xff, 0xf7, 0xff, 0xff, 0x00,
679 /* 2457 MHz */
680 0x99, 0x09, 0x25, 0x00, 0xf5, 0xff, 0xf9, 0xff, 0x00, 0x01,
681 /* 2462 MHz */
682 0x9e, 0x09, 0x25, 0x00, 0xf5, 0xff, 0xf9, 0xff, 0x00, 0x01,
683 /* 2467 MHz */
684 0xa3, 0x09, 0x25, 0x00, 0xf5, 0xff, 0xf9, 0xff, 0x00, 0x01,
685 /* 2472 MHz */
686 0xa8, 0x09, 0x25, 0x00, 0xf5, 0xff, 0xf9, 0xff, 0x00, 0x01,
687 };
688
689 static const uint8_t template_pdr_end[] = {
690 0x02, 0x00, 0x00, 0x00, /* PDR_END */
691 /* CRC 0x67, 0x99, */
692 };
693
694 /* linux/lib/crc-ccitt.c
695 *
696 * This mysterious table is just the CRC of each possible byte. It can be
697 * computed using the standard bit-at-a-time methods. The polynomial can
698 * be seen in entry 128, 0x8408. This corresponds to x^0 + x^5 + x^12.
699 * Add the implicit x^16, and you have the standard CRC-CCITT.
700 */
701 static uint16_t const crc_ccitt_table[256] = {
702 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
703 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
704 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
705 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
706 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
707 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
708 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
709 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
710 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
711 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
712 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
713 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
714 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
715 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
716 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
717 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
718 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
719 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
720 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
721 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
722 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
723 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
724 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
725 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
726 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
727 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
728 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
729 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
730 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
731 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
732 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
733 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
734 };
735
736 static inline uint16_t crc_ccitt_byte(uint16_t crc, const uint8_t c)
737 {
738 return (crc >> 8) ^ crc_ccitt_table[(crc ^ c) & 0xff];
739 }
740
741 static uint16_t crc_ccitt(uint16_t crc, uint8_t const *buffer, size_t len)
742 {
743 while (len--)
744 crc = crc_ccitt_byte(crc, *buffer++);
745 return crc;
746 }
747
748 static int generate_pa_cal_curve(uint8_t *buffer,
749 const uint8_t *txgen_image,
750 size_t txgen_image_size)
751 {
752 memcpy(buffer, template_pa_cal_curve, sizeof(template_pa_cal_curve));
753
754 //TODO
755
756 return 0;
757 }
758
759 static int generate_iq_autocal(uint8_t *buffer,
760 const uint8_t *iqalign_image,
761 size_t iqalign_image_size)
762 {
763 unsigned int expected_size;
764 uint8_t *out;
765 const uint8_t *in;
766 unsigned int i;
767
768 expected_size = 13 * 8 + 4;
769 if (iqalign_image_size != expected_size) {
770 fprintf(stderr, "ERROR: Unknown wlan-iq-align image size. "
771 "Got %u, but expected %u\n",
772 (unsigned int)iqalign_image_size, expected_size);
773 return -EINVAL;
774 }
775
776 in = iqalign_image;
777 out = buffer;
778
779 memcpy(out, template_pda_iq_autocal, sizeof(template_pda_iq_autocal));
780
781 in += 4; /* Skip zero padding */
782 out += 4; /* Skip header */
783 for (i = 0; i < 13; i++) {
784 out += 2; /* Skip little endian 16bit Mhz number */
785 memcpy(out, in, 8);
786 out += 8; /* Next element */
787 in += 8; /* Next element */
788 }
789
790 return 0;
791 }
792
793 static int generate_eeprom(FILE *outstream,
794 const uint8_t *txgen_image,
795 size_t txgen_image_size,
796 const uint8_t *iqalign_image,
797 size_t iqalign_image_size)
798 {
799 int err, res = 0;
800 uint16_t crc = ~0;
801 uint8_t crc_buf[2];
802 uint8_t gen_pda_iq_autocal[sizeof(template_pda_iq_autocal)];
803 uint8_t gen_pa_cal_curve[sizeof(template_pa_cal_curve)];
804
805 err = generate_iq_autocal(gen_pda_iq_autocal,
806 iqalign_image, iqalign_image_size);
807 if (err)
808 return err;
809 err = generate_pa_cal_curve(gen_pa_cal_curve,
810 txgen_image, txgen_image_size);
811 if (err)
812 return err;
813
814 #define writebuf(buffer, do_crc) do { \
815 if (do_crc) \
816 crc = crc_ccitt(crc, buffer, sizeof(buffer)); \
817 res = fwrite(buffer, sizeof(buffer), 1, outstream); \
818 if (res != 1) { \
819 fprintf(stderr, "Failed to write output data\n"); \
820 return -EIO; \
821 } \
822 } while (0)
823
824 writebuf(template_eeprom_pda_wrap, 0);
825 writebuf(template_mac_address, 1);
826 writebuf(template_bootrec_exp_if, 1);
827 writebuf(template_pda_country_list, 1);
828 writebuf(template_pda_country, 1);
829 writebuf(gen_pa_cal_curve, 1);
830 writebuf(template_pa_cal_output_power_limits, 1);
831 writebuf(gen_pda_iq_autocal, 1);
832 writebuf(template_pdr_end, 1);
833
834 crc = ~crc;
835 crc_buf[0] = crc & 0xFF;
836 crc_buf[1] = (crc >> 8) & 0xFF;
837 res = fwrite(crc_buf, sizeof(crc_buf), 1, outstream);
838 if (res != 1) {
839 fprintf(stderr, "Failed to write CRC\n");
840 return -EIO;
841 }
842
843 return 0;
844 }
845
846 static void * map_file(const char *filepath, int readonly,
847 uint64_t *filelen)
848 {
849 int fd;
850 off_t len;
851 void *data;
852
853 fd = open(filepath, readonly ? O_RDONLY : O_RDWR);
854 if (fd < 0) {
855 fprintf(stderr, "Failed to open file %s: %s\n",
856 filepath, strerror(errno));
857 return NULL;
858 }
859 len = lseek(fd, 0, SEEK_END);
860 if (len < 0 || lseek(fd, 0, SEEK_SET)) {
861 fprintf(stderr, "Failed to calculate file length of %s: %s\n",
862 filepath, strerror(errno));
863 close(fd);
864 return NULL;
865 }
866
867 data = mmap(NULL, len,
868 readonly ? PROT_READ : (PROT_READ | PROT_WRITE),
869 readonly ? MAP_PRIVATE : 0,
870 fd, 0);
871 close(fd);
872 if (data == MAP_FAILED) {
873 fprintf(stderr, "Failed to MMAP file %s: %s\n",
874 filepath, strerror(errno));
875 return NULL;
876 }
877 madvise(data, len, MADV_SEQUENTIAL);
878
879 *filelen = len;
880
881 return data;
882 }
883
884 static void unmap_file(void *mapping, uint64_t len)
885 {
886 if (mapping)
887 munmap(mapping, len);
888 }
889
890 static void usage(FILE *fd)
891 {
892 fprintf(fd, "cal2p54 - CAL to p54spi EEPROM converter\n");
893 fprintf(fd, "\n");
894 fprintf(fd, "Usage: cal2p54 WLAN-TX-GEN2-IMAGE WLAN-IQ-ALIGN-IMAGE\n");
895 }
896
897 int main(int argc, char **argv)
898 {
899 int err, ret = 0;
900 uint8_t *txgen_image = NULL;
901 uint64_t txgen_image_len = 0;
902 uint8_t *iqalign_image = NULL;
903 uint64_t iqalign_image_len = 0;
904
905 const char *txgen_filepath;
906 const char *iqalign_filepath;
907
908 if (argc != 3) {
909 usage(stderr);
910 return 1;
911 }
912 txgen_filepath = argv[1];
913 iqalign_filepath = argv[2];
914
915 txgen_image = map_file(txgen_filepath, 1, &txgen_image_len);
916 iqalign_image = map_file(iqalign_filepath, 1, &iqalign_image_len);
917 if (!txgen_image || !iqalign_image) {
918 ret = 1;
919 goto out;
920 }
921
922 err = generate_eeprom(stdout, txgen_image, txgen_image_len,
923 iqalign_image, iqalign_image_len);
924 if (err) {
925 ret = 1;
926 goto out;
927 }
928
929 out:
930 unmap_file(txgen_image, txgen_image_len);
931 unmap_file(iqalign_image, iqalign_image_len);
932
933 return ret;
934 }