calvaria: Add p54spi EEPROM generator
[packages.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 }