📄 dk_client.c
字号:
{
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 + -