ath_ee_v14_print.c revision 219420
1251881Speter
2251881Speter/*
3251881Speter * Copyright (c) 2010-2011 Adrian Chadd, Xenion Pty Ltd.
4251881Speter *
5251881Speter * Redistribution and use in source and binary forms, with or without
6251881Speter * modification, are permitted provided that the following conditions
7251881Speter * are met:
8251881Speter * 1. Redistributions of source code must retain the above copyright
9251881Speter *    notice, this list of conditions and the following disclaimer.
10251881Speter * 2. Redistributions in binary form must reproduce the above copyright
11251881Speter *    notice, this list of conditions and the following disclaimer in the
12251881Speter *    documentation and/or other materials provided with the distribution.
13251881Speter *
14251881Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15251881Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16251881Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17251881Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18251881Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19251881Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20251881Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21251881Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22251881Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23251881Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24251881Speter * SUCH DAMAGE.
25251881Speter *
26251881Speter * $FreeBSD: head/tools/tools/ath/ath_ee_v14_print/ath_ee_v14_print.c 219420 2011-03-09 04:48:06Z adrian $
27251881Speter */
28251881Speter
29251881Speter#include <stdio.h>
30251881Speter#include <stdlib.h>
31251881Speter#include <unistd.h>
32251881Speter#include <string.h>
33251881Speter#include <sys/types.h>
34251881Speter#include <err.h>
35251881Speter
36251881Spetertypedef enum {
37251881Speter        AH_FALSE = 0,           /* NB: lots of code assumes false is zero */
38251881Speter        AH_TRUE  = 1,
39251881Speter} HAL_BOOL;
40251881Speter
41251881Spetertypedef enum {
42251881Speter        HAL_OK          = 0,    /* No error */
43251881Speter} HAL_STATUS;
44251881Speter
45251881Speterstruct ath_hal;
46251881Speter
47251881Speter#include "ah_eeprom_v14.h"
48251881Speter
49251881Spetervoid
50251881Speterload_eeprom_dump(const char *file, uint16_t *buf)
51251881Speter{
52251881Speter	unsigned int r[8];
53251881Speter	FILE *fp;
54251881Speter	char b[1024];
55251881Speter	int i;
56251881Speter
57251881Speter	fp = fopen(file, "r");
58251881Speter	if (!fp)
59251881Speter		err(1, "fopen");
60251881Speter
61251881Speter	while (!feof(fp)) {
62251881Speter		if (fgets(b, 1024, fp) == NULL)
63251881Speter			break;
64251881Speter		if (feof(fp))
65251881Speter			break;
66251881Speter		if (strlen(b) > 0)
67251881Speter			b[strlen(b)-1] = '\0';
68251881Speter		if (strlen(b) == 0)
69251881Speter			break;
70251881Speter		sscanf(b, "%x: %x %x %x %x %x %x %x %x\n",
71251881Speter		    &i, &r[0], &r[1], &r[2], &r[3], &r[4],
72251881Speter		    &r[5], &r[6], &r[7]);
73251881Speter		buf[i++] = r[0];
74251881Speter		buf[i++] = r[1];
75251881Speter		buf[i++] = r[2];
76251881Speter		buf[i++] = r[3];
77251881Speter		buf[i++] = r[4];
78251881Speter		buf[i++] = r[5];
79251881Speter		buf[i++] = r[6];
80251881Speter		buf[i++] = r[7];
81251881Speter	}
82251881Speter	fclose(fp);
83251881Speter}
84251881Speter
85251881Speterstatic void
86251881Spetereeprom_v14_base_print(uint16_t *buf)
87251881Speter{
88251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
89251881Speter	BASE_EEP_HEADER *eh = &eep->ee_base.baseEepHeader;
90251881Speter	int i;
91251881Speter
92251881Speter	printf("| Version: 0x%.4x   | Length: 0x%.4x | Checksum: 0x%.4x ",
93251881Speter	    eh->version, eh->length, eh->checksum);
94251881Speter	printf("| CapFlags: 0x%.2x  | eepMisc: 0x%.2x | RegDomain: 0x%.4x 0x%.4x | \n",
95251881Speter	    eh->opCapFlags, eh->eepMisc, eh->regDmn[0], eh->regDmn[1]);
96251881Speter	printf("| MAC: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x ",
97251881Speter	    eh->macAddr[0], eh->macAddr[1], eh->macAddr[2],
98251881Speter	    eh->macAddr[3], eh->macAddr[4], eh->macAddr[5]);
99251881Speter	printf("| RxMask: 0x%.2x | TxMask: 0x%.2x | RfSilent: 0x%.4x | btOptions: 0x%.4x |\n",
100251881Speter	    eh->rxMask, eh->txMask, eh->rfSilent, eh->blueToothOptions);
101251881Speter	printf("| DeviceCap: 0x%.4x | binBuildNumber: %.8x | deviceType: 0x%.2x |\n",
102251881Speter	    eh->deviceCap, eh->binBuildNumber, eh->deviceType);
103251881Speter
104251881Speter	printf("| pwdclkind: 0x%.2x | fastClk5g: 0x%.2x | divChain: 0x%.2x | rxGainType: 0x%.2x |\n",
105251881Speter	    (int) eh->pwdclkind, (int) eh->fastClk5g, (int) eh->divChain,
106251881Speter	    (int) eh->rxGainType);
107251881Speter
108251881Speter	printf("| dacHiPwrMode_5G: 0x%.2x | openLoopPwrCntl: 0x%.2x | dacLpMode: 0x%.2x ",
109251881Speter	    (int) eh->dacHiPwrMode_5G, (int) eh->openLoopPwrCntl, (int) eh->dacLpMode);
110251881Speter	printf("| txGainType: 0x%.2x | rcChainMask: 0x%.2x |\n",
111251881Speter	    (int) eh->txGainType, (int) eh->rcChainMask);
112251881Speter
113251881Speter	printf("| desiredScaleCCK: 0x%.2x | pwr_table_offset: 0x%.2x | frac_n_5g: %.2x\n",
114251881Speter	    (int) eh->desiredScaleCCK, (int) eh->pwr_table_offset, (int) eh->frac_n_5g);
115251881Speter
116251881Speter	/* because it's convienent */
117251881Speter	printf("| antennaGainMax[0]: 0x%.2x antennaGainMax[1]: 0x%.2x |\n",
118251881Speter	    eep->ee_antennaGainMax[0], eep->ee_antennaGainMax[1]);
119251881Speter
120251881Speter	printf(" | futureBase:");
121251881Speter	for (i = 0; i < sizeof(eh->futureBase) / sizeof(uint8_t); i++)
122251881Speter		printf(" %.2x", (int) eh->futureBase[i]);
123251881Speter	printf("\n");
124251881Speter}
125251881Speter
126251881Speterstatic void
127251881Spetereeprom_v14_custdata_print(uint16_t *buf)
128251881Speter{
129251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
130251881Speter	uint8_t *custdata = (uint8_t *) &eep->ee_base.custData;
131251881Speter	int i;
132251881Speter
133251881Speter	printf("\n| Custdata:                                       |\n");
134251881Speter	for (i = 0; i < 64; i++) {
135251881Speter		printf("%s0x%.2x %s",
136251881Speter		    i % 16 == 0 ? "| " : "",
137251881Speter		    custdata[i],
138251881Speter		    i % 16 == 15 ? "|\n" : "");
139251881Speter	}
140251881Speter}
141251881Speter
142251881Speterstatic void
143262253Spetereeprom_v14_modal_print(uint16_t *buf, int m)
144251881Speter{
145251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
146251881Speter	MODAL_EEP_HEADER *mh = &eep->ee_base.modalHeader[m];
147251881Speter	int i;
148251881Speter
149251881Speter	printf("| antCtrlCommon: 0x%.4x |\n", mh->antCtrlCommon);
150251881Speter	printf("| switchSettling: 0x%.2x |\n", mh->switchSettling);
151251881Speter	printf("| adcDesiredSize: %d |\n| pgaDesiredSize: %.2f dBm |\n",
152251881Speter	    mh->adcDesiredSize, (float) mh->pgaDesiredSize / 2.0);
153251881Speter
154251881Speter	printf("| antCtrlChain:        0:0x%.4x 1:0x%.4x 2:0x%.4x |\n",
155251881Speter	    mh->antCtrlChain[0], mh->antCtrlChain[1], mh->antCtrlChain[2]);
156251881Speter	printf("| antennaGainCh:       0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
157251881Speter	    mh->antennaGainCh[0], mh->antennaGainCh[1], mh->antennaGainCh[2]);
158251881Speter	printf("| txRxAttenCh:         0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
159251881Speter	    mh->txRxAttenCh[0], mh->txRxAttenCh[1], mh->txRxAttenCh[2]);
160251881Speter	printf("| rxTxMarginCh:        0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
161251881Speter	    mh->rxTxMarginCh[0], mh->rxTxMarginCh[1], mh->rxTxMarginCh[2]);
162251881Speter 	printf("| noiseFloorThresCh:   0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
163251881Speter	    mh->noiseFloorThreshCh[0], mh->noiseFloorThreshCh[1], mh->noiseFloorThreshCh[2]);
164251881Speter	printf("| xlnaGainCh:          0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
165251881Speter	    mh->xlnaGainCh[0], mh->xlnaGainCh[1], mh->xlnaGainCh[2]);
166251881Speter	printf("| iqCalICh:            0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n| iqCalQCh:            0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
167251881Speter	    mh->iqCalICh[0], mh->iqCalICh[1], mh->iqCalICh[2],
168251881Speter	    mh->iqCalQCh[0], mh->iqCalQCh[1], mh->iqCalQCh[2]);
169251881Speter	printf("| bswAtten:            0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
170251881Speter	    mh->bswAtten[0], mh->bswAtten[1], mh->bswAtten[2]);
171251881Speter	printf("| bswMargin:           0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
172251881Speter	    mh->bswMargin[0], mh->bswMargin[1], mh->bswMargin[2]);
173251881Speter	printf("| xatten2Db:           0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
174251881Speter	    mh->xatten2Db[0], mh->xatten2Db[1], mh->xatten2Db[2]);
175251881Speter	printf("| xatten2Margin:       0:0x%.2x   1:0x%.2x   2:0x%.2x   |\n",
176251881Speter	    mh->xatten2Margin[0], mh->xatten2Margin[1], mh->xatten2Margin[2]);
177251881Speter
178251881Speter	printf("| txEndToXpaOff: 0x%.2x | txEndToRxOn: 0x%.2x | txFrameToXpaOn: 0x%.2x |\n",
179251881Speter	    mh->txEndToXpaOff, mh->txEndToRxOn, mh->txFrameToXpaOn);
180251881Speter
181251881Speter	printf("| thres62: 0x%.2x\n", mh->thresh62);
182251881Speter
183251881Speter	printf("| xpdGain: 0x%.2x | xpd: 0x%.2x |\n", mh->xpdGain, mh->xpd);
184251881Speter	printf("| xpaBiasLvlFreq: 0:0x%.4x 1:0x%.4x 2:0x%.4x |\n",
185251881Speter	    mh->xpaBiasLvlFreq[0], mh->xpaBiasLvlFreq[1], mh->xpaBiasLvlFreq[2]);
186251881Speter
187251881Speter	printf("| pdGainOverlap: 0x%.2x | ob: 0x%.2x | db: 0x%.2x | xpaBiasLvl: 0x%.2x |\n",
188251881Speter	    mh->pdGainOverlap, mh->ob, mh->db, mh->xpaBiasLvl);
189251881Speter
190251881Speter	printf("| pwrDecreaseFor2Chain: 0x%.2x | pwrDecreaseFor3Chain: 0x%.2x | txFrameToDataStart: 0x%.2x | txFrameToPaOn: 0x%.2x |\n",
191251881Speter	    mh->pwrDecreaseFor2Chain, mh->pwrDecreaseFor3Chain, mh->txFrameToDataStart,
192251881Speter	    mh->txFrameToPaOn);
193251881Speter
194251881Speter	printf("| ht40PowerIncForPdadc: 0x%.2x |\n", mh->ht40PowerIncForPdadc);
195251881Speter
196251881Speter	printf("| swSettleHt40: 0x%.2x |\n", mh->swSettleHt40);
197251881Speter
198251881Speter	printf("| ob_ch1: 0x%.2x | db_ch1: 0x%.2x |\n", mh->ob_ch1, mh->db_ch1);
199251881Speter
200251881Speter	printf("| flagBits: 0x%.2x | miscBits: 0x%.2x |\n", mh->flagBits, mh->miscBits);
201251881Speter
202251881Speter
203251881Speter	printf("| futureModal: 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x |\n",
204251881Speter	    mh->futureModal[0],
205251881Speter	    mh->futureModal[1],
206251881Speter	    mh->futureModal[2],
207251881Speter	    mh->futureModal[3],
208251881Speter	    mh->futureModal[4],
209251881Speter	    mh->futureModal[5]);
210251881Speter
211251881Speter	/* and now, spur channels */
212251881Speter	for (i = 0; i < AR5416_EEPROM_MODAL_SPURS; i++) {
213251881Speter		printf("| Spur %d: spurChan: 0x%.4x spurRangeLow: 0x%.2x spurRangeHigh: 0x%.2x |\n",
214251881Speter		    i, mh->spurChans[i].spurChan,
215251881Speter		    (int) mh->spurChans[i].spurRangeLow,
216251881Speter		    (int) mh->spurChans[i].spurRangeHigh);
217251881Speter	}
218251881Speter}
219251881Speter
220251881Speterstatic void
221251881Spetereeprom_v14_print_caldata_perfreq_op_loop(CAL_DATA_PER_FREQ_OP_LOOP *f)
222251881Speter{
223251881Speter	int i, j;
224251881Speter	for (i = 0; i < 2; i++) {
225251881Speter		printf("    Gain: %d:\n", i);
226251881Speter		for (j = 0; j < 5; j++) {
227251881Speter			printf("      %d: pwrPdg: %d, vpdPdg: %d, pcdac: %d, empty: %d\n",
228251881Speter			    j, f->pwrPdg[i][j], f->vpdPdg[i][j], f->pcdac[i][j], f->empty[i][j]);
229251881Speter		}
230251881Speter		printf("\n");
231251881Speter	}
232251881Speter}
233251881Speter
234251881Speterstatic void
235251881Spetereeprom_v14_print_caldata_perfreq(CAL_DATA_PER_FREQ *f)
236251881Speter{
237251881Speter	int i, j;
238251881Speter
239251881Speter	for (i = 0; i < AR5416_NUM_PD_GAINS; i++) {
240251881Speter		printf("    Gain %d: pwr dBm/vpd: ", i);
241251881Speter		for (j = 0; j < AR5416_PD_GAIN_ICEPTS; j++) {
242251881Speter			/* These are stored in 0.25dBm increments */
243251881Speter			printf("%d:(%.2f/%d) ", j, (float) f->pwrPdg[i][j] / 4.00,
244251881Speter			    f->vpdPdg[i][j]);
245251881Speter		}
246251881Speter		printf("\n");
247251881Speter	}
248251881Speter}
249251881Speter
250251881Speterstatic void
251251881Spetereeprom_v14_calfreqpiers_print(uint16_t *buf)
252251881Speter{
253251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
254251881Speter	int i, n;
255251881Speter
256251881Speter	/* 2ghz cal piers */
257251881Speter	printf("calFreqPier2G: ");
258251881Speter	for (i = 0; i < AR5416_NUM_2G_CAL_PIERS; i++) {
259251881Speter		printf(" 0x%.2x ", eep->ee_base.calFreqPier2G[i]);
260251881Speter	}
261251881Speter	printf("|\n");
262251881Speter
263251881Speter	for (i = 0; i < AR5416_NUM_2G_CAL_PIERS; i++) {
264251881Speter		if (eep->ee_base.calFreqPier2G[i] == 0xff)
265251881Speter			continue;
266251881Speter		printf("2Ghz Cal Pier %d\n", i);
267251881Speter		for (n = 0; n < AR5416_MAX_CHAINS; n++) {
268251881Speter			printf("  Chain %d:\n", n);
269251881Speter			if (eep->ee_base.baseEepHeader.openLoopPwrCntl)
270251881Speter				eeprom_v14_print_caldata_perfreq_op_loop((void *) (&eep->ee_base.calPierData2G[n][i]));
271251881Speter			else
272251881Speter				eeprom_v14_print_caldata_perfreq(&eep->ee_base.calPierData2G[n][i]);
273251881Speter		}
274251881Speter	}
275251881Speter
276251881Speter	printf("\n");
277251881Speter
278251881Speter	/* 5ghz cal piers */
279251881Speter	printf("calFreqPier5G: ");
280251881Speter	for (i = 0; i < AR5416_NUM_5G_CAL_PIERS; i++) {
281251881Speter		printf(" 0x%.2x ", eep->ee_base.calFreqPier5G[i]);
282251881Speter	}
283251881Speter	printf("|\n");
284251881Speter	for (i = 0; i < AR5416_NUM_5G_CAL_PIERS; i++) {
285251881Speter		if (eep->ee_base.calFreqPier5G[i] == 0xff)
286251881Speter			continue;
287251881Speter		printf("5Ghz Cal Pier %d\n", i);
288251881Speter		for (n = 0; n < AR5416_MAX_CHAINS; n++) {
289251881Speter			printf("  Chain %d:\n", n);
290251881Speter			if (eep->ee_base.baseEepHeader.openLoopPwrCntl)
291251881Speter				eeprom_v14_print_caldata_perfreq_op_loop((void *) (&eep->ee_base.calPierData2G[n][i]));
292251881Speter			else
293251881Speter				eeprom_v14_print_caldata_perfreq(&eep->ee_base.calPierData2G[n][i]);
294251881Speter		}
295251881Speter	}
296251881Speter}
297251881Speter
298251881Speterstatic void
299251881Spetereeprom_v14_target_legacy_print(CAL_TARGET_POWER_LEG *l)
300251881Speter{
301251881Speter	int i;
302251881Speter	if (l->bChannel == 0xff)
303251881Speter		return;
304251881Speter	printf("  bChannel: %d;", l->bChannel);
305251881Speter	for (i = 0; i < 4; i++) {
306251881Speter		printf(" %.2f", (float) l->tPow2x[i] / 2.0);
307251881Speter	}
308251881Speter	printf(" (dBm)\n");
309251881Speter}
310251881Speter
311251881Speterstatic void
312251881Spetereeprom_v14_target_ht_print(CAL_TARGET_POWER_HT *l)
313251881Speter{
314251881Speter	int i;
315251881Speter	if (l->bChannel == 0xff)
316251881Speter		return;
317251881Speter	printf("  bChannel: %d;", l->bChannel);
318251881Speter	for (i = 0; i < 8; i++) {
319251881Speter		printf(" %.2f", (float) l->tPow2x[i] / 2.0);
320251881Speter	}
321251881Speter	printf(" (dBm)\n");
322251881Speter}
323251881Speter
324251881Speterstatic void
325251881Spetereeprom_v14_print_targets(uint16_t *buf)
326251881Speter{
327251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
328251881Speter	int i;
329251881Speter
330251881Speter	/* 2ghz rates */
331251881Speter	printf("2Ghz CCK:\n");
332251881Speter	for (i = 0; i < AR5416_NUM_2G_CCK_TARGET_POWERS; i++) {
333251881Speter		eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPowerCck[i]);
334251881Speter	}
335251881Speter	printf("2Ghz 11g:\n");
336251881Speter	for (i = 0; i < AR5416_NUM_2G_20_TARGET_POWERS; i++) {
337251881Speter		eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPower2G[i]);
338251881Speter	}
339251881Speter	printf("2Ghz HT20:\n");
340251881Speter	for (i = 0; i < AR5416_NUM_2G_20_TARGET_POWERS; i++) {
341251881Speter		eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower2GHT20[i]);
342251881Speter	}
343251881Speter	printf("2Ghz HT40:\n");
344251881Speter	for (i = 0; i < AR5416_NUM_2G_40_TARGET_POWERS; i++) {
345251881Speter		eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower2GHT40[i]);
346251881Speter	}
347251881Speter
348251881Speter	/* 5ghz rates */
349251881Speter	printf("5Ghz 11a:\n");
350251881Speter	for (i = 0; i < AR5416_NUM_5G_20_TARGET_POWERS; i++) {
351251881Speter		eeprom_v14_target_legacy_print(&eep->ee_base.calTargetPower5G[i]);
352251881Speter	}
353251881Speter	printf("5Ghz HT20:\n");
354251881Speter	for (i = 0; i < AR5416_NUM_5G_20_TARGET_POWERS; i++) {
355251881Speter		eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower5GHT20[i]);
356251881Speter	}
357251881Speter	printf("5Ghz HT40:\n");
358251881Speter	for (i = 0; i < AR5416_NUM_5G_40_TARGET_POWERS; i++) {
359251881Speter		eeprom_v14_target_ht_print(&eep->ee_base.calTargetPower5GHT40[i]);
360251881Speter	}
361251881Speter
362251881Speter}
363251881Speter
364251881Speterstatic void
365251881Spetereeprom_v14_ctl_edge_print(CAL_CTL_DATA *ctl)
366251881Speter{
367251881Speter	int i, j;
368251881Speter	uint8_t pow, flag;
369251881Speter
370251881Speter	for (i = 0; i < AR5416_MAX_CHAINS; i++) {
371251881Speter		printf("  chain %d: ", i);
372251881Speter		for (j = 0; j < AR5416_NUM_BAND_EDGES; j++) {
373251881Speter			pow = ctl->ctlEdges[i][j].tPowerFlag & 0x3f;
374251881Speter			flag = (ctl->ctlEdges[i][j].tPowerFlag & 0xc0) >> 6;
375251881Speter			printf(" %d:pow=%d,flag=%.2x", j, pow, flag);
376251881Speter		}
377251881Speter		printf("\n");
378251881Speter	}
379251881Speter}
380251881Speter
381251881Speterstatic void
382251881Spetereeprom_v14_ctl_print(uint16_t *buf)
383251881Speter{
384251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
385251881Speter	int i;
386251881Speter
387251881Speter	for (i = 0; i < AR5416_NUM_CTLS; i++) {
388251881Speter		if (eep->ee_base.ctlIndex[i] == 0)
389251881Speter			continue;
390251881Speter		printf("| ctlIndex: offset %d, value %d\n", i, eep->ee_base.ctlIndex[i]);
391251881Speter		eeprom_v14_ctl_edge_print(&eep->ee_base.ctlData[i]);
392251881Speter	}
393251881Speter}
394251881Speter
395251881Speterstatic void
396251881Spetereeprom_v14_print_edges(uint16_t *buf)
397251881Speter{
398251881Speter	HAL_EEPROM_v14 *eep = (HAL_EEPROM_v14 *) buf;
399251881Speter	int i;
400251881Speter
401251881Speter	printf("| eeNumCtls: %d\n", eep->ee_numCtls);
402251881Speter	for (i = 0; i < NUM_EDGES*eep->ee_numCtls; i++) {
403251881Speter		/* XXX is flag 8 or 32 bits? */
404251881Speter		printf("|  edge %2d/%2d: rdEdge: %5d EdgePower: %.2f dBm Flag: 0x%.8x\n",
405251881Speter			i / NUM_EDGES, i % NUM_EDGES,
406251881Speter			eep->ee_rdEdgesPower[i].rdEdge,
407251881Speter			(float) eep->ee_rdEdgesPower[i].twice_rdEdgePower / 2.0,
408251881Speter			eep->ee_rdEdgesPower[i].flag);
409251881Speter
410251881Speter		if (i % NUM_EDGES == (NUM_EDGES -1))
411251881Speter			printf("|\n");
412251881Speter	}
413251881Speter#if 0
414251881Spetertypedef struct {
415251881Speter        uint16_t        rdEdge;
416251881Speter	uint16_t        twice_rdEdgePower;
417251881Speter		HAL_BOOL        flag;
418251881Speter	} RD_EDGES_POWER;
419251881Speter
420251881Speter#endif
421251881Speter}
422251881Speter
423251881Spetervoid
424251881Speterusage(char *argv[])
425251881Speter{
426251881Speter	printf("Usage: %s <eeprom dump file>\n", argv[0]);
427251881Speter	printf("\n");
428251881Speter	printf("  The eeprom dump file is a text hexdump of an EEPROM.\n");
429251881Speter	printf("  The lines must be formatted as follows:\n");
430251881Speter	printf("  0xAAAA: 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD\n");
431251881Speter	printf("  where each line must have exactly eight data bytes.\n");
432251881Speter	exit(127);
433251881Speter}
434251881Speter
435251881Speterint
436251881Spetermain(int argc, char *argv[])
437251881Speter{
438251881Speter	uint16_t *eep = NULL;
439251881Speter	eep = calloc(4096, sizeof(int16_t));
440251881Speter
441251881Speter	if (argc < 2)
442251881Speter		usage(argv);
443251881Speter
444251881Speter	load_eeprom_dump(argv[1], eep);
445251881Speter
446251881Speter	eeprom_v14_base_print(eep);
447251881Speter	eeprom_v14_custdata_print(eep);
448251881Speter
449251881Speter	/* 2.4ghz */
450251881Speter	printf("\n2.4ghz:\n");
451251881Speter	eeprom_v14_modal_print(eep, 1);
452251881Speter	/* 5ghz */
453251881Speter	printf("\n5ghz:\n");
454251881Speter	eeprom_v14_modal_print(eep, 0);
455251881Speter	printf("\n");
456251881Speter
457251881Speter	eeprom_v14_calfreqpiers_print(eep);
458251881Speter	printf("\n");
459251881Speter
460251881Speter	eeprom_v14_print_targets(eep);
461251881Speter	printf("\n");
462251881Speter
463251881Speter	eeprom_v14_ctl_print(eep);
464251881Speter	printf("\n");
465251881Speter
466251881Speter	eeprom_v14_print_edges(eep);
467251881Speter	printf("\n");
468251881Speter
469251881Speter	free(eep);
470251881Speter	exit(0);
471251881Speter}
472251881Speter