rf.c

来自「VIA VT6655 x86下的Linux Source Code」· C语言 代码 · 共 1,253 行 · 第 1/4 页

C
1,253
字号
            if (byInitCount > (MISCFIFO_SYNDATASIZE - bySleepCount)) {
                return FALSE;
            }

            if (uChannel <= CB_MAX_CHANNEL_24G)
            {
                for (ii = 0; ii < CB_AL7230_INIT_SEQ; ii++ ) {
                    MACvSetMISCFifo(dwIoBase, (WORD)(MISCFIFO_SYNDATA_IDX + ii), dwAL7230InitTable[ii]);
                }
            }
            else
            {
                for (ii = 0; ii < CB_AL7230_INIT_SEQ; ii++ ) {
                    MACvSetMISCFifo(dwIoBase, (WORD)(MISCFIFO_SYNDATA_IDX + ii), dwAL7230InitTableAMode[ii]);
                }
            }

            MACvSetMISCFifo(dwIoBase, (WORD)(MISCFIFO_SYNDATA_IDX + ii), dwAL7230ChannelTable0[uChannel-1]);
            ii ++;
            MACvSetMISCFifo(dwIoBase, (WORD)(MISCFIFO_SYNDATA_IDX + ii), dwAL7230ChannelTable1[uChannel-1]);
            ii ++;
            MACvSetMISCFifo(dwIoBase, (WORD)(MISCFIFO_SYNDATA_IDX + ii), dwAL7230ChannelTable2[uChannel-1]);
            break;
        //}} RobertYu

        case RF_NOTHING :
            return TRUE;
            break;

        default:
            return FALSE;
            break;
    }

    MACvSetMISCFifo(dwIoBase, MISCFIFO_SYNINFO_IDX, (DWORD)MAKEWORD(bySleepCount, byInitCount));

    return TRUE;
}

/*
 * Description: Set Tx power
 *
 * Parameters:
 *  In:
 *      dwIoBase       - I/O base address
 *      dwRFPowerTable - RF Tx Power Setting
 *  Out:
 *      none
 *
 * Return Value: TRUE if succeeded; FALSE if failed.
 *
 */
BOOL RFbSetPower (
    IN  PSDevice  pDevice,
    IN  UINT      uRATE,
    IN  UINT      uCH
    )
{
BOOL    bResult = TRUE;
BYTE    byPwr = 0;
BYTE    byDec = 0;
BYTE    byPwrdBm = 0;

    if (pDevice->dwDiagRefCount != 0) {
        return TRUE;
    }
    if ((uCH < 1) || (uCH > CB_MAX_CHANNEL)) {
        return FALSE;
    }

    switch (uRATE) {
    case RATE_1M:
    case RATE_2M:
    case RATE_5M:
    case RATE_11M:
        byPwr = pDevice->abyCCKPwrTbl[uCH];
        byPwrdBm = pDevice->abyCCKDefaultPwr[uCH];
        break;
    case RATE_6M:
    case RATE_9M:
    case RATE_18M:
        byPwr = pDevice->abyOFDMPwrTbl[uCH];
        if (pDevice->byRFType == RF_UW2452) {
            byDec = byPwr + 14;
        } else {
            byDec = byPwr + 10;
        }
        if (byDec >= pDevice->byMaxPwrLevel) {
            byDec = pDevice->byMaxPwrLevel-1;
        }
        if (pDevice->byRFType == RF_UW2452) {
            byPwrdBm = byDec - byPwr;
            byPwrdBm /= 3;
        } else {
            byPwrdBm = byDec - byPwr;
            byPwrdBm >>= 1;
        }
        byPwrdBm += pDevice->abyOFDMDefaultPwr[uCH];
        byPwr = byDec;
        break;
    case RATE_24M:
    case RATE_36M:
    case RATE_48M:
    case RATE_54M:
        byPwr = pDevice->abyOFDMPwrTbl[uCH];
        byPwrdBm = pDevice->abyOFDMDefaultPwr[uCH];
        break;
    }

    // 802.11h TPC
    if (pDevice->bLinkPass == TRUE) {
        // do not over local constraint
        if (byPwrdBm > pDevice->abyLocalPwr[uCH]) {
            pDevice->byCurPwrdBm = pDevice->abyLocalPwr[uCH];
            byDec = byPwrdBm - pDevice->abyLocalPwr[uCH];
            if (pDevice->byRFType == RF_UW2452) {
                byDec *= 3;
            } else {
                byDec <<= 1;
            }
            if (byPwr > byDec) {
                byPwr -= byDec;
            } else {
                byPwr = 0;
            }
        } else {
            pDevice->byCurPwrdBm = byPwrdBm;
        }
    } else {
        // do not over regulatory constraint
        if (byPwrdBm > pDevice->abyRegPwr[uCH]) {
            pDevice->byCurPwrdBm = pDevice->abyRegPwr[uCH];
            byDec = byPwrdBm - pDevice->abyRegPwr[uCH];
            if (pDevice->byRFType == RF_UW2452) {
                byDec *= 3;
            } else {
                byDec <<= 1;
            }
            if (byPwr > byDec) {
                byPwr -= byDec;
            } else {
                byPwr = 0;
            }
        } else {
            pDevice->byCurPwrdBm = byPwrdBm;
        }
    }

//    if (pDevice->byLocalID <= REV_ID_VT3253_B1) {
    if (pDevice->byCurPwr == byPwr) {
        return TRUE;
    }
    bResult = RFbRawSetPower(pDevice, byPwr, uRATE);
//    }
    if (bResult == TRUE) {
       pDevice->byCurPwr = byPwr;
    }
    return bResult;
}

/*
 * Description: Set Tx power
 *
 * Parameters:
 *  In:
 *      dwIoBase       - I/O base address
 *      dwRFPowerTable - RF Tx Power Setting
 *  Out:
 *      none
 *
 * Return Value: TRUE if succeeded; FALSE if failed.
 *
 */
 
BOOL RFbRawSetPower (
    IN  PSDevice  pDevice,
    IN  BYTE      byPwr,
    IN  UINT      uRATE
    )
{
BOOL    bResult = TRUE;
DWORD   dwMax7230Pwr = 0;

    if (byPwr >=  pDevice->byMaxPwrLevel) {
        return (FALSE);
    }
    switch (pDevice->byRFType) {

        case RF_AIROHA :
            bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, dwAL2230PowerTable[byPwr]);
            if (uRATE <= RATE_11M) {
                bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, 0x0001B400+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW);
            } else {
                bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, 0x0005A400+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW);
            }
            break;


        case RF_AL2230S :
            bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, dwAL2230PowerTable[byPwr]);        
            if (uRATE <= RATE_11M) {
                bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, 0x040C1400+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW);
                bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, 0x00299B00+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW);                
            }else {
                bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, 0x0005A400+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW);
                bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, 0x00099B00+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW);
            }    
                
            break;
            
        case RF_AIROHA7230:
            //  0x080F1B00 for 3 wire control TxGain(D10) and 0x31 as TX Gain value
            dwMax7230Pwr = 0x080C0B00 | ( (byPwr) << 12 ) |
                           (BY_AL7230_REG_LEN << 3 )  | IFREGCTL_REGW;

            bResult &= IFRFbWriteEmbeded(pDevice->PortOffset, dwMax7230Pwr);
            break;


        default :
            break;
    }
    return bResult;
}

/*+
 *
 * Routine Description:
 *     Translate RSSI to dBm
 *
 * Parameters:
 *  In:
 *      pDevice         - The adapter to be translated
 *      byCurrRSSI      - RSSI to be translated
 *  Out:
 *      pdwdbm          - Translated dbm number
 *
 * Return Value: none
 *
-*/
VOID
RFvRSSITodBm (
    IN  PSDevice pDevice,
    IN  BYTE     byCurrRSSI,
    OUT PLONG    pldBm
    )
{
    BYTE byIdx = (((byCurrRSSI & 0xC0) >> 6) & 0x03);
    LONG b = (byCurrRSSI & 0x3F);
    LONG a = 0;
    BYTE abyAIROHARF[4] = {0, 18, 0, 40};

    switch (pDevice->byRFType) {
        case RF_AIROHA:
        case RF_AL2230S:        
        case RF_AIROHA7230: //RobertYu: 20040104
            a = abyAIROHARF[byIdx];
            break;
        default:
            break;
    }

    *pldBm = -1 * (a + b * 2);
}

////////////////////////////////////////////////////////////////////////////////
//{{ RobertYu: 20050104


// Post processing for the 11b/g and 11a.
// for save time on changing Reg2,3,5,7,10,12,15
BOOL RFbAL7230SelectChannelPostProcess (DWORD_PTR dwIoBase, BYTE byOldChannel, BYTE byNewChannel)
{
    BOOL    bResult;

    bResult = TRUE;

    // if change between 11 b/g and 11a need to update the following register
    // Channel Index 1~14

    if( (byOldChannel <= CB_MAX_CHANNEL_24G) && (byNewChannel > CB_MAX_CHANNEL_24G) )
    {
        // Change from 2.4G to 5G
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[2]); //Reg2
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[3]); //Reg3
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[5]); //Reg5
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[7]); //Reg7
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[10]);//Reg10
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[12]);//Reg12
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTableAMode[15]);//Reg15
    }
    else if( (byOldChannel > CB_MAX_CHANNEL_24G) && (byNewChannel <= CB_MAX_CHANNEL_24G) )
    {
        // change from 5G to 2.4G
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[2]); //Reg2
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[3]); //Reg3
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[5]); //Reg5
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[7]); //Reg7
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[10]);//Reg10
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[12]);//Reg12
        bResult &= IFRFbWriteEmbeded(dwIoBase, dwAL7230InitTable[15]);//Reg15
    }

    return bResult;
}


//}} RobertYu
////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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