1251738Sadrian 2251738Sadrian/* 3251738Sadrian * Copyright (c) 2010-2011 Adrian Chadd, Xenion Pty Ltd. 4251738Sadrian * 5251738Sadrian * Redistribution and use in source and binary forms, with or without 6251738Sadrian * modification, are permitted provided that the following conditions 7251738Sadrian * are met: 8251738Sadrian * 1. Redistributions of source code must retain the above copyright 9251738Sadrian * notice, this list of conditions and the following disclaimer. 10251738Sadrian * 2. Redistributions in binary form must reproduce the above copyright 11251738Sadrian * notice, this list of conditions and the following disclaimer in the 12251738Sadrian * documentation and/or other materials provided with the distribution. 13251738Sadrian * 14251738Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15251738Sadrian * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16251738Sadrian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17251738Sadrian * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18251738Sadrian * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19251738Sadrian * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20251738Sadrian * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21251738Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22251738Sadrian * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23251738Sadrian * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24251738Sadrian * SUCH DAMAGE. 25251738Sadrian * 26251738Sadrian * $FreeBSD$ 27251738Sadrian */ 28251738Sadrian 29251738Sadrian#include <stdio.h> 30251738Sadrian#include <stdlib.h> 31251738Sadrian#include <unistd.h> 32251738Sadrian#include <string.h> 33251738Sadrian#include <sys/types.h> 34251738Sadrian#include <err.h> 35251738Sadrian 36251738Sadrianstruct ath_hal; 37251738Sadrian 38251738Sadrian#include "ar9300/ar9300eep.h" 39251738Sadrian 40251738Sadrianstatic void 41251738Sadrianeeprom_9300_hdr_print(const uint16_t *buf) 42251738Sadrian{ 43251738Sadrian const ar9300_eeprom_t *ee = (ar9300_eeprom_t *) buf; 44251738Sadrian 45251738Sadrian printf("| Version: %d, Template: %d, MAC: %02x:%02x:%02x:%02x:%02x:%02x |\n", 46251738Sadrian ee->eeprom_version, 47251738Sadrian ee->template_version, 48251738Sadrian ee->mac_addr[0], 49251738Sadrian ee->mac_addr[1], 50251738Sadrian ee->mac_addr[2], 51251738Sadrian ee->mac_addr[3], 52251738Sadrian ee->mac_addr[4], 53251738Sadrian ee->mac_addr[5]); 54251738Sadrian} 55251738Sadrian 56251738Sadrianstatic void 57251738Sadrianeeprom_9300_base_print(const uint16_t *buf) 58251738Sadrian{ 59251738Sadrian const ar9300_eeprom_t *ee = (ar9300_eeprom_t *) buf; 60251738Sadrian const OSPREY_BASE_EEP_HEADER *ee_base = &ee->base_eep_header; 61251738Sadrian 62251738Sadrian printf("| RegDomain: 0x%02x 0x%02x TxRxMask: 0x%02x OpFlags: 0x%02x OpMisc: 0x%02x |\n", 63251738Sadrian ee_base->reg_dmn[0], 64251738Sadrian ee_base->reg_dmn[1], 65251738Sadrian ee_base->txrx_mask, 66251738Sadrian ee_base->op_cap_flags.op_flags, 67251738Sadrian ee_base->op_cap_flags.eepMisc); 68251738Sadrian 69251738Sadrian printf("| RfSilent: 0x%02x BtOptions: 0x%02x DeviceCap: 0x%02x DeviceType: 0x%02x |\n", 70251738Sadrian ee_base->rf_silent, 71251738Sadrian ee_base->blue_tooth_options, 72251738Sadrian ee_base->device_cap, 73251738Sadrian ee_base->device_type); 74251738Sadrian 75251738Sadrian printf("| pwrTableOffset: %d dB, feature_enable: 0x%02x MiscConfig: 0x%02x |\n", 76251738Sadrian ee_base->pwrTableOffset, 77251738Sadrian ee_base->feature_enable, 78251738Sadrian ee_base->misc_configuration); 79251738Sadrian 80251738Sadrian printf("| EepromWriteGpio: %d, WlanDisableGpio: %d, WlanLedGpio: %d RxBandSelectGpio: %d |\n", 81251738Sadrian ee_base->eeprom_write_enable_gpio, 82251738Sadrian ee_base->wlan_disable_gpio, 83251738Sadrian ee_base->wlan_led_gpio, 84251738Sadrian ee_base->rx_band_select_gpio); 85251738Sadrian 86251738Sadrian printf("| TxRxGain: %d, SwReg: %d |\n", 87251738Sadrian ee_base->txrxgain, 88251738Sadrian ee_base->swreg); 89251738Sadrian} 90251738Sadrian 91251738Sadrianstatic void 92251738Sadrianeeprom_9300_modal_print(const OSPREY_MODAL_EEP_HEADER *m) 93251738Sadrian{ 94251738Sadrian int i; 95251738Sadrian 96251738Sadrian printf("| AntCtrl: 0x%08x AntCtrl2: 0x%08x |\n", 97251738Sadrian m->ant_ctrl_common, 98251738Sadrian m->ant_ctrl_common2); 99251738Sadrian 100251738Sadrian for (i = 0; i < OSPREY_MAX_CHAINS; i++) { 101251738Sadrian printf("| Ch %d: AntCtrl: 0x%08x Atten1: %d, atten1_margin: %d, NfThresh: %d |\n", 102251738Sadrian i, 103251738Sadrian m->ant_ctrl_chain[i], 104251738Sadrian m->xatten1_db[i], 105251738Sadrian m->xatten1_margin[i], 106251738Sadrian m->noise_floor_thresh_ch[i]); 107251738Sadrian } 108251738Sadrian 109251738Sadrian printf("| Spur: "); 110251738Sadrian for (i = 0; i < OSPREY_EEPROM_MODAL_SPURS; i++) { 111251738Sadrian printf("(%d: %d) ", i, m->spur_chans[i]); 112251738Sadrian } 113251738Sadrian printf("|\n"); 114251738Sadrian 115251738Sadrian printf("| TempSlope: %d, VoltSlope: %d, QuickDrop: %d, XpaBiasLvl %d |\n", 116251738Sadrian m->temp_slope, 117251738Sadrian m->voltSlope, 118251738Sadrian m->quick_drop, 119251738Sadrian m->xpa_bias_lvl); 120251738Sadrian 121251738Sadrian printf("| txFrameToDataStart: %d, TxFrameToPaOn: %d, TxEndToXpaOff: %d, TxEndToRxOn: %d, TxFrameToXpaOn: %d |\n", 122251738Sadrian m->tx_frame_to_data_start, 123251738Sadrian m->tx_frame_to_pa_on, 124251738Sadrian m->tx_end_to_xpa_off, 125251738Sadrian m->txEndToRxOn, 126251738Sadrian m->tx_frame_to_xpa_on); 127251738Sadrian 128251738Sadrian printf("| txClip: %d, AntGain: %d, SwitchSettling: %d, adcDesiredSize: %d |\n", 129251738Sadrian m->txClip, 130251738Sadrian m->antenna_gain, 131251738Sadrian m->switchSettling, 132251738Sadrian m->adcDesiredSize); 133251738Sadrian 134251738Sadrian printf("| Thresh62: %d, PaprdMaskHt20: 0x%08x, PaPrdMaskHt40: 0x%08x |\n", 135251738Sadrian m->thresh62, 136251738Sadrian m->paprd_rate_mask_ht20, 137251738Sadrian m->paprd_rate_mask_ht40); 138251738Sadrian 139251738Sadrian printf("| SwitchComSpdt: %02x, XlnaBiasStrength: %d, RfGainCap: %d, TxGainCap: %x\n", 140251738Sadrian m->switchcomspdt, 141251738Sadrian m->xLNA_bias_strength, 142251738Sadrian m->rf_gain_cap, 143251738Sadrian m->tx_gain_cap); 144251738Sadrian 145251738Sadrian#if 0 146251738Sadrian u_int8_t reserved[MAX_MODAL_RESERVED]; 147251738Sadrian u_int16_t switchcomspdt; 148251738Sadrian u_int8_t xLNA_bias_strength; // bit: 0,1:chain0, 2,3:chain1, 4,5:chain2 149251738Sadrian u_int8_t rf_gain_cap; 150251738Sadrian u_int8_t tx_gain_cap; // bit0:4 txgain cap, txgain index for max_txgain + 20 (10dBm higher than max txgain) 151251738Sadrian u_int8_t futureModal[MAX_MODAL_FUTURE]; 152251738Sadrian // last 12 bytes stolen and moved to newly created base extension structure 153251738Sadrian#endif 154251738Sadrian} 155251738Sadrian 156251738Sadrianstatic void 157251738Sadrianload_eeprom_dump(const char *file, uint16_t *buf) 158251738Sadrian{ 159251738Sadrian unsigned int r[8]; 160251738Sadrian FILE *fp; 161251738Sadrian char b[1024]; 162251738Sadrian int i; 163251738Sadrian 164251738Sadrian fp = fopen(file, "r"); 165251738Sadrian if (!fp) 166251738Sadrian err(1, "fopen"); 167251738Sadrian 168251738Sadrian while (!feof(fp)) { 169251738Sadrian if (fgets(b, 1024, fp) == NULL) 170251738Sadrian break; 171251738Sadrian if (feof(fp)) 172251738Sadrian break; 173251738Sadrian if (strlen(b) > 0) 174251738Sadrian b[strlen(b)-1] = '\0'; 175251738Sadrian if (strlen(b) == 0) 176251738Sadrian break; 177251738Sadrian sscanf(b, "%x: %x %x %x %x %x %x %x %x\n", 178251738Sadrian &i, &r[0], &r[1], &r[2], &r[3], &r[4], 179251738Sadrian &r[5], &r[6], &r[7]); 180251738Sadrian buf[i++] = r[0]; 181251738Sadrian buf[i++] = r[1]; 182251738Sadrian buf[i++] = r[2]; 183251738Sadrian buf[i++] = r[3]; 184251738Sadrian buf[i++] = r[4]; 185251738Sadrian buf[i++] = r[5]; 186251738Sadrian buf[i++] = r[6]; 187251738Sadrian buf[i++] = r[7]; 188251738Sadrian } 189251738Sadrian fclose(fp); 190251738Sadrian} 191251738Sadrian 192251738Sadrianvoid 193251738Sadrianusage(char *argv[]) 194251738Sadrian{ 195251738Sadrian printf("Usage: %s <eeprom dump file>\n", argv[0]); 196251738Sadrian printf("\n"); 197251738Sadrian printf(" The eeprom dump file is a text hexdump of an EEPROM.\n"); 198251738Sadrian printf(" The lines must be formatted as follows:\n"); 199251738Sadrian printf(" 0xAAAA: 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD 0xDD\n"); 200251738Sadrian printf(" where each line must have exactly eight data bytes.\n"); 201251738Sadrian exit(127); 202251738Sadrian} 203251738Sadrian 204251738Sadrianint 205251738Sadrianmain(int argc, char *argv[]) 206251738Sadrian{ 207251738Sadrian uint16_t *eep = NULL; 208251738Sadrian const ar9300_eeprom_t *ee; 209251738Sadrian 210251738Sadrian eep = calloc(4096, sizeof(int16_t)); 211251738Sadrian 212251738Sadrian if (argc < 2) 213251738Sadrian usage(argv); 214251738Sadrian 215251738Sadrian load_eeprom_dump(argv[1], eep); 216251738Sadrian ee = (ar9300_eeprom_t *) eep; 217251738Sadrian 218251738Sadrian eeprom_9300_hdr_print(eep); 219251738Sadrian eeprom_9300_base_print(eep); 220251738Sadrian 221251738Sadrian printf("\n2GHz modal:\n"); 222251738Sadrian eeprom_9300_modal_print(&ee->modal_header_2g); 223251738Sadrian 224251738Sadrian printf("\n5GHz modal:\n"); 225251738Sadrian eeprom_9300_modal_print(&ee->modal_header_5g); 226251738Sadrian 227251738Sadrian free(eep); 228251738Sadrian exit(0); 229251738Sadrian} 230