📄 baseband.c
字号:
ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x4D, &pDevice->byBBCR4d);//CR77 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x4D, 0x90); //CR 88 = 0x02(CCK), 0x03(OFDM) ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x88, &pDevice->byBBCR88);//CR136 if (pDevice->wCurrentRate <= RATE_11M) { //CCK // Enable internal digital loopback: CR33 |= 0000 0001 ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x21, &byData);//CR33 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x21, (BYTE)(byData | 0x01));//CR33 // CR154 = 0x00 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x9A, 0); //CR154 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x02);//CR239 } else { //OFDM // Enable internal digital loopback:CR154 |= 0000 0001 ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x9A, &byData);//CR154 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x9A, (BYTE)(byData | 0x01));//CR154 // CR33 = 0x00 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x21, 0); //CR33 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x03);//CR239 } //CR14 = 0x00 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0E, 0);//CR14 // Disable TX_IQUN ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x09, &pDevice->byBBCR09); ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x09, (BYTE)(pDevice->byBBCR09 & 0xDE));}/* * Description: Turn off BaseBand Loopback mode * * Parameters: * In: * pDevice - Device Structure * * Out: * none * * Return Value: none * */void BBvLoopbackOff (PSDevice pDevice){ BYTE byData; ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xC9, pDevice->byBBCRc9);//CR201 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, pDevice->byBBCR88);//CR136 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x09, pDevice->byBBCR09);//CR136 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x4D, pDevice->byBBCR4d);//CR77 if (pDevice->wCurrentRate <= RATE_11M) { // CCK // Set the CR33 Bit2 to disable internal Loopback. ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x21, &byData);//CR33 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x21, (BYTE)(byData & 0xFE));//CR33 } else { // OFDM ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x9A, &byData);//CR154 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x9A, (BYTE)(byData & 0xFE));//CR154 } ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0x0E, &byData);//CR14 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0E, (BYTE)(byData | 0x80));//CR14}/* * Description: Set ShortSlotTime mode * * Parameters: * In: * pDevice - Device Structure * Out: * none * * Return Value: none * */VOIDBBvSetShortSlotTime (PSDevice pDevice){ BYTE byBBVGA=0; if (pDevice->bShortSlotTime) { pDevice->byBBRxConf &= 0xDF;//1101 1111 } else { pDevice->byBBRxConf |= 0x20;//0010 0000 } ControlvReadByte (pDevice, MESSAGE_REQUEST_BBREG, 0xE7, &byBBVGA); if (byBBVGA == pDevice->abyBBVGA[0]) { pDevice->byBBRxConf |= 0x20;//0010 0000 } ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0A, pDevice->byBBRxConf); }VOID BBvSetVGAGainOffset(PSDevice pDevice, BYTE byData){ ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, byData); // patch for 3253B0 Baseband with Cardbus module if (byData == pDevice->abyBBVGA[0]) { pDevice->byBBRxConf |= 0x20;//0010 0000 } else if (pDevice->bShortSlotTime) { pDevice->byBBRxConf &= 0xDF;//1101 1111 } else { pDevice->byBBRxConf |= 0x20;//0010 0000 } ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0A, pDevice->byBBRxConf);//CR10}/* * Description: Baseband SoftwareReset * * Parameters: * In: * dwIoBase - I/O base address * Out: * none * * Return Value: none * */VOIDBBvSoftwareReset (PSDevice pDevice){ ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x50, 0x40); ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x50, 0); ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x9C, 0x01); ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x9C, 0);}/* * Description: BBvSetDeepSleep * * Parameters: * In: * pDevice - Device Structure * Out: * none * * Return Value: none * */VOIDBBvSetDeepSleep (PSDevice pDevice){ ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);//CR12 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0D, 0xB9);//CR13}VOIDBBvExitDeepSleep (PSDevice pDevice){ ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0C, 0x00);//CR12 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x0D, 0x01);//CR13}staticULONGs_ulGetLowSQ3(PSDevice pDevice){int ii;ULONG ulSQ3 = 0;ULONG ulMaxPacket; ulMaxPacket = pDevice->aulPktNum[RATE_54M]; if ( pDevice->aulPktNum[RATE_54M] != 0 ) { ulSQ3 = pDevice->aulSQ3Val[RATE_54M] / pDevice->aulPktNum[RATE_54M]; } for ( ii=RATE_48M;ii>=RATE_6M;ii-- ) { if ( pDevice->aulPktNum[ii] > ulMaxPacket ) { ulMaxPacket = pDevice->aulPktNum[ii]; ulSQ3 = pDevice->aulSQ3Val[ii] / pDevice->aulPktNum[ii]; } } return ulSQ3;}staticULONGs_ulGetRatio (PSDevice pDevice){int ii,jj;ULONG ulRatio = 0;ULONG ulMaxPacket;ULONG ulPacketNum; //This is a thousand-ratio ulMaxPacket = pDevice->aulPktNum[RATE_54M]; if ( pDevice->aulPktNum[RATE_54M] != 0 ) { ulPacketNum = pDevice->aulPktNum[RATE_54M]; ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt); ulRatio += TOP_RATE_54M; } for ( ii=RATE_48M;ii>=RATE_1M;ii-- ) { if ( pDevice->aulPktNum[ii] > ulMaxPacket ) { ulPacketNum = 0; for ( jj=RATE_54M;jj>=ii;jj--) ulPacketNum += pDevice->aulPktNum[jj]; ulRatio = (ulPacketNum * 1000 / pDevice->uDiversityCnt); ulRatio += TOP_RATE_48M; ulMaxPacket = pDevice->aulPktNum[ii]; } } return ulRatio;}staticvoids_vClearSQ3Value (PSDevice pDevice){ int ii; pDevice->uDiversityCnt = 0; for ( ii=RATE_1M;ii<MAX_RATE;ii++) { pDevice->aulPktNum[ii] = 0; pDevice->aulSQ3Val[ii] = 0; }}/* * Description: Antenna Diversity * * Parameters: * In: * pDevice - Device Structure * byRSR - RSR from received packet * bySQ3 - SQ3 value from received packet * Out: * none * * Return Value: none * */VOIDBBvAntennaDiversity (PSDevice pDevice, BYTE byRxRate, BYTE bySQ3){ pDevice->uDiversityCnt++; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pDevice->uDiversityCnt = %d\n", (int)pDevice->uDiversityCnt); if (byRxRate == 2) { pDevice->aulPktNum[RATE_1M]++; } else if (byRxRate==4) { pDevice->aulPktNum[RATE_2M]++; } else if (byRxRate==11) { pDevice->aulPktNum[RATE_5M]++; } else if (byRxRate==22) { pDevice->aulPktNum[RATE_11M]++; } else if(byRxRate==12){ pDevice->aulPktNum[RATE_6M]++; pDevice->aulSQ3Val[RATE_6M] += bySQ3; } else if(byRxRate==18){ pDevice->aulPktNum[RATE_9M]++; pDevice->aulSQ3Val[RATE_9M] += bySQ3; } else if(byRxRate==24){ pDevice->aulPktNum[RATE_12M]++; pDevice->aulSQ3Val[RATE_12M] += bySQ3; } else if(byRxRate==36){ pDevice->aulPktNum[RATE_18M]++; pDevice->aulSQ3Val[RATE_18M] += bySQ3; } else if(byRxRate==48){ pDevice->aulPktNum[RATE_24M]++; pDevice->aulSQ3Val[RATE_24M] += bySQ3; } else if(byRxRate==72){ pDevice->aulPktNum[RATE_36M]++; pDevice->aulSQ3Val[RATE_36M] += bySQ3; } else if(byRxRate==96){ pDevice->aulPktNum[RATE_48M]++; pDevice->aulSQ3Val[RATE_48M] += bySQ3; } else if(byRxRate==108){ pDevice->aulPktNum[RATE_54M]++; pDevice->aulSQ3Val[RATE_54M] += bySQ3; } if (pDevice->byAntennaState == 0) { if (pDevice->uDiversityCnt > pDevice->ulDiversityNValue) { DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ulDiversityNValue=[%d],54M-[%d]\n",(int)pDevice->ulDiversityNValue, (int)pDevice->aulPktNum[RATE_54M]); pDevice->ulSQ3_State0 = s_ulGetLowSQ3(pDevice); pDevice->ulRatio_State0 = s_ulGetRatio(pDevice); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"SQ3_State0, SQ3= [%08x] rate = [%08x]\n",(int)pDevice->ulSQ3_State0,(int)pDevice->ulRatio_State0); if ( ((pDevice->aulPktNum[RATE_54M] < pDevice->ulDiversityNValue/2) && (pDevice->ulSQ3_State0 > pDevice->ulSQ3TH) ) || (pDevice->ulSQ3_State0 == 0 ) ) { if ( pDevice->byTMax == 0 ) return; bScheduleCommand((HANDLE) pDevice, WLAN_CMD_CHANGE_ANTENNA, NULL); pDevice->byAntennaState = 1; del_timer(&pDevice->TimerSQ3Tmax3); del_timer(&pDevice->TimerSQ3Tmax2); pDevice->TimerSQ3Tmax1.expires = RUN_AT(pDevice->byTMax * HZ); add_timer(&pDevice->TimerSQ3Tmax1); } else { pDevice->TimerSQ3Tmax3.expires = RUN_AT(pDevice->byTMax3 * HZ); add_timer(&pDevice->TimerSQ3Tmax3); } s_vClearSQ3Value(pDevice); } } else { //byAntennaState == 1 if (pDevice->uDiversityCnt > pDevice->ulDiversityMValue) { del_timer(&pDevice->TimerSQ3Tmax1); pDevice->ulSQ3_State1 = s_ulGetLowSQ3(pDevice); pDevice->ulRatio_State1 = s_ulGetRatio(pDevice); DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"SQ3_State1, rate0 = %08x,rate1 = %08x\n",(int)pDevice->ulRatio_State0,(int)pDevice->ulRatio_State1); if ( ((pDevice->ulSQ3_State1 == 0) && (pDevice->ulSQ3_State0 != 0)) || ((pDevice->ulSQ3_State1 == 0) && (pDevice->ulSQ3_State0 == 0) && (pDevice->ulRatio_State1 < pDevice->ulRatio_State0)) || ((pDevice->ulSQ3_State1 != 0) && (pDevice->ulSQ3_State0 != 0) && (pDevice->ulSQ3_State0 < pDevice->ulSQ3_State1)) ) { bScheduleCommand((HANDLE) pDevice, WLAN_CMD_CHANGE_ANTENNA, NULL); pDevice->TimerSQ3Tmax3.expires = RUN_AT(pDevice->byTMax3 * HZ); pDevice->TimerSQ3Tmax2.expires = RUN_AT(pDevice->byTMax2 * HZ); add_timer(&pDevice->TimerSQ3Tmax3); add_timer(&pDevice->TimerSQ3Tmax2); } pDevice->byAntennaState = 0; s_vClearSQ3Value(pDevice); } } //byAntennaState}/*+ * * Description: * Timer for SQ3 antenna diversity * * Parameters: * In: * pvSysSpec1 * hDeviceContext - Pointer to the adapter * pvSysSpec2 * pvSysSpec3 * Out: * none * * Return Value: none *-*/VOIDTimerSQ3CallBack ( IN HANDLE hDeviceContext ){ PSDevice pDevice = (PSDevice)hDeviceContext; DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TimerSQ3CallBack..."); spin_lock_irq(&pDevice->lock); bScheduleCommand((HANDLE) pDevice, WLAN_CMD_CHANGE_ANTENNA, NULL); pDevice->byAntennaState = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -