?? meeprom_d.c
字號(hào):
/* mEEPROM_d.c - contians functions for reading eeprom and getting */
/* pcdac power settings for all channels for gen3 analog chips */
/* Copyright (c) 2001 Atheros Communications, Inc., All Rights Reserved */
/*
Revsision history
--------------------
1.0 Created.
*/
#ifdef VXWORKS
#include "vxworks.h"
#endif
#ifdef __ATH_DJGPPDOS__
#include <unistd.h>
#ifndef EILSEQ
#define EILSEQ EIO
#endif // EILSEQ
#define __int64 long long
typedef unsigned long DWORD;
#define Sleep delay
#endif // #ifdef __ATH_DJGPPDOS__
#include "wlantype.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef WIN32
#include <memory.h>
#include <conio.h>
#endif
#include "../athreg.h"
#include "../manlib.h"
#include "../mEeprom.h"
#include "../mConfig.h"
#include "../mDevtbl.h"
#include <errno.h>
#include "mEEPROM_d.h"
#define FALCON_BAND_EIRP_HEADROOM_IN_DB 6
MANLIB_API A_BOOL setup_raw_dataset_gen3(A_UINT32 devNum, RAW_DATA_STRUCT_GEN3 *pRawDataset_gen3, A_UINT16 myNumRawChannels, A_UINT16 *pMyRawChanList)
{
A_UINT16 i, j, channelValue;
if(!allocateRawDataStruct_gen3(devNum, pRawDataset_gen3, myNumRawChannels)) {
mError(devNum, EIO,"unable to allocate raw dataset (gen3)\n");
return(0);
}
for (i = 0; i < myNumRawChannels; i++) {
channelValue = pMyRawChanList[i];
pRawDataset_gen3->pChannels[i] = channelValue;
pRawDataset_gen3->pDataPerChannel[i].channelValue = channelValue;
for (j = 0; j < NUM_XPD_PER_CHANNEL; j++) {
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].xpd_gain = j;
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].numPcdacs = 0;
}
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[0].numPcdacs = 4;
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[3].numPcdacs = 3;
}
return(1);
}
A_BOOL allocateRawDataStruct_gen3(A_UINT32 devNum, RAW_DATA_STRUCT_GEN3 *pRawDataset_gen3, A_UINT16 numChannels)
{
A_UINT16 i, j, k;
A_UINT16 numPcdacs = NUM_POINTS_XPD0;
///allocate room for the channels
pRawDataset_gen3->pChannels = (A_UINT16 *)malloc(sizeof(A_UINT16) * numChannels);
if (NULL == pRawDataset_gen3->pChannels) {
mError(devNum, EIO,"unable to allocate raw data struct (gen3)\n");
return(0);
}
pRawDataset_gen3->pDataPerChannel = (RAW_DATA_PER_CHANNEL_GEN3 *)malloc(sizeof(RAW_DATA_PER_CHANNEL_GEN3) * numChannels);
if (NULL == pRawDataset_gen3->pDataPerChannel) {
mError(devNum, EIO,"unable to allocate raw data struct data per channel(gen3)\n");
free(pRawDataset_gen3->pChannels);
return(0);
}
pRawDataset_gen3->numChannels = numChannels;
for(i = 0; i < numChannels; i ++) {
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD = NULL;
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD = (RAW_DATA_PER_XPD_GEN3 *)malloc(sizeof(RAW_DATA_PER_XPD_GEN3) * NUM_XPD_PER_CHANNEL);
if (NULL == pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD) {
mError(devNum, EIO,"unable to allocate raw data struct pDataPerXPD (gen3)\n");
break; //will cleanup outside loop
}
for (j=0; j<NUM_XPD_PER_CHANNEL ; j++) {
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].pcdac = (A_UINT16 *)malloc(numPcdacs*sizeof(A_UINT16));
if(pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].pcdac == NULL) {
mError(devNum, EIO,"unable to allocate pcdacs for an xpd_gain (gen3)\n");
break;
}
pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].pwr_t4 = (A_INT16 *)malloc(numPcdacs*sizeof(A_INT16));
if(pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].pwr_t4 == NULL) {
mError(devNum, EIO,"unable to allocate pwr_t4 for an xpd_gain (gen3)\n");
if (pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].pcdac != NULL) {
free(pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[j].pcdac);
}
break; // cleanup outside the j loop
}
}
if (j != NUM_XPD_PER_CHANNEL) { // malloc must've failed
for (k=0; k<j; k++) {
if (pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[k].pcdac != NULL) {
free(pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[k].pcdac);
}
if (pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[k].pwr_t4 != NULL) {
free(pRawDataset_gen3->pDataPerChannel[i].pDataPerXPD[k].pwr_t4);
}
}
break; // cleanupo outside i loop
}
}
if (i != numChannels) {
//malloc must have failed, cleanup any allocs
for (j = 0; j < i; j++) {
for (k=0; k<NUM_XPD_PER_CHANNEL; k++) {
if (pRawDataset_gen3->pDataPerChannel[j].pDataPerXPD[k].pcdac != NULL) {
free(pRawDataset_gen3->pDataPerChannel[j].pDataPerXPD[k].pcdac);
}
if (pRawDataset_gen3->pDataPerChannel[j].pDataPerXPD[k].pwr_t4 != NULL) {
free(pRawDataset_gen3->pDataPerChannel[j].pDataPerXPD[k].pwr_t4);
}
}
if (pRawDataset_gen3->pDataPerChannel[j].pDataPerXPD != NULL) {
free(pRawDataset_gen3->pDataPerChannel[j].pDataPerXPD);
}
}
mError(devNum, EIO,"Failed to allocate raw data struct (gen3), freeing anything already allocated\n");
free(pRawDataset_gen3->pDataPerChannel);
free(pRawDataset_gen3->pChannels);
pRawDataset_gen3->numChannels = 0;
return(0);
}
return(1);
}
MANLIB_API A_BOOL setup_EEPROM_dataset_gen3(A_UINT32 devNum, EEPROM_DATA_STRUCT_GEN3 *pEEPROMDataset_gen3, A_UINT16 myNumRawChannels, A_UINT16 *pMyRawChanList)
{
A_UINT16 i, channelValue;
if(!allocateEEPROMDataStruct_gen3(devNum, pEEPROMDataset_gen3, myNumRawChannels)) {
mError(devNum, EIO,"unable to allocate EEPROM dataset (gen3)\n");
return(0);
}
for (i = 0; i < myNumRawChannels; i++) {
channelValue = pMyRawChanList[i];
pEEPROMDataset_gen3->pChannels[i] = channelValue;
pEEPROMDataset_gen3->pDataPerChannel[i].channelValue = channelValue;
}
return(1);
}
A_BOOL allocateEEPROMDataStruct_gen3(A_UINT32 devNum, EEPROM_DATA_STRUCT_GEN3 *pEEPROMDataset_gen3, A_UINT16 numChannels)
{
//allocate room for the channels
pEEPROMDataset_gen3->pChannels = (A_UINT16 *)malloc(sizeof(A_UINT16) * numChannels);
if (NULL == pEEPROMDataset_gen3->pChannels) {
mError(devNum, EIO,"unable to allocate EEPROM data struct (gen3)\n");
return(0);
}
pEEPROMDataset_gen3->pDataPerChannel = (EEPROM_DATA_PER_CHANNEL_GEN3 *)malloc(sizeof(EEPROM_DATA_PER_CHANNEL_GEN3) * numChannels);
if (NULL == pEEPROMDataset_gen3->pDataPerChannel) {
mError(devNum, EIO,"unable to allocate EEPROM data struct data per channel(gen3)\n");
if (pEEPROMDataset_gen3->pChannels != NULL) {
free(pEEPROMDataset_gen3->pChannels);
}
return(0);
}
pEEPROMDataset_gen3->numChannels = numChannels;
return(1);
}
A_BOOL read_Cal_Dataset_From_EEPROM(A_UINT32 devNum, EEPROM_DATA_STRUCT_GEN3 *pCalDataset, A_UINT32 start_offset, A_UINT32 maxPiers, A_UINT32 *words, A_UINT32 devlibMode) {
A_UINT16 ii;
A_UINT16 dbmmask = 0xff;
A_UINT16 pcdac_delta_mask = 0x1f;
A_UINT16 pcdac_mask = 0x3f;
A_UINT16 freqmask = 0xff;
A_UINT16 idx, numPiers;
A_UINT16 freq[NUM_11A_EEPROM_CHANNELS];
LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
MODE_HEADER_INFO hdrInfo;
idx = (A_UINT16)start_offset;
ii = 0;
if (devlibMode == MODE_11A) {
while (ii < maxPiers) {
if ((words[idx] & freqmask) == 0) {
idx++;
break;
} else {
freq[ii] = fbin2freq_gen3((words[idx] & freqmask), devlibMode);
}
ii++;
if (((words[idx] >> 8) & freqmask) == 0) {
idx++;
break;
} else {
freq[ii] = fbin2freq_gen3(((words[idx] >> 8) & freqmask), devlibMode);
}
ii++;
idx++;
}
idx = (A_UINT16)(start_offset + (NUM_11A_EEPROM_CHANNELS / 2) );
} else {
hdrInfo = (devlibMode == MODE_11G) ? pLibDev->p16kEepHeader->info11g : pLibDev->p16kEepHeader->info11b;
ii = 0;
if (hdrInfo.calPier1 != 0xff) freq[ii++] = hdrInfo.calPier1;
if (hdrInfo.calPier2 != 0xff) freq[ii++] = hdrInfo.calPier2;
if (hdrInfo.calPier3 != 0xff) freq[ii++] = hdrInfo.calPier3;
}
numPiers = ii;
if (!setup_EEPROM_dataset_gen3(devNum, pCalDataset, numPiers, &(freq[0])) ) {
mError(devNum, EIO,"unable to allocate cal dataset (gen3) in read_from_eeprom...\n");
return(0);
}
for (ii=0; ii<pCalDataset->numChannels; ii++) {
pCalDataset->pDataPerChannel[ii].pwr1_xg0 = (A_INT16)((words[idx] & dbmmask) - ((words[idx] >> 7) & 0x1)*256);
pCalDataset->pDataPerChannel[ii].pwr2_xg0 = (A_INT16)(((words[idx] >> 8) & dbmmask) - ((words[idx] >> 15) & 0x1)*256);
idx++;
pCalDataset->pDataPerChannel[ii].pwr3_xg0 = (A_INT16)((words[idx] & dbmmask) - ((words[idx] >> 7) & 0x1)*256);
pCalDataset->pDataPerChannel[ii].pwr4_xg0 = (A_INT16)(((words[idx] >> 8) & dbmmask) - ((words[idx] >> 15) & 0x1)*256);
idx++;
pCalDataset->pDataPerChannel[ii].pcd2_delta_xg0 = (A_UINT16)(words[idx] & pcdac_delta_mask);
pCalDataset->pDataPerChannel[ii].pcd3_delta_xg0 = (A_UINT16)((words[idx] >> 5) & pcdac_delta_mask);
pCalDataset->pDataPerChannel[ii].pcd4_delta_xg0 = (A_UINT16)((words[idx] >> 10) & pcdac_delta_mask);
idx++;
pCalDataset->pDataPerChannel[ii].pwr1_xg3 = (A_INT16)((words[idx] & dbmmask) - ((words[idx] >> 7) & 0x1)*256);
pCalDataset->pDataPerChannel[ii].pwr2_xg3 = (A_INT16)(((words[idx] >> 8) & dbmmask) - ((words[idx] >> 15) & 0x1)*256);
idx++;
pCalDataset->pDataPerChannel[ii].pwr3_xg3 = (A_INT16)((words[idx] & dbmmask) - ((words[idx] >> 7) & 0x1)*256);
if((pLibDev->p16kEepHeader->majorVersion == 4) && (pLibDev->p16kEepHeader->minorVersion < 3)) {
pCalDataset->pDataPerChannel[ii].maxPower_t4 = (A_INT16)(((words[idx] >> 8) & dbmmask) - ((words[idx] >> 15) & 0x1)*256);
pCalDataset->pDataPerChannel[ii].pcd1_xg0 = 1;
} else {
pCalDataset->pDataPerChannel[ii].maxPower_t4 = pCalDataset->pDataPerChannel[ii].pwr4_xg0;
pCalDataset->pDataPerChannel[ii].pcd1_xg0 = (A_UINT16)((words[idx] >> 8) & pcdac_mask);
}
idx++;
}
return(1);
}
void eeprom_to_raw_dataset_gen3(A_UINT32 devNum, EEPROM_DATA_STRUCT_GEN3 *pCalDataset, RAW_DATA_STRUCT_GEN3 *pRawDataset) {
A_UINT16 ii, jj, kk;
A_INT16 maxPower_t4;
RAW_DATA_PER_XPD_GEN3 *pRawXPD;
EEPROM_DATA_PER_CHANNEL_GEN3 *pCalCh; //ptr to array of info held per channel
A_UINT16 xgain_list[2];
A_UINT16 xpd_mask;
pRawDataset->xpd_mask = pCalDataset->xpd_mask;
xgain_list[0] = 0xDEAD;
xgain_list[1] = 0xDEAD;
kk = 0;
xpd_mask = pRawDataset->xpd_mask;
for (jj = 0; jj < NUM_XPD_PER_CHANNEL; jj++) {
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -