Beispiel #1
0
/*! \brief Calibration function
*
* Performs the calibration according to calibration method chosen.
* Compares different calibration results in order to achieve optimal results.
*
*/
void CalibrateInternalRc(void)
{
  unsigned int count;

#ifdef CALIBRATION_METHOD_SIMPLE                    // Simple search method
  unsigned char cycles = 0x80;

  do{
    count = Counter();
    if (count > countVal)
      OSCCAL--;                                     // If count is more than count value corresponding to the given frequency:
    NOP();                                          // - decrease speed
    if (count < countVal)
      OSCCAL++;
    NOP();                                          // If count is less: - increase speed
    if (count == countVal)
      cycles=1;			
  } while(--cycles);                                // Calibrate using 128(0x80) calibration cycles

#else                                               // Binary search with or without neighbor search
  unsigned char countDiff;
  unsigned char neighborSearchStatus = FINISHED;

  while(calibration == RUNNING){
    count = Counter();                              // Counter returns the count value after external ticks on XTAL
    if (calStep != 0)
    {
      BinarySearch(count);                          // Do binary search until stepsize is zero
    }
    else
    {
      if(neighborSearchStatus == RUNNING)
      {
        countDiff = ABS((signed int)count-(signed int)countVal);
        if (countDiff < bestCountDiff)                          // Store OSCCAL if higher accuracy is achieved
        {
          bestCountDiff = countDiff;
          bestOSCCAL = OSCCAL;
        }
        NeighborSearch();                                       // Do neighbor search
      }
      else                                                      // Prepare and start neighbor search
      {
#ifdef CALIBRATION_METHOD_BINARY_WITHOUT_NEIGHBOR               // No neighbor search if deselected
        calibration = FINISHED;
        countDiff = ABS((signed int)count-(signed int)countVal);
        bestCountDiff = countDiff;
        bestOSCCAL = OSCCAL;
#else
        neighborSearchStatus = RUNNING;                         // Do neighbor search by default
        neighborsSearched = 0;
        countDiff = ABS((signed int)count-(signed int)countVal);
        bestCountDiff = countDiff;
        bestOSCCAL = OSCCAL;
#endif
      }
    }
  }
#endif
}
Beispiel #2
0
VOID DeleteNeighborMP(
	IN PRTMP_ADAPTER pAd,
	IN PUCHAR pPeerMacAddr)
{
	PMESH_NEIGHBOR_TAB pNeighborTab = pAd->MeshTab.pMeshNeighborTab;
	PMESH_NEIGHBOR_ENTRY pNeighborEntry = NULL;

	if(pNeighborTab == NULL)
	{
		DBGPRINT(RT_DEBUG_ERROR, ("pAd->MeshTab.pMeshNeighborTab equal NULL.\n"));
		return;
	}

	/* if empty, return */
	if (pNeighborTab->NeighborNr == 0) 
	{
		DBGPRINT(RT_DEBUG_ERROR, ("pMeshNeighborTab empty.\n"));
		return;
	}

	pNeighborEntry = NeighborSearch(pAd, pPeerMacAddr);
	if (pNeighborEntry != NULL)
	{
		PMESH_NEIGHBOR_ENTRY pPrevEntry = NULL;
		ULONG HashIdx = MESH_MAC_ADDR_HASH_INDEX(pNeighborEntry->PeerMac);
		PMESH_NEIGHBOR_ENTRY pProbeEntry = pNeighborTab->Hash[HashIdx];

		/* update Hash list */
		do
		{
			if (pProbeEntry == pNeighborEntry)
			{
				if (pPrevEntry == NULL)
				{
					pNeighborTab->Hash[HashIdx] = pNeighborEntry->pNext;
				}
				else
				{
					pPrevEntry->pNext = pNeighborEntry->pNext;
				}
				break;
			}

			pPrevEntry = pProbeEntry;
			pProbeEntry = pProbeEntry->pNext;
		} while (pProbeEntry);

		NdisZeroMemory(pNeighborEntry, sizeof(MESH_NEIGHBOR_ENTRY));
		pNeighborTab->NeighborNr--;
	}

	return;
}
Beispiel #3
0
PMESH_NEIGHBOR_ENTRY InsertNeighborMP(
	IN PRTMP_ADAPTER pAd,
	IN CHAR RealRssi,
	IN PUCHAR pPeerMacAddr,
	IN UCHAR Channel,
	IN UINT8 ChBW,
	IN UINT8 ExtChOffset,
	IN PUCHAR pHostName,
	IN PUCHAR pMeshId,
	IN UCHAR MeshIdLen,
	IN USHORT 	CapabilityInfo,
	IN PUCHAR	pVIE,
	IN USHORT	LenVIE,
	IN PMESH_CONFIGURAION_IE pMeshConfig)
{
	INT i;
	ULONG HashIdx;
	PMESH_NEIGHBOR_TAB pNeighborTab = pAd->MeshTab.pMeshNeighborTab;
	PMESH_NEIGHBOR_ENTRY pNeighborEntry = NULL, pNeighborCurrEntry;

	if(pNeighborTab == NULL)
	{
		DBGPRINT(RT_DEBUG_ERROR, ("pAd->MeshTab.pMeshNeighborTab equal NULL.\n"));
		return NULL;
	}

	pNeighborEntry = NeighborSearch(pAd, pPeerMacAddr);
	if (pNeighborEntry == NULL)
	{
		/* if FULL, return */
		if (pNeighborTab->NeighborNr >= MAX_NEIGHBOR_MP) 
		{
			DBGPRINT(RT_DEBUG_ERROR, ("pAd->MeshTab.pMeshNeighborTab FULL.\n"));
			return NULL;
		}

		for (i = 0; i < MAX_NEIGHBOR_MP; i++)
		{
			pNeighborEntry = &pAd->MeshTab.pMeshNeighborTab->NeighborMP[i];
			if (pNeighborEntry->Valid == FALSE)
				break;
		}

		if (i < MAX_NEIGHBOR_MP)
		{
			ULONG Idx;

			NeighborEntrySet(pNeighborEntry, RealRssi, pPeerMacAddr, (PSTRING)pHostName, (PCHAR)pMeshId, MeshIdLen,
								Channel, ChBW, ExtChOffset, CapabilityInfo, pVIE, LenVIE, pMeshConfig);
			Idx = GetMeshLinkId(pAd, (PCHAR)pPeerMacAddr);
			if (Idx != BSS_NOT_FOUND)
			{ 
				pNeighborEntry->State = CANDIDATE_MP;
				pNeighborEntry->MeshLinkIdx = Idx;
			}
			else
				pNeighborEntry->State = NEIGHBOR_MP;
				
			pNeighborTab->NeighborNr++;
		}
		else
		{
			pNeighborEntry = NULL;
			DBGPRINT(RT_DEBUG_ERROR, ("%s: Neighbor tab full.\n", __FUNCTION__));
		}

		/* add this Neighbor entry into HASH table */
		if (pNeighborEntry)
		{
			HashIdx = MESH_MAC_ADDR_HASH_INDEX(pPeerMacAddr);
			if (pNeighborTab->Hash[HashIdx] == NULL)
			{
				pNeighborTab->Hash[HashIdx] = pNeighborEntry;
			}
			else
			{
				pNeighborCurrEntry = pNeighborTab->Hash[HashIdx];
				while (pNeighborCurrEntry->pNext != NULL)
					pNeighborCurrEntry = pNeighborCurrEntry->pNext;
				pNeighborCurrEntry->pNext = pNeighborEntry;
			}
		}
	} 
	else
	{
		NeighborEntrySet(pNeighborEntry, RealRssi, pPeerMacAddr, (PSTRING)pHostName, (PCHAR)pMeshId, MeshIdLen,
							Channel, ChBW, ExtChOffset, CapabilityInfo, pVIE, LenVIE, pMeshConfig);
	}

	return pNeighborEntry;
}