Example #1
0
 static void printEnable(uint16_t area, bool on)
 {
   uint8_t index = AREA_INDEX(area);
   if (index < sizeof(bitmasks)) {
     uint8_t bitmask = AREA_BITMASK(area);
     if (on) {
       SETBITS(bitmasks[index], bitmask);
     } else {
       CLEARBITS(bitmasks[index], bitmask);
     }
   }
 }
Example #2
0
bool emberAfPrintEnabled(uint16_t area)
{
  emberAfPrintActiveArea = area;
  if (area == 0xFFFF) {
    return true;
#ifdef EMBER_AF_PRINT_BITS
  } else {
    uint8_t index = AREA_INDEX(area);
    if (index < sizeof(bitmasks)) {
      uint8_t bitmask = AREA_BITMASK(area);
      return READBITS(bitmasks[index], bitmask);
    }
#endif
  }
  return false;
}
Example #3
0
  // If the area is bogus, this may still print a name, but it shouldn't crash.
  static void printAreaName(uint16_t area)
  {
    uint16_t index;
    uint8_t bitmask = AREA_BITMASK(area);
    uint8_t bit;

    for (bit = 0; bit < 8; bit++) {
      if (READBIT(bitmask, bit)) {
        break;
      }
    }
    index = AREA_INDEX(area) * 8 + bit;

    if (area != 0xFFFF
        && index < EMBER_AF_PRINT_NAME_NUMBER) {
      emAfPrintf("%p:", names[index]);
    }
  }
Example #4
0
ERASE_COUNT AREA_GetEC(PHY_BLOCK logical_block)
{
   AREA        area;
   STATUS      status;
   PHY_BLOCK   block;
   ERASE_COUNT ret = INVALID_EC;

   block = BLOCK_OFFSET_AREA(logical_block);
   area = AREA_INDEX(logical_block);

   status = AREA_Read(area);
   if (status == STATUS_SUCCESS)
   {
      ret = cached_area_table[block].physical_block_ec;
   }

   return ret;
}
Example #5
0
PHY_BLOCK AREA_GetBlock(LOG_BLOCK logical_block)
{
   AREA        area;
   STATUS      status;
   PHY_BLOCK   block;
   PHY_BLOCK   ret = INVALID_BLOCK;

   block = BLOCK_OFFSET_AREA(logical_block);
   area = AREA_INDEX(logical_block);

   status = AREA_Read(area);
   if (status == STATUS_SUCCESS)
   {
      ret = cached_area_table[block].physical_block;
   }

   return ret;
}
Example #6
0
BOOL AREA_IsFull(PHY_BLOCK logical_block)
{
   STATUS   status;
   BOOL     ret = FALSE;
   AREA     area = AREA_INDEX(logical_block);

   status = AREA_Read(area);
   if (status == STATUS_SUCCESS)
   {
      /* offset is the current offset, so, -1 */
      if (area_offset_table[area] == PAGE_PER_PHY_BLOCK-1)
      {
         ret = TRUE;
      }
   }

   return ret;
}
Example #7
0
STATUS AREA_Update(PHY_BLOCK      logical_block,
                   PHY_BLOCK      new_origin_block,
                   ERASE_COUNT    new_origin_ec)
{
   AREA        area;
   BLOCK_OFF   block;
   PAGE_OFF    page = INVALID_PAGE;
   STATUS      ret;

   block = BLOCK_OFFSET_AREA(logical_block);
   area = AREA_INDEX(logical_block);

   ret = AREA_Read(area);
   if (ret == STATUS_SUCCESS)
   {
      if (new_origin_block != INVALID_BLOCK)
      {
         cached_area_table[block].physical_block = new_origin_block;
         cached_area_table[block].physical_block_ec = new_origin_ec;
      }

      /* set the next area page offset */
      page = (area_offset_table[area]+1) % PAGE_PER_PHY_BLOCK;
      ret = TABLE_Write(index_table.area_index_table[area],
                        page,
                        &cached_area_table);
   }

   if (ret == STATUS_SUCCESS)
   {
      ASSERT(page != INVALID_PAGE);
      area_offset_table[area] = page;
   }
   else if (ret == STATUS_BADBLOCK)
   {
      /* bad block, set the offset to toggle reclaim of the area table block */
      area_offset_table[area] = PAGE_PER_PHY_BLOCK-1;
      index_table.area_index_ect[area] = INVALID_EC;
   }

   return ret;
}