📄 eeprom.c
字号:
/* * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * Copyright (c) 2002-2005 Atheros Communications, Inc. * All rights reserved. * * $Id: eeprom.c,v 1.1.1.1 2006/09/12 03:45:22 steven Exp $ */#include "diag.h"#include "ah.h"#include "ah_internal.h"#include "ah_eeprom.h"#include <getopt.h>#include <errno.h>#include <err.h>static void printEepromStruct(FILE *fd, HAL_EEPROM *ee, u_int mode);struct ath_diag atd;int s;const char *progname;u_int16_teeread(u_int16_t off){ u_int16_t eedata; atd.ad_id = HAL_DIAG_EEREAD | ATH_DIAG_IN | ATH_DIAG_DYN; atd.ad_in_size = sizeof(off); atd.ad_in_data = (caddr_t) &off; atd.ad_out_size = sizeof(eedata); atd.ad_out_data = (caddr_t) &eedata; if (ioctl(s, SIOCGATHDIAG, &atd) < 0) err(1, atd.ad_name); return eedata;}static voideewrite(u_long off, u_long value){ HAL_DIAG_EEVAL eeval; eeval.ee_off = (u_int16_t) off; eeval.ee_data = (u_int16_t) value; atd.ad_id = HAL_DIAG_EEWRITE | ATH_DIAG_IN; atd.ad_in_size = sizeof(eeval); atd.ad_in_data = (caddr_t) &eeval; atd.ad_out_size = 0; atd.ad_out_data = NULL; if (ioctl(s, SIOCGATHDIAG, &atd) < 0) err(1, atd.ad_name);}static voidusage(){ fprintf(stderr, "usage: %s [-i] [offset | offset=value]\n", progname); exit(-1);}intmain(int argc, char *argv[]){ HAL_REVS revs; const char *ifname = ATH_DEFAULT; int c; s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket"); progname = argv[0]; while ((c = getopt(argc, argv, "i:")) != -1) switch (c) { case 'i': ifname = optarg; break; default: usage(); /*NOTREACHED*/ } argc -= optind; argv += optind; strncpy(atd.ad_name, ifname, sizeof (atd.ad_name)); atd.ad_id = HAL_DIAG_REVS; atd.ad_out_data = (caddr_t) &revs; atd.ad_out_size = sizeof(revs); if (ioctl(s, SIOCGATHDIAG, &atd) < 0) err(1, atd.ad_name); if (argc == 0) { HAL_EEPROM eeprom; atd.ad_id = HAL_DIAG_EEPROM; atd.ad_out_data = (caddr_t) &eeprom; atd.ad_out_size = sizeof(eeprom); if (ioctl(s, SIOCGATHDIAG, &atd) < 0) err(1, atd.ad_name); printEepromStruct(stdout, &eeprom, headerInfo11A); printEepromStruct(stdout, &eeprom, headerInfo11B); printEepromStruct(stdout, &eeprom, headerInfo11G); } else { for (; argc > 0; argc--, argv++) { u_int16_t off, val, oval; char line[256]; char *cp; cp = strchr(argv[0], '='); if (cp != NULL) *cp = '\0'; off = (u_int16_t) strtoul(argv[0], 0, NULL); if (off == 0 && errno == EINVAL) errx(1, "%s: invalid eeprom offset %s", progname, argv[0]); if (cp == NULL) { printf("%04x: %04x\n", off, eeread(off)); } else { val = (u_int16_t) strtoul(cp+1, 0, NULL); if (val == 0 && errno == EINVAL) errx(1, "%s: invalid eeprom value %s", progname, cp+1); oval = eeread(off); printf("Write %04x: %04x = %04x? ", off, oval, val); fflush(stdout); if (fgets(line, sizeof(line), stdin) != NULL && line[0] == 'y') eewrite(off, val); } } } return 0;}/* * EEPROM REV 3/4 DEBUG PRINT FUNCTIONS * * NB: Don't change the format of the output; we want it identical * to the Atheros HAL so we can easily compare debug output. */static voidprintHeaderInfo(FILE *fd, const HAL_EEPROM *ee, u_int mode){ u_int16_t j, version = ee->ee_version; fprintf(fd ,"\n"); fprintf(fd ," =================Header Information for mode %s===============\n", mode == headerInfo11A ? "11a" : mode == headerInfo11B ? "11b" : mode == headerInfo11G ? "11g" : "???"); fprintf(fd ," | Major Version %2d ", version >> 12); fprintf(fd ,"| Minor Version %2d |\n", version & 0xFFF); if (version >= AR_EEPROM_VER4_0) { fprintf(fd ," | EAR Start %03x ", ee->ee_earStart); fprintf(fd ,"| Target Power Start %03x |\n", ee->ee_targetPowersStart); fprintf(fd ," | EEP MAP %3d ", ee->ee_eepMap); fprintf(fd ,"| Enable 32 khz %3d |\n", ee->ee_exist32kHzCrystal); } if (version >= AR_EEPROM_VER5_0) { fprintf(fd ," | EEP Map2PowerCalStart %3d ", ee->ee_eepMap2PowerCalStart); fprintf(fd ,"| |\n"); } fprintf(fd ," |-------------------------------------------------------------|\n"); fprintf(fd ," | A Mode %1d ", ee->ee_Amode); fprintf(fd ,"| B Mode %1d ", ee->ee_Bmode); fprintf(fd ,"| G Mode %1d |\n", ee->ee_Gmode); if(ee->ee_regdomain >> 15) { fprintf(fd ," | Country Code %03x ", ee->ee_regdomain >> 15); } else { fprintf(fd ," | Reg. Domain %03x ", ee->ee_regdomain & 0xFFF); } fprintf(fd ,"| Turbo2 Disable %1d ", ee->ee_turbo5Disable); fprintf(fd ,"| Turbo5 Disable %1d |\n", ee->ee_turbo2Disable); fprintf(fd ," | RF Silent %1d ", ee->ee_rfKill); fprintf(fd ,"| XR5 Disable %1d ", ee->ee_disableXr5); fprintf(fd ,"| XR2 Disable %1d |\n", ee->ee_disableXr2); fprintf(fd ," | Turbo 2W Maximum dBm %2d | cckOfdmDelta(10x) %2d | GainI %2d |\n", ee->ee_turbo2WMaxPower5, ee->ee_cckOfdmPwrDelta, ee->ee_gainI[mode]); fprintf(fd ," |-------------------------------------------------------------|\n"); fprintf(fd ," | Regulatory capabilities = 0x%02x |\n", ee->ee_regCap); fprintf(fd ," |-------------------------------------------------------------|\n"); if (version >= AR_EEPROM_VER3_3) { fprintf(fd ," | worldwide roaming %1x ", (ee->ee_regdomain >> 14) & 0x1); fprintf(fd ,"| False detect backoff 0x%02x |\n", ee->ee_falseDetectBackoff[mode]); } fprintf(fd ," | device type %1x ", ee->ee_deviceType); fprintf(fd ,"| Switch Settling Time 0x%02x |\n", ee->ee_switchSettling[mode]); fprintf(fd ," | ADC Desired size %2d ", ee->ee_adcDesiredSize[mode]); fprintf(fd ,"| XLNA Gain 0x%02x |\n", ee->ee_xlnaGain[mode]); fprintf(fd ," | tx end to XLNA on 0x%02x ", ee->ee_txEndToXLNAOn[mode]); fprintf(fd ,"| Threashold 62 0x%02x |\n", ee->ee_thresh62[mode]); fprintf(fd ," | tx end to XPA off 0x%02x ", ee->ee_txEndToXPAOff[mode]); fprintf(fd ,"| tx end to XPA on 0x%02x |\n", ee->ee_txFrameToXPAOn[mode]); fprintf(fd ," | PGA Desired size %2d ", ee->ee_pgaDesiredSize[mode]); fprintf(fd ,"| Noise Threshold %3d |\n", ee->ee_noiseFloorThresh[mode]); fprintf(fd ," | XPD Gain 0x%02x ", ee->ee_xgain[mode]); fprintf(fd ,"| XPD %1d |\n", ee->ee_xpd[mode]); fprintf(fd ," | txrx Attenuation 0x%02x ", ee->ee_txrxAtten[mode]); fprintf(fd ,"| Capabilities 0x%04X |\n", ee->ee_capField); if (version >= AR_EEPROM_VER5_0) { int is11g = (mode != headerInfo11A); fprintf(fd ," | Turbo txrx Attenuat 0x%02x ", ee->ee_txrxAtten[is11g]); fprintf(fd ,"| Turbo Switch Settling 0x%02X |\n", ee->ee_switchSettlingTurbo[is11g]); fprintf(fd ," | Turbo ADC Desired Size %2d ", ee->ee_adcDesiredSizeTurbo[is11g]); fprintf(fd ,"| Turbo PGA Desired Size %2d |\n", ee->ee_pgaDesiredSizeTurbo[is11g]); fprintf(fd ," | Turbo rxtx Margin 0x%02x ", ee->ee_rxtxMarginTurbo[is11g]); fprintf(fd ,"| |\n"); } for(j = 0; j < 10; j+=2) { fprintf(fd ," | Antenna control %2d 0x%02X ", j, ee->ee_antennaControl[j][mode]); fprintf(fd ,"| Antenna control %2d 0x%02X |\n", j + 1, ee->ee_antennaControl[j + 1][mode]); } fprintf(fd ," | Antenna control %2d 0x%02X ", j, ee->ee_antennaControl[j][mode]); fprintf(fd ,"| |\n"); fprintf(fd ," |-------------------------------------------------------------|\n"); if (mode == headerInfo11A) { fprintf(fd ," | OB_1 %1d ", ee->ee_ob1); fprintf(fd ,"| OB_2 %1d ", ee->ee_ob2); fprintf(fd ,"| OB_3 %1d ", ee->ee_ob3); fprintf(fd ,"| OB_4 %1d |\n", ee->ee_ob4); fprintf(fd ," | DB_1 %1d ", ee->ee_db1); fprintf(fd ,"| DB_2 %1d ", ee->ee_db2); fprintf(fd ,"| DB_3 %1d ", ee->ee_db3); fprintf(fd ,"| DB_4 %1d |\n", ee->ee_db4); } else { if(version >= AR_EEPROM_VER3_1) { if (mode == headerInfo11B) { fprintf(fd ," | OB_1 %1d ", ee->ee_obFor24); fprintf(fd ,"| B_OB %1d ", ee->ee_ob2GHz[0]); fprintf(fd ,"| DB_1 %1d ", ee->ee_dbFor24); fprintf(fd ,"| B_DB %1d |\n", ee->ee_db2GHz[0]); } else { fprintf(fd ," | OB_1 %1d ", ee->ee_obFor24g); fprintf(fd ,"| B_OB %1d ", ee->ee_ob2GHz[1]); fprintf(fd ,"| DB_1 %1d ", ee->ee_dbFor24g); fprintf(fd ,"| B_DB %1d |\n", ee->ee_db2GHz[1]); } } else { if (mode == headerInfo11B) { fprintf(fd ," | OB_1 %1d ", ee->ee_obFor24); fprintf(fd ,"| DB_1 %1d |\n", ee->ee_dbFor24); } else { fprintf(fd ," | OB_1 %1d ", ee->ee_obFor24g); fprintf(fd ,"| DB_1 %1d |\n", ee->ee_dbFor24g); } } } fprintf(fd ," ===============================================================\n");}static voidprintChannelInfo(FILE *fd, const HAL_EEPROM *ee, u_int mode){ u_int16_t i, j, k = 0; const DATA_PER_CHANNEL *pDataPerChannel; switch(mode) { case headerInfo11A: pDataPerChannel = ee->ee_dataPerChannel11a; break; case headerInfo11G: pDataPerChannel = ee->ee_dataPerChannel11g; break; case headerInfo11B: pDataPerChannel = ee->ee_dataPerChannel11b; break; default: fprintf(fd ,"%s: Illegal mode %u\n", __func__, mode); return; } fprintf(fd ,"\n"); if (mode == headerInfo11A) { fprintf(fd ,"=========================Calibration Information============================\n"); for (k = 0; k < 10; k+=5) { for (i = k; i < k + 5; i++) { fprintf(fd ,"| %04d ", pDataPerChannel[i].channelValue); } fprintf(fd ,"|\n"); fprintf(fd ,"|==============|==============|==============|==============|==============|\n"); for (i = k; i < k + 5; i++) { fprintf(fd ,"|pcdac pwr(dBm)"); } fprintf(fd ,"|\n"); for (j = 0; j < pDataPerChannel[0].numPcdacValues; j++) { for (i = k; i < k + 5; i++) { fprintf(fd ,"| %02d %2d.%02d ", pDataPerChannel[i].PcdacValues[j], pDataPerChannel[i].PwrValues[j] / EEP_SCALE, pDataPerChannel[i].PwrValues[j] % EEP_SCALE); } fprintf(fd ,"|\n"); } fprintf(fd ,"| | | | | |\n"); for (i = k; i < k + 5; i++) { fprintf(fd ,"| pcdac min %02d ", pDataPerChannel[i].pcdacMin); } fprintf(fd ,"|\n"); for (i = k; i < k + 5; i++) { fprintf(fd ,"| pcdac max %02d ", pDataPerChannel[i].pcdacMax); } fprintf(fd ,"|\n"); fprintf(fd ,"|==============|==============|==============|==============|==============|\n"); } } else { fprintf(fd ," ==========Calibration Information=============\n"); for (i = 0; i < 3; i++) { if (0 == i) { fprintf(fd ," "); } fprintf(fd ,"| %04d ", pDataPerChannel[i].channelValue); } fprintf(fd ,"|\n"); fprintf(fd ," |==============|==============|==============|\n"); for (i = 0; i < 3; i++) { if (0 == i) { fprintf(fd ," "); } fprintf(fd ,"|pcdac pwr(dBm)"); } fprintf(fd ,"|\n"); for (j = 0; j < pDataPerChannel[0].numPcdacValues; j++) { for (i = 0; i < 3; i++) { if (0 == i) { fprintf(fd ," "); } fprintf(fd ,"| %02d %2d.%02d ", pDataPerChannel[i].PcdacValues[j], pDataPerChannel[i].PwrValues[j] / EEP_SCALE, pDataPerChannel[i].PwrValues[j] % EEP_SCALE); } fprintf(fd ,"|\n"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -