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