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

📄 dk_client.c

📁 Atheros AP Test with Agilent N4010A source code
💻 C
📖 第 1 页 / 共 5 页
字号:
        {
        uiPrintf("Error, command Len is not equal to size of HW_RESET_CMD\n");
        return(COMMS_ERR_BAD_LENGTH);
        }

	pdevInfo = globDrvInfo.pDevInfoArray[dkThread->currentDevIndex];
#if defined(FREEDOM_AP) || defined(PREDATOR) || defined(SENAO_AP)
    hwInit(pdevInfo, pCmd->CMD_U.HW_RESET_CMD.resetMask);
#else
    hwInit(pdevInfo, pCmd->CMD_U.HW_RESET_CMD.resetMask);
#endif

#if defined(FREEDOM_AP) 

#ifdef SOC_LINUX

#if defined(AR5312)
	*((A_UINT32 *)replyBuf) = (apRegRead32(dkThread->currentDevIndex, AR531X_REV) >> REV_WMAC_MIN_S)&0xff ;
#endif
#if defined(AR5315)
	*((A_UINT32 *)replyBuf) =  (apRegRead32(dkThread->devIndex, AR531XPLUS_WLAN0)+F2_SREV) & F2_SREV_ID_M ;
#endif

#else

#if defined(AR5312)
	*((A_UINT32 *)replyBuf) = (sysRegRead(AR531X_REV) >> REV_WMAC_MIN_S)&0xff ;
#endif
#if defined(AR5315)
	*((A_UINT32 *)replyBuf) =  (sysRegRead(AR531XPLUS_WLAN0)+F2_SREV) & F2_SREV_ID_M ;
#endif
#endif

#else
#if defined(PHOENIX)
	*((A_UINT32 *)replyBuf) = CHIP_REV_ID_GET(hwMemRead32((A_UINT16)dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + CHIP_REV_ADDRESS));
#else
	*((A_UINT32 *)replyBuf) = hwMemRead32((A_UINT16)dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + F2_SREV) & F2_SREV_ID_M;
#endif
#endif

#ifdef ENDIAN_SWAP
    *((A_UINT32 *)replyBuf) = btol_l(*((A_UINT32 *)replyBuf));
#endif

    return(0);
    }

A_UINT32 processPllProgram( struct dkThreadInfo *dkThread) {
	PIPE_CMD      *pCmd;
	CMD_REPLY     *ReplyCmd_p;
	A_UCHAR     *replyBuf;
	MDK_WLAN_DEV_INFO    *pdevInfo;
	A_INT8 mode, turbo;

	pCmd = dkThread->PipeBuffer_p;
	ReplyCmd_p = dkThread->ReplyCmd_p;
	replyBuf = (A_UCHAR *)(ReplyCmd_p->cmdBytes);
    
    /* check that the size is appropriate before we access */
    if( pCmd->cmdLen != sizeof(pCmd->CMD_U.PLL_PROGRAM_CMD)+sizeof(pCmd->cmdID) + sizeof(pCmd->devNum) )
        {
        uiPrintf("Error, command Len is not equal to size of PLL_PROGRAM_CMD\n");
        return(COMMS_ERR_BAD_LENGTH);
        }

	pdevInfo = globDrvInfo.pDevInfoArray[dkThread->currentDevIndex];
   //uiPrintf("mode=%d:addr=%x\n", pCmd->CMD_U.PLL_PROGRAM_CMD.mode, pdevInfo->pdkInfo->f2MapAddress );
#if defined(FREEDOM_AP) 
	hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0xa200, 0);
	if(pCmd->CMD_U.PLL_PROGRAM_CMD.mode == MODE_11B)   {
	    hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0x4b);
	} else {
	    hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0x05);
	}
	milliSleep(2);
    hwInit(pdevInfo, MAC_RESET|BB_RESET);
#endif

#if defined(PREDATOR)

	mode = pCmd->CMD_U.PLL_PROGRAM_CMD.mode;
	turbo = pCmd->CMD_U.PLL_PROGRAM_CMD.turbo;

	switch(mode) {
		case MODE_11B:	
	      hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0xd6);
		break;

		case MODE_11G:	
			switch(turbo) {
				case HALF_SPEED_MODE:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0x1eb);
				break;
				case QUARTER_SPEED_MODE:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0x2eb);
				break;
				case TURBO_ENABLE:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0xea);
				break;
				default:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0xeb);
			    break;
			}
		break;

		case MODE_11A:
		case MODE_11O:
			switch(turbo) {
				case HALF_SPEED_MODE:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0x1ea);
				break;
				case QUARTER_SPEED_MODE:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0x2ea);
				break;
				default:
	      		  hwMemWrite32(dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + 0x987c, 0xea);
				break;
			}
		break;
    }

	milliSleep(2);
    hwInit(pdevInfo, MAC_RESET|BB_RESET);
#endif

    return(0);
}

A_UINT32 processPciWriteCmd
(
	struct dkThreadInfo *dkThread
)
{
	PIPE_CMD      *pCmd;
	CMD_REPLY     *ReplyCmd_p;
	A_UCHAR     *replyBuf;
	PCI_VALUES 	*pPciValues;
	A_UINT32 i;
	MDK_WLAN_DEV_INFO    *pdevInfo;
	A_UINT32 expectedDataLen, recdDataLen;
	A_UINT32 dataSize;

	pdevInfo = globDrvInfo.pDevInfoArray[dkThread->currentDevIndex];
	pCmd = dkThread->PipeBuffer_p;
	ReplyCmd_p = dkThread->ReplyCmd_p;
	replyBuf = (A_UCHAR *)(ReplyCmd_p->cmdBytes);

	pPciValues = pCmd->CMD_U.PCI_WRITE_CMD.pPciValues;

	#ifdef ENDIAN_SWAP
     	pCmd->CMD_U.PCI_WRITE_CMD.length = ltob_l(pCmd->CMD_U.PCI_WRITE_CMD.length); 
	    for(i=0; i<pCmd->CMD_U.PCI_WRITE_CMD.length; i++) {
			pPciValues[i].offset = ltob_l(pPciValues[i].offset);
			pPciValues[i].baseValue = ltob_l(pPciValues[i].baseValue);
		}
	#endif

	dataSize = sizeof(pCmd->CMD_U.PCI_WRITE_CMD) - ((MAX_PCI_ENTRIES-pCmd->CMD_U.PCI_WRITE_CMD.length) * sizeof(PCI_VALUES));
	//dataSize = pCmd->CMD_U.PCI_WRITE_CMD.length * sizeof(PCI_VALUES);

    if( pCmd->cmdLen != (sizeof(pCmd->cmdID) + dataSize + sizeof(pCmd->devNum)))
    {
       uiPrintf("Error: command Len is not equal to size of expected bytes for PCI_WRITE_CMD\n");
	   uiPrintf(": got %d, expected %d\n", pCmd->cmdLen, (sizeof(pCmd->cmdID) + dataSize + sizeof(pCmd->devNum)));
       return(COMMS_ERR_BAD_LENGTH);
    }

	for(i=0; i<pCmd->CMD_U.PCI_WRITE_CMD.length; i++) {
	  hwMemWrite32((A_UINT16)dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + pPciValues[i].offset, pPciValues[i].baseValue);
	}
  return (0);
}

A_UINT32 processCalCheckCmd( struct dkThreadInfo *dkThread) {
	PIPE_CMD      *pCmd;
	CMD_REPLY     *ReplyCmd_p;
	A_UCHAR     *replyBuf;
	A_UINT32 i;
	A_UINT32 enableCal, regValue;
	MDK_WLAN_DEV_INFO    *pdevInfo;

	pdevInfo = globDrvInfo.pDevInfoArray[dkThread->currentDevIndex];

	pCmd = dkThread->PipeBuffer_p;
	ReplyCmd_p = dkThread->ReplyCmd_p;
	replyBuf = (A_UCHAR *)(ReplyCmd_p->cmdBytes);
    
    /* check that the size is appropriate before we access */
    if( pCmd->cmdLen != sizeof(pCmd->CMD_U.CAL_CHECK_CMD)+sizeof(pCmd->cmdID) + sizeof(pCmd->devNum) )
        {
        uiPrintf("Error, command Len is not equal to size of CAL_CHECK_CMD\n");
        return(COMMS_ERR_BAD_LENGTH);
        }

#ifdef ENDIAN_SWAP
		pCmd->CMD_U.CAL_CHECK_CMD.timeout = ltob_l(pCmd->CMD_U.CAL_CHECK_CMD.timeout);
		pCmd->CMD_U.CAL_CHECK_CMD.enableCal = ltob_l(pCmd->CMD_U.CAL_CHECK_CMD.enableCal);
#endif
		enableCal = pCmd->CMD_U.CAL_CHECK_CMD.enableCal;

		  for (i = 0; i < pCmd->CMD_U.CAL_CHECK_CMD.timeout; i++)
		  {
			regValue = hwMemRead32((A_UINT16)dkThread->currentDevIndex,pdevInfo->pdkInfo->f2MapAddress + PHY_AGC_CONTROL);
			if ((regValue & enableCal) == 0 )
			{
				break;
			}
			milliSleep(1);
		  }


		*((A_UINT32 *)replyBuf)  = i;
#ifdef ENDIAN_SWAP
        *((A_UINT32 *)replyBuf) = btol_l(*((A_UINT32 *)replyBuf));
#endif

  return (0);

}

#if  defined(PREDATOR) || defined(AR6000)
A_UINT32 processEepromReadBlockCmd
(
	struct dkThreadInfo *dkThread
)
{
	PIPE_CMD      *pCmd;
	CMD_REPLY     *ReplyCmd_p;
	A_UCHAR     *replyBuf;
	PDWORDBUFFER pDwordBuffer = NULL;
	A_UINT32 *pDword;
	A_UINT32 i;
    A_UINT32    eepromValue, eepromOffset, j, eepOffset;

	pCmd = dkThread->PipeBuffer_p;
	ReplyCmd_p = dkThread->ReplyCmd_p;
	replyBuf = (A_UCHAR *)(ReplyCmd_p->cmdBytes);

	/* check that the size is appropriate before we access */
     	if( pCmd->cmdLen != sizeof(pCmd->CMD_U.EEPROM_READ_BLOCK_CMD)+sizeof(pCmd->cmdID) + sizeof(pCmd->devNum)) 
        {
        	uiPrintf("Error, command Len is not equal to size of EEPROM_READ_BLOCK_CMD\n");
        	return(COMMS_ERR_BAD_LENGTH);
        }

	#ifdef ENDIAN_SWAP
     		pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset = ltob_l(pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset);
     		pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length = ltob_l(pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length);
	#endif

	pDword = (A_UINT32 *)replyBuf;	
	eepOffset = AR5523_FLASH_ADDRESS + cal_offset;
	for  (j=0;j<pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length;j++)	{
	        eepromOffset = ((pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset+j)<<1)+eepOffset;
            //eepromValue = sysFlashRead(eepromOffset);
	        eepromValue = apRegRead32(eepromOffset);
	        if (eepromOffset & 0x2)
              pDword[j] = (A_UINT32) ( (eepromValue>>16) & 0xffff);
		    else
              pDword[j] = (A_UINT32) (eepromValue & 0xffff);
	#ifdef ENDIAN_SWAP
	  	  		pDword[j] = btol_l(pDword[j]);
	#endif
    }

	return 0;
}
#else
/**************************************************************************
* eepromRead - Read from given EEPROM offset and return the 16 bit value
*/

A_UINT32 processEepromReadBlockCmd
(
	struct dkThreadInfo *dkThread
)
{
	PIPE_CMD      *pCmd;
	CMD_REPLY     *ReplyCmd_p;
	A_UCHAR     *replyBuf;
	PDWORDBUFFER pDwordBuffer = NULL;
	A_UINT32 *pDword;
	A_UINT32 i;
#if defined(THIN_CLIENT_BUILD)
    A_UINT32    eepromValue, eepromOffset, j;
#endif

	pCmd = dkThread->PipeBuffer_p;
	ReplyCmd_p = dkThread->ReplyCmd_p;
	replyBuf = (A_UCHAR *)(ReplyCmd_p->cmdBytes);

	/* check that the size is appropriate before we access */
     	if( pCmd->cmdLen != sizeof(pCmd->CMD_U.EEPROM_READ_BLOCK_CMD)+sizeof(pCmd->cmdID) + sizeof(pCmd->devNum)) 
        {
        	uiPrintf("Error, command Len is not equal to size of EEPROM_READ_BLOCK_CMD\n");
        	return(COMMS_ERR_BAD_LENGTH);
        }

	#ifdef ENDIAN_SWAP
     		pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset = ltob_l(pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset);
     		pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length = ltob_l(pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length);
	#endif

#if defined(THIN_CLIENT_BUILD)
	pDwordBuffer = (PDWORDBUFFER) A_MALLOC(sizeof(DWORDBUFFER));
    	if (!pDwordBuffer) {
        	return(COMMS_ERR_ALLOC_FAIL);
    	}

	pDwordBuffer->pDword = (A_UINT32 *)A_MALLOC( pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length* 4);
	if(!pDwordBuffer->pDword) {
		A_FREE(pDwordBuffer);
 		return(COMMS_ERR_ALLOC_FAIL);
    }
#if defined(SPIRIT_AP) || defined(FREEDOM_AP) // || defined(PREDATOR)
	for  (j=0;j<pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length;j++)	{
	    eepromOffset = (pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset+j) << 1;
        pDwordBuffer->pDword[j] = (A_UINT32)((sysFlashConfigRead(FLC_RADIOCFG, eepromOffset) << 8) | (sysFlashConfigRead(FLC_RADIOCFG, (eepromOffset + 1))));
    }
#else // !SPIRIT_AP || !FREEDOM_AP

#if defined(PHOENIX)
	for  (j=0;j<pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length;j++)	{
    	eepromOffset = (pCmd->CMD_U.EEPROM_READ_CMD.offset<<1);
        eepromValue = sysFlashConfigRead(FLC_RADIOCFG, eepromOffset)  | (sysFlashConfigRead(FLC_RADIOCFG, (eepromOffset + 1)) << 8);
    }
#else
	for  (j=0;j<pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length;j++)	{
	    if ( pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset & 0x10000000)  {
    	    eepromOffset = (pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset & 0x7fffffff) + AR5523_FLASH_ADDRESS;
		    eepromValue = apRegRead32(eepromOffset);
            pDwordBuffer->pDword[j] = (A_UINT32) eepromValue;
	    }
		else {
	        eepromOffset = ( ((pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset+j)<<1)+ AR5523_FLASH_ADDRESS + cal_offset);
            //eepromValue = sysFlashRead(eepromOffset);
	        eepromValue = apRegRead32(eepromOffset);
	        if (eepromOffset & 0x2)
              pDwordBuffer->pDword[j] = (A_UINT32) ( (eepromValue>>16) & 0xffff);
		    else
              pDwordBuffer->pDword[j] = (A_UINT32) (eepromValue & 0xffff);
		}
    }
#endif

#endif // !SPIRIT_AP || !FREEDOM_AP
#else // THIN_CLIENT_BUILD
	pDwordBuffer = m_eepromReadBlock(pCmd->devNum,
					 pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.startOffset,
					 pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length);
#endif // THIN_CLIENT_BUILD

	pDword = (A_UINT32 *)replyBuf;	

	if (pDwordBuffer != NULL)
	{
		for (i=0;i<pCmd->CMD_U.EEPROM_READ_BLOCK_CMD.length;i++)
		{
			#ifdef ENDIAN_SWAP
	  	  		pDword[i] = btol_l(pDwordBuffer->pDword[i]);
			#else
				pDword[i] = pDwordBuffer->pDword[i];
			#endif
		}
		A_FREE(pDwordBuffer->pDword);
		A_FREE(pDwordBuffer);
	}
	return 0;
}
#endif

#ifdef AR6000
/***************************************************************************/

A_UINT32 processEepromWriteBlockCmd
(
	struct dkThreadInfo *dkThread
)
{
	PIPE_CMD      *pCmd;
	CMD_REPLY     *ReplyCmd_p;
	A_UCHAR     *replyBuf;
	PDWORDBUFFER pDwordBuffer;
	A_UINT32 i;
    A_INT32	 status=0;

	pCmd = dkThread->PipeBuffer_p;
	ReplyCmd_p = dkThread->ReplyCmd_p;
	replyBuf = (A_UCHAR *)(ReplyCmd_p->cmdBytes);

	#ifdef ENDIAN_SWAP
     		pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.length = ltob_l(pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.length); 
	#endif


    	if( pCmd->cmdLen != (sizeof(pCmd->cmdID) + 
		       sizeof(pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD)-
		       ((MAX_BLOCK_DWORDS - pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.length) * 4)) + sizeof(pCmd->devNum))
        {
        	uiPrintf("Error: command Len is not equal to size of expected bytes for EEPROM_WRITE_BLOCK_CMD\n");
			uiPrintf(": got %d, expected %d\n", pCmd->cmdLen, (sizeof(pCmd->cmdID) + sizeof(pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD)
				- ((MAX_BLOCK_DWORDS - pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.length) * 4)));
        	return(COMMS_ERR_BAD_LENGTH);
        }


	#ifdef ENDIAN_SWAP
     		pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.startOffset = ltob_l(pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.startOffset);
	

	#endif

	pDwordBuffer = &DwordBuffer;
	pDwordBuffer->Length = (A_UINT16)pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.length * 4;

	for (i=0;i<pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.length;i++)
	{
		#ifdef ENDIAN_SWAP
			pDwordBuffer->pDword[i] = ltob_l(pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.eepromValue[i]); 
		#else
			pDwordBuffer->pDword[i] = pCmd->CMD_U.EEPROM_WRITE_BLOCK_CMD.eepromValue[i];
		#endif
	}

    {
	    A_UINT8 *pVal;
	    A_UINT16 pTempBuffer[1024];
	    A_UINT16 *pTempPtr;
        A_UINT32 length;
        A_UINT32 startOffset, offset;

⌨️ 快捷键说明

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