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

📄 mconfig.c

📁 Atheros AP Test with Agilent N4010A source code
💻 C
📖 第 1 页 / 共 5 页
字号:
            else {
                pLibDev->macRev = REGR(devNum, F2_SREV) & F2_SREV_ID_M;
            }
#else
    #ifdef AR5513
        pLibDev->macRev = (sysRegRead(AR5513_SREV) >> REV_MIN_S) & 0xff;
    #else
                pLibDev->macRev = (sysRegRead(AR531X_REV) >> REV_WMAC_MIN_S) & 0xff;
   #endif
#endif
#else
#ifdef FALCON_ART_CLIENT
//                pLibDev->macRev = (sysRegRead(AR5513_SREV) >> REV_MIN_S) & 0xff;
         pLibDev->macRev = sysRegRead(0x10100000 + F2_SREV) & F2_SREV_ID_M;
#else
                pLibDev->macRev = REGR(devNum, F2_SREV) & F2_SREV_ID_M;
#endif
#endif
                if (isGriffin_1_0(pLibDev->macRev) || isGriffin_1_1(pLibDev->macRev)) {
                    // to override corrupted 0x9808 in griffin 1.0 and 1.1. 2.0 should be fixed.
//                  printf("SNOOP: setting reg 0x9808 to 0 for griffin 1.0 and 1.1 \n");
                    REGW(devNum, 0x9808, 0);
                }
            }
            break;
    }

    // Needed for venice FPGA 
    if ((pLibDev->hwDevID == 0xf013) || (pLibDev->hwDevID == 0xfb13) 
        || (pLibDev->hwDevID == 0xf016) || (pLibDev->hwDevID == 0xff16)) {
        REGW(devNum, 0x4014, 0x3);
        REGW(devNum, 0x4018, 0x0);
        REGW(devNum, 0xd87c, 0x16);
        mSleep(100);
    }

    // set it to ofdm mode for reading the analog rev id for 11b fpga
    if (pLibDev->hwDevID == 0xf11b) {   
        REGW(devNum, 0xa200, 0);
        REGW(devNum, 0x987c, 0x19) ;
        mSleep(20);
    }

    //read the baseband revision 
    pLibDev->bbRevID = REGR(devNum, PHY_CHIP_ID);
    //printf("bb rev id = %x\n", pLibDev->bbRevID);

    //Needed so that analog revID write will work.
    if((pLibDev->hwDevID & 0xff) >= 0x0012) {
        REGW(devNum, 0x9800, 0x07);
    }
    else {
        REGW(devNum, 0x9800, 0x47);
    }

    //read the analog revIDs
    REGW(devNum, (PHY_BASE+(0x34<<2)), 0x00001c16);
    for (i=0; i<8; i++) {   
       REGW(devNum, (PHY_BASE+(0x20<<2)), 0x00010000);
    }   
    pLibDev->aRevID = (REGR(devNum, PHY_BASE + (256<<2)) >> 24) & 0xff;   
    pLibDev->aRevID = reverseBits(pLibDev->aRevID, 8);

    printf("**** Analog Revision = %x\n", pLibDev->aRevID);
    pLibDev->aRevID = 0x09;

    if ((0x0012 == pLibDev->hwDevID) || (0xff12 == pLibDev->hwDevID)
        ||((pLibDev->hwDevID == 0x0013) && ((pLibDev->aRevID & 0xF) != 0x5)) || // exclude griffin
        (pLibDev->hwDevID == 0xff13) && (pLibDev->aRevID & 0xf < 3)) {
        // Only the 2 mac of freedom has A/B 
        #if defined(FREEDOM_AP)&&!defined(COBRA_AP)
            if (pLibDev->devMap.DEV_REG_ADDRESS == AR531X_WLAN1) 
        #endif
        {   
            //read the beanie rev ID
            REGW(devNum, 0x9800, 0x00004007);
            mSleep(2);
            REGW(devNum, (PHY_BASE+(0x34<<2)), 0x00001c16);
            for (i=0; i<8; i++) {   
                REGW(devNum, (PHY_BASE+(0x20<<2)), 0x00010000);
            }
            pLibDev->aBeanieRevID = (REGR(devNum, PHY_BASE + (256<<2)) >> 24) & 0xff;   
            pLibDev->aBeanieRevID = reverseBits(pLibDev->aBeanieRevID, 8);
            REGW(devNum, 0x9800, 0x07);
        }
    }

    for (i = 0; i < numDeviceIDs; i++)  {
        if (((pLibDev->hwDevID == ar5kInitData[i].deviceID) || (ar5kInitData[i].deviceID == DONT_MATCH) ) && 
            analogRevMatch(i, pLibDev->aRevID) && macRevMatch(i, pLibDev->macRev) )
        {
            break;
        }
    }


    if(i == numDeviceIDs) {
        mError(devNum, EIO, "Device Number %d:unable to find device init details for deviceID 0x%04lx, analog rev 0x%02lx, mac rev 0x%04lx, bb rev 0x%04lx\n", devNum, 
        pLibDev->hwDevID, pLibDev->aRevID, pLibDev->macRev, pLibDev->bbRevID);
        printf("Device Number %d:unable to find device init details for deviceID 0x%04lx, analog rev 0x%02lx, mac rev 0x%04lx, bb rev 0x%04lx\n", devNum, 
        pLibDev->hwDevID, pLibDev->aRevID, pLibDev->macRev, pLibDev->bbRevID);
        return -1;
    }

    //read the subsystemID, this has been moved from above, so can read 
    //this from eeprom 
    //force the eeprom size incase blank card
    if(ar5kInitData[i].swDeviceID >= 0x0012) {
        REGW(devNum, 0x6010, REGR(devNum, 0x6010) | 0x3);
    }
    if (pLibDev->devMap.remoteLib) {
        pLibDev->subSystemID =  pLibDev->devMap.r_eepromRead(devNum, 0x7);
    }
    else {
        pLibDev->subSystemID = ar5kInitData[i].pMacAPI->eepromRead(devNum, 0x7);
    }

#ifndef NO_LIB_PRINT        
    if (!pLibDev->regFileRead) {
        printf(DEVLIB_VER1);
        printf("\n\n                     ===============================================\n");
        printf("                     |               ");                                   
        switch(pLibDev->subSystemID) {
            case 0x1021  :  printf("AR5001a_cb                    "); break;
            case 0x1022  :  printf("AR5001x_cb                    "); break;
            case 0x2022  :  printf("AR5001x_mb                    "); break;
            case 0x2023  :  printf("AR5001a_mb                    "); break;
            case 0xa021  :  printf("AR5001ap_ap                   "); break;

            case 0x1025  :  printf("AR5001g_cb21g                 "); break;
            case 0x1026  :  printf("AR5001x2_cb22ag               "); break;
            case 0x2025  :  printf("AR5001g_mb21g                 "); break;
            case 0x2026  :  printf("AR5001x2_mb22ag               "); break;

            case  0x2030 :  printf("AR5002g_mb31g (de-stuffed)    "); break;        
            case  0x2031 :  printf("AR5002x_mb32ag                "); break;               
            case  0x2027 :  printf("AR5001g_mb22g (de-stuffed)    "); break;        
            case  0x2029 :  printf("AR5001x_mb22ag (single-sided) "); break;        
            case  0x2024 :  printf("AR5001x_mb23j                 "); break;                 
            case  0x1030 :  printf("AR5002g_cb31g (de-stuffed)    "); break;        
            case  0x1031 :  printf("AR5002x_cb32ag                "); break;               
            case  0x1027 :  printf("AR5001g_cb22g (de-stuffed)    "); break;        
            case  0x1029 :  printf("AR5001x_cb22ag (single-sided) "); break;        
            case  0xa032 :  printf("AR5002a_ap30                  "); break;                 
            case  0xa034 :  printf("AR5002a_ap30  (040)           "); break;                 
            case  0xa041 :  printf("AR5004ap_ap41g (g)            "); break;                 
            case  0xa043 :  printf("AR5004ap_ap43g (g)            "); break;                 
            case  0xa048 :  printf("AR5004ap_ap48ag (a/g)         "); break;                 
            case  0x1041 :  printf("AR5004g_cb41g (g)             "); break;                 
            case  0x1042 :  printf("AR5004x_cb42ag (a/g)          "); break;                 
            case  0x1043 :  printf("AR5004g_cb43g (g)             "); break;                 
            case  0x2041 :  printf("AR5004g_mb41g (g)             "); break;                 
            case  0x2042 :  printf("AR5004x_mb42ag (a/g)          "); break;                 
            case  0x2043 :  printf("AR5004g_mb43g (g)             "); break;                 
            case  0x2044 :  printf("AR5004x_mb44ag (a/g)          "); break;                 
            case  0x1051 :  printf("AR5005gs_cb51g (g super)      "); break;                 
            case  0x1052 :  printf("AR5005g_cb51g (g)             "); break;                 
            case  0x2051 :  printf("AR5005gs_mb51g (g super)      "); break;                 
            case  0x2052 :  printf("AR5005g_mb51g (g)             "); break;                 
            case  0x1062 :  printf("AR5006xs_cb62ag (a/g super)   "); break;                 
            case  0x1063 :  printf("AR5006x_cb62ag (a/g)          "); break;                 
            case  0x2062 :  printf("AR5006xs_mb62ag (a/g super)   "); break;                 
            case  0x2063 :  printf("AR5006x_mb62g (a/g)           "); break;                 
            case  UB51_SUBSYSTEM_ID:  printf("AR5005ug_UB51 (g)            "); break;                 
            case  UB52_SUBSYSTEM_ID:  printf("AR5005ux_UB52 (a/g)            "); break;                 
            case  AP51_FULL_SUBSYSTEM_ID:  printf("AR5006apgs_AP51 (g)            "); break;                 
            case  AP51_LITE_SUBSYSTEM_ID:  printf("AR5006apg_AP51 (g)            "); break;         

            default: printf("UNKNOWN TYPE"); break;
        }
        printf("|\n");                                   
        printf("                     ===============================================\n\n");
        printf("Devices detected:\n");
        printf("   PCI deviceID     : 0x%04lx\t", pLibDev->hwDevID);
        printf("Sub systemID     : 0x%04lx\n", pLibDev->subSystemID);
        printf("   MAC revisionID   : 0x%02lx\t", pLibDev->macRev & 0xff);
        printf("BB  revisionID   : 0x%02lx\n", pLibDev->bbRevID & 0xff);
        printf("   RF  productID    : 0x%01lx\t", pLibDev->aRevID & 0xf);
        printf("RF  revisionID   : 0x%01lx\n", (pLibDev->aRevID >> 4) & 0xf);
        if((0x0012 == ar5kInitData[i].swDeviceID) || (ar5kInitData[i].swDeviceID == 0x0013) ) {
            printf("   Beanie productID : 0x%01lx\t", pLibDev->aBeanieRevID & 0xf);
            printf("Beanie revisionID: 0x%01lx\n\n", (pLibDev->aBeanieRevID >> 4) & 0xf);
        } else {
            printf("\n");
        }
    }
#endif //NO_LIB_PRINT

    return i;
}



A_BOOL loadCfgData(A_UINT32 devNum, A_UINT32 freq) {

LIB_DEV_INFO *pLibDev = gLibInfo.pLibDevArray[devNum];
A_UINT32 devTableIndex;
A_BOOL   earHere = FALSE;
A_UINT32 jj; 

    if (!pLibDev->regFileRead) {
        devTableIndex = findDevTableEntry(devNum);

        if (devTableIndex == -1) {
            mError(devNum, EIO, "Invalid Device table number %d:\n", devTableIndex);
            return 0;
        }

        pLibDev->ar5kInitIndex = devTableIndex;
        //try to read the eeprom to see if there is an ear
        if (pLibDev->eePromLoad) {
            if(setupEEPromMap(devNum)) {
    //          printf("pLibDev->eePromLoad setupEEPromMap\n");
                if((((pLibDev->eepData.version >> 12) & 0xF) >= 4) &&
                   (((pLibDev->eepData.version >> 12) & 0xF) <= 5))
                {
                    earHere = ar5212IsEarEngaged(devNum, pLibDev->pEarHead, freq);
                }
                //If we are loading the EAR, then move onto the next structure
                //so we point to the "frozen" config file contents, then load ear on that
                if(earHere && (pLibDev->libCfgParams.loadEar)) {
                    //  printf("earHere\n");
                    if(((ar5kInitData[devTableIndex].swDeviceID & 0xff) == 0x0016) || 
                       ((ar5kInitData[devTableIndex].swDeviceID & 0xff) == 0x0017) ||
                       ((ar5kInitData[devTableIndex].swDeviceID & 0xff) == 0x0018))
                    {
                        //      printf("ar5kInitData[devTableIndex].swDeviceID & 0xff) == 0x0016) || ((ar5kInitData[devTableIndex].swDeviceID & 0xff)\n");
                        devTableIndex++;
                    }
                }
            }
        }

        //set devTableIndex again incase it moved
        pLibDev->ar5kInitIndex = devTableIndex;
        pLibDev->sizeRegArray = ar5kInitData[devTableIndex].sizeArray;

        if(pLibDev->regArray) {
            free(pLibDev->regArray);
            pLibDev->regArray = NULL;
        }
        pLibDev->regArray = (ATHEROS_REG_FILE *)malloc(sizeof(ATHEROS_REG_FILE) *  pLibDev->sizeRegArray);
        if (!pLibDev->regArray) {
            mError(devNum, ENOMEM, "Device Number %d:resetDevice Failed to allocate memory for regArray \n", devNum);
            return 0;
        }
        memcpy(pLibDev->regArray, ar5kInitData[devTableIndex].pInitRegs, (sizeof(ATHEROS_REG_FILE) *  pLibDev->sizeRegArray));

        pLibDev->sizeModeArray = ar5kInitData[devTableIndex].sizeModeArray;

        if (pLibDev->pModeArray) {
            free(pLibDev->pModeArray);
            pLibDev->pModeArray = NULL;
        }
        pLibDev->pModeArray = (MODE_INFO *)malloc(sizeof(MODE_INFO)*pLibDev->sizeModeArray);
        if (!pLibDev->pModeArray) {
            mError(devNum, ENOMEM, "Device Number %d:resetDevice Failed to allocate memory for modeArray \n", devNum);
            return 0;
        }
        memcpy(pLibDev->pModeArray, ar5kInitData[devTableIndex].pModeValues,sizeof(MODE_INFO)*pLibDev->sizeModeArray);


        pLibDev->swDevID = ar5kInitData[devTableIndex].swDeviceID;
//              printf("pLibDev->regFilename = %s\n",pLibDev->regFilename);
        if (!parseAtherosRegFile(pLibDev, pLibDev->regFilename)) 
                {
                    printf(" After parseAtherosRegFile\n");
                    if (pLibDev->mdkErrno) 
                    {
                        printf("SNOOP: ERROR : %s\n", pLibDev->mdkErrStr);
                        pLibDev->mdkErrno = 0;
                    }
          mError(devNum, EIO, "Device Number %d:resetDevice: Unable to open atheros register file : %s\n", devNum, pLibDev->regFilename);
          return 0;
        }

        if (!createPciRegWrites(devNum)) 
                {
        
                    //  printf("Not of createPciRegWrites \n");
                        mError(devNum, EIO, "Device Number %d:resetDevice: Unable to convert atheros register file to pci write values\n", devNum);
            return 0;
        }
        pLibDev->regFileRead = 1;

        //initialize the API
        ar5kInitData[pLibDev->ar5kInitIndex].pMacAPI->macAPIInit(devNum);

    if (pLibDev->devMap.remoteLib) {
    }
    else {
          //zero out the key cache
          for(jj = 0x8800; jj < 0x97ff; jj+=4) {
            REGW(devNum, jj, 0);
          }
    }
    }
//printf("Load cfgdata end\n");
    return 1;
}

//++JC++
void sleep_cal( clock_t wait ) {
   clock_t goal;
   goal = wait + clock();
   while( goal > clock() );
}

/**************************************************************************
* griffin_cl_cal - Do carrier leak cal for griffin
***************************************************************************/
void griffin_cl_cal(A_UINT32 devNum)
{

   A_INT32 add_I_first[9], add_Q_first[9], add_I_second[9], add_Q_second[9];
   A_INT32 add_I_avg[9], add_Q_avg[9];
   A_INT32 add_I_diff, add_Q_diff, kk;
   A_UINT32 offset, data, cl_cal_done, i;
   A_UINT32 cl_cal_reg[9] = {0xa35c,0xa360,0xa364,0xa368,0xa36c,0xa370,0xa374,0xa378,0xa37c};


   data = REGR(devNum,0xa358);
   data = data | 0x3;
   REGW(devNum,0xa358, data);

   // Get first set of I and Q data
   data = REGR(devNum,0x9860);
   data = data | 0x1;
   REGW(devNum,0x9860, data);

   sleep_cal (10);

   // Check for cal done
   for (i = 0; i < 1000; i++) {
      if ((REGR(devNum, PHY_AGC_CONTROL) & (enableCal)) == 0 ) {
         break;
      }
      mSleep(1);
   }
   if(i >= 1000) {
      printf("griffin_cl_cal : Device Number %d didn't complete cal but keep going anyway\n", devNum);
   }

    for (kk=0; kk<9; kk++) {
    offset = cl_cal_reg[kk];
        data = REGR(devNum, offset);

        add_I_first[kk] = (data >> 16) & 0x7ff;
        add_Q_first[kk] = (data >>  5) & 0x7ff;

        if (((add_I_first[kk]>>10) & 0x1) == 1) {
            add_I_first[kk] = add_I_first[kk] | 0xfffff800;
        }
        if (((add_Q_first[kk]>>10) & 0x1) == 1) {
            add_Q_first[kk] = add_Q_first[kk] | 0xfffff800;
        }

        //printf ("Debug: 0x%04x: I_first:%d Q_first:%d\n", offset, add_I_first[kk], add_Q_first[kk]);
    }

⌨️ 快捷键说明

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