⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 meeprom.c

📁 atheros ar5001 5002 driver
💻 C
📖 第 1 页 / 共 5 页
字号:
	else {
		returnValue = (A_UINT16)(2300 + fbin);
	}
	return returnValue;
}


/**************************************************************************
* allocateEepStructs - Allocate structs to hold eeprom contents
*
* Fills in pointers of the LIB_DEV_INFO struct
*
* RETURNS: TRUE if successfully allocated, false otherwise
*/
A_BOOL allocateEepStructs
(
 A_UINT32			devNum
)
{
    LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
	A_UINT32	 i;

	//check to see if we already allocated thes stucts, if so, don't do again
	//if one ptrs is not null then so will the rest.
	if(pLibDev->pCalibrationInfo) {
		return(TRUE);
	}

	//allocate the struct to hold the pcdac/power info
	pLibDev->pCalibrationInfo = (MDK_PCDACS_ALL_MODES *)malloc(sizeof(MDK_PCDACS_ALL_MODES));
	if(NULL == pLibDev->pCalibrationInfo) {
		mError(devNum, ENOMEM, "Device Number %d:Device Number %d:Unable to allocate eeprom structure for pcdac/power info\n", devNum);
		return FALSE;
	}
	
	memset(pLibDev->pCalibrationInfo, 0, sizeof(MDK_PCDACS_ALL_MODES));

	pLibDev->pCalibrationInfo->numChannels_11a = NUM_11A_EEPROM_CHANNELS;
	pLibDev->pCalibrationInfo->numChannels_2_4 = NUM_2_4_EEPROM_CHANNELS;

	for(i = 0; i < NUM_11A_EEPROM_CHANNELS; i ++) {		
		pLibDev->pCalibrationInfo->DataPerChannel_11a[i].numPcdacValues = NUM_PCDAC_VALUES;	
	}

	//allocate the struct to hold the header info
	pLibDev->p16kEepHeader = (MDK_EEP_HEADER_INFO *)malloc(sizeof(MDK_EEP_HEADER_INFO));
	if(NULL ==pLibDev->p16kEepHeader) {
		mError(devNum, ENOMEM, "Device Number %d:Device Number %d:Unable to allocate eeprom structure for header info\n", devNum);
		freeEepStructs(devNum);
		return FALSE;
	}
	memset(pLibDev->p16kEepHeader, 0, sizeof(MDK_EEP_HEADER_INFO));

	//allocate the structure to hold target power info
	pLibDev->p16KTrgtPowerInfo = (MDK_TRGT_POWER_ALL_MODES *)malloc(sizeof(MDK_TRGT_POWER_ALL_MODES));
	if(NULL == pLibDev->p16KTrgtPowerInfo) {
		mError(devNum, ENOMEM, "Device Number %d:Device Number %d:Unable to allocate eeprom structure for target power info\n", devNum);
		freeEepStructs(devNum);
		return FALSE;
	}
	memset(pLibDev->p16KTrgtPowerInfo, 0, sizeof(MDK_TRGT_POWER_ALL_MODES));
	pLibDev->p16kEepHeader->scaledOfdmCckDelta = TENX_OFDM_CCK_DELTA_INIT;
	pLibDev->p16kEepHeader->scaledCh14FilterCckDelta = TENX_CH14_FILTER_CCK_DELTA_INIT;	
	pLibDev->p16kEepHeader->ofdmCckGainDeltaX2 = OFDM_CCK_GAIN_DELTA_INIT;

	//allocate structure for RD edges
	pLibDev->p16KRdEdgesPower = (MDK_RD_EDGES_POWER *)malloc(sizeof(MDK_RD_EDGES_POWER) * NUM_16K_EDGES * MAX_NUM_CTL);
	if(NULL == pLibDev->p16KRdEdgesPower) {
		mError(devNum, ENOMEM, "Device Number %d:Device Number %d:Unable to allocate eeprom structure for RD edges info\n", devNum);
		freeEepStructs(devNum);
		return FALSE;
	}
	memset(pLibDev->p16KRdEdgesPower, 0, sizeof(sizeof(MDK_RD_EDGES_POWER) * NUM_16K_EDGES * MAX_NUM_CTL));
	
	return TRUE;
}


/**************************************************************************
* freeEepStructs - Free EEPROM structs from LIB_DEV_INFO
*
* Generic free function, has to check for allocation before free since
* not all structs may be allocated.
*
* RETURNS:
*/
void freeEepStructs
(
 A_UINT32			devNum
)
{
    LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];

	if(pLibDev->pCalibrationInfo != NULL) {
		free(pLibDev->pCalibrationInfo);
		pLibDev->pCalibrationInfo = NULL;
	}

	if(pLibDev->p16kEepHeader != NULL) {
		free(pLibDev->p16kEepHeader);
		pLibDev->p16kEepHeader = NULL;
	}

	if(pLibDev->p16KTrgtPowerInfo != NULL) {
		free(pLibDev->p16KTrgtPowerInfo);
		pLibDev->p16KTrgtPowerInfo = NULL;
	}
	
	if (pLibDev->p16KRdEdgesPower != NULL) {
		free(pLibDev->p16KRdEdgesPower);
		pLibDev->p16KRdEdgesPower = NULL;
	}

	if(pLibDev->pGen3CalData != NULL) {
		free(pLibDev->pGen3CalData);
		pLibDev->pGen3CalData = NULL;
	}
	return;
}


/**************************************************************************
* readEepromIntoDataset - Read eeprom contents into structs held by LIB_DEV_INFO 
*
* 
*
* RETURNS: TRUE of OK, FALSE otherwise
*/
A_BOOL readEepromIntoDataset
(
 A_UINT32			devNum
)
{
    LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
	A_UINT32			tempValue;
	A_UINT16			i, j, jj;
	A_UINT16			offset = 0;
	MDK_RD_EDGES_POWER		*pRdEdgePwrInfo = pLibDev->p16KRdEdgesPower;
	MDK_TRGT_POWER_INFO	    *pPowerInfo = NULL;
	A_UINT16			numChannels = 0;
	A_UINT16			mode;
	A_UINT16			*pNumTrgtChannels = NULL;
	A_UINT16			sizeCtl;
	EEPROM_DATA_STRUCT_GEN3 *pTempGen3CalData[3];

	//verify the checksum
	if (!eepromVerifyChecksum(devNum)) {
		mError(devNum, EIO, "Device Number %d: eeprom checksum failed\n", devNum);
		return FALSE;
	}

	//get the version information
	tempValue = eepromRead(devNum, HDR_VERSION);
	pLibDev->p16kEepHeader->majorVersion = (A_UINT16)((tempValue >> 12) & 0x0f);
	pLibDev->p16kEepHeader->minorVersion = (A_UINT16)(tempValue & 0x0fff);

	
	if((pLibDev->p16kEepHeader->majorVersion == 3) && (pLibDev->p16kEepHeader->minorVersion <= 2)) {
		pOffsets = &eep3_2;
		pLibDev->p16kEepHeader->numCtl = NUM_CTL_EEP3_2;
	}
	else if(((pLibDev->p16kEepHeader->majorVersion == 3) && (pLibDev->p16kEepHeader->minorVersion >= 3)) ||
			(pLibDev->p16kEepHeader->majorVersion == 4) )
	{
		pOffsets = &eep3_3;	
		pLibDev->p16kEepHeader->numCtl = NUM_CTL_EEP3_3;
	}
	else {
		mError(devNum, EIO, "Device Number %d:Device Number %d:eeprom version not supported\n", devNum);
		return (FALSE);
	}

	if (!(( pLibDev->p16kEepHeader->majorVersion > 3) || 
		( pLibDev->p16kEepHeader->majorVersion == 3) && (pLibDev->p16kEepHeader->minorVersion >= 2)))
	{
		for (jj=0; jj<NUM_INTERCEPTS; jj++)
		{
			intercepts[jj] = intercepts_pre3p2[jj] ;
		}
	}
	

	//the channel list for 2.4 is fixed, fill this in here
	for(i = 0; i < NUM_2_4_EEPROM_CHANNELS; i++) {
		pLibDev->pCalibrationInfo->Channels_11b[i] = channels_11b[i];
		if((pLibDev->p16kEepHeader->majorVersion == 3) && (pLibDev->p16kEepHeader->minorVersion <= 2)) {
			pLibDev->pCalibrationInfo->Channels_11g[i] = channels_11b[i];
		}
		else {
			pLibDev->pCalibrationInfo->Channels_11g[i] = channels_11g[i];
		}
		pLibDev->pCalibrationInfo->DataPerChannel_11b[i].numPcdacValues = NUM_PCDAC_VALUES;	
		pLibDev->pCalibrationInfo->DataPerChannel_11g[i].numPcdacValues = NUM_PCDAC_VALUES;	
	}

	//read the header information here
	readHeaderInfo(devNum, pLibDev->p16kEepHeader);

	if((pLibDev->p16kEepHeader->majorVersion == 3) ||
		((pLibDev->p16kEepHeader->majorVersion == 4) && (pLibDev->p16kEepHeader->eepMap == 0)))
	{
		if(!readCalData_gen2(devNum, pLibDev->pCalibrationInfo)) {
			return (FALSE);
		}
	}
	else if((pLibDev->p16kEepHeader->majorVersion == 4) && (pLibDev->p16kEepHeader->eepMap)) {
		if(!initialize_datasets(devNum, pTempGen3CalData, pLibDev->pGen3RawData)) {
			return (FALSE);
		}

		//read eeprom data into contiguous struct
		if(pLibDev->pGen3CalData == NULL) {
			pLibDev->pGen3CalData = (EEPROM_FULL_DATA_STRUCT_GEN3 *)malloc(sizeof(EEPROM_FULL_DATA_STRUCT_GEN3));
			if(NULL == pLibDev->pGen3CalData) {
				mError(devNum, ENOMEM, "Device Number %d:Device Number %d:Unable to allocate memory for full gen3 eeprom struct\n", devNum);
				return (FALSE);
			}

		}

		//copy in the data
		memset(pLibDev->pGen3CalData, 0, sizeof(EEPROM_FULL_DATA_STRUCT_GEN3));
		copyGen3EepromStruct(pLibDev->pGen3CalData, pTempGen3CalData);
		
		//#######TO DO would free pTempGen3CalData here

	}


	//read the power per rate info for test channels
	for(mode = 0; mode <= MAX_MODE; mode++) {
		switch(mode) {
		case MODE_11A:
			offset = pOffsets->GROUP5_11A_TRGT_PWR;
			if(pLibDev->p16kEepHeader->majorVersion == 4) {
				offset = pLibDev->p16kEepHeader->trgtPowerStartLocation;
			}
			numChannels = NUM_TEST_FREQUENCIES;
			pPowerInfo = pLibDev->p16KTrgtPowerInfo->trgtPwr_11a;
			pNumTrgtChannels = &(pLibDev->p16KTrgtPowerInfo->numTargetPwr_11a);
			break;

		case MODE_11G:
		case MODE_11O:
			offset = pOffsets->GROUP7_11G_TRGT_PWR;
			if(pLibDev->p16kEepHeader->majorVersion == 4) {
				offset = (A_UINT16)(pLibDev->p16kEepHeader->trgtPowerStartLocation + 0x14);
			}
			numChannels = 3;
			pPowerInfo = pLibDev->p16KTrgtPowerInfo->trgtPwr_11g;
			pNumTrgtChannels = &(pLibDev->p16KTrgtPowerInfo->numTargetPwr_11g);
			break;
		
		case MODE_11B:
			offset = pOffsets->GROUP6_11B_TRGT_PWR;
			if(pLibDev->p16kEepHeader->majorVersion == 4) {
				offset = (A_UINT16)(pLibDev->p16kEepHeader->trgtPowerStartLocation + 0x10);
			}
			numChannels = 2;
			pPowerInfo = pLibDev->p16KTrgtPowerInfo->trgtPwr_11b;
			pNumTrgtChannels = &(pLibDev->p16KTrgtPowerInfo->numTargetPwr_11b);
			break;
		default:
			mError(devNum, EIO, "Device Number %d:Device Number %d:Bad mode in readEepromIntoDataset, internal software error, should not get here\n", devNum);
			return(FALSE);
		} //end switch

		*pNumTrgtChannels = 0;
		for(i = 0; i < numChannels; i++) {
			if(readTrgtPowers(devNum, offset, pPowerInfo, mode)) {
				(*pNumTrgtChannels)++;
			}
			pPowerInfo++;
			offset+=2;
		}

	}
	
	//read the CTL edge power limits
	
	i = 0;
	offset = pOffsets->GROUP8_CTL_INFO;
	if(pLibDev->p16kEepHeader->majorVersion == 4) {
		offset = (A_UINT16)(pLibDev->p16kEepHeader->trgtPowerStartLocation + 0x1a);
	}
	while ((pLibDev->p16kEepHeader->testGroups[i] != 0) && (i < pLibDev->p16kEepHeader->numCtl)) {
		sizeCtl = readCtlInfo(devNum, offset, pRdEdgePwrInfo);
		
		for(j = 0; j < NUM_16K_EDGES; j++ ) {
			if ((pRdEdgePwrInfo[j].rdEdge==0) && (pRdEdgePwrInfo[j].twice_rdEdgePower==0))
			{
				pRdEdgePwrInfo[j].rdEdge = 0; // if not all rdedges were specified for this CTL
			} else
			{
				if(((pLibDev->p16kEepHeader->testGroups[i] & 0x3) == 0) ||
					((pLibDev->p16kEepHeader->testGroups[i] & 0x3) == 0x3)  ){ //turbo mode
				
					pRdEdgePwrInfo[j].rdEdge = fbin2freq(devNum, pRdEdgePwrInfo[j].rdEdge);
				}
				else {
					pRdEdgePwrInfo[j].rdEdge = fbin2freq_2p4(devNum, pRdEdgePwrInfo[j].rdEdge);
				}
			}
		}
		i++;
		offset = (A_UINT16)(offset + sizeCtl);
		pRdEdgePwrInfo+=NUM_16K_EDGES;
	}
	  
	return TRUE;
}
// only searches for integer values in integer lists. used for channel and pcdac lists
void iGetLowerUpperValues 
(
 A_UINT16	value,			//value to search for
 A_UINT16	*pList,			//ptr to the list to search
 A_UINT16	listSize,		//number of entries in list
 A_UINT16	*pLowerValue,	//return the lower value
 A_UINT16	*pUpperValue	//return the upper value	
)
{
	A_UINT16	i;
	A_UINT16	listEndValue = *(pList + listSize - 1);
	A_UINT16	target = value ;

	//see if value is lower than the first value in the list
	//if so return first value
	if (target <= (*pList)) {
		*pLowerValue = *pList;
		*pUpperValue = *pList;
		return;
	}
  
	//see if value is greater than last value in list
	//if so return last value
	if (target >= listEndValue) {
		*pLowerValue = listEndValue;
		*pUpperValue = listEndValue;
		return;
	}

	//look for value being near or between 2 values in list
	for(i = 0; i < listSize; i++) {
		//if value is close to the current value of the list 
		//then target is not between values, it is one of the values
		if (pList[i] == target) {
			*pLowerValue = pList[i];
			*pUpperValue = pList[i];
			return;
		}

		//look for value being between current value and next value
		//if so return these 2 values
		if (target < pList[i + 1]) {
			*pLowerValue = pList[i];
			*pUpperValue = pList[i + 1];
			return;
		}
	}
} 

/**************************************************************************
* readHeaderInfo - Read eeprom header info
*
* RETURNS: 
*/
void  readHeaderInfo
(
 A_UINT32			devNum,
 MDK_EEP_HEADER_INFO	*pHeaderInfo		//ptr to header struct to fill
)
{
	A_UINT32		tempValue;
	A_UINT16		offset;
	A_UINT16        i;
	MODE_HEADER_INFO	*pModeInfo;
    LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];


	tempValue = eepromRead(devNum, pOffsets->HDR_COUNTRY_CODE);
	pHeaderInfo->countryRegCode = (A_UINT16)(tempValue);

	if(((pHeaderInfo->majorVersion == 3) && (pHeaderInfo->minorVersion >= 2)) 
			|| (pHeaderInfo->majorVersion == 4)){
		pHeaderInfo->countryRegCode = (A_UINT16)(pHeaderInfo->countryRegCode & 0xfff);
		pHeaderInfo->countryCodeFlag = (A_UINT16)((tempValue >> 15) & 0x01);

	if(((pHeaderInfo->majorVersion == 3) && (pHeaderInfo->minorVersion >= 3)) 
			|| (pHeaderInfo->majorVersion == 4)){
			pHeaderInfo->worldwideRoaming = (A_UINT16)((tempValue >> 14) & 0x01);
		}
	}
	else {
		pHeaderInfo->countryCodeFlag = 1;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -