Ejemplo n.º 1
0
	IROM bool Flash::isValidPage(uint32_t pageIdx,uint32_t& sequence) {
		uint32_t magic;
		uint32_t index=0;
		if ( spi_flash_read(pageAddress(pageIdx),&magic,sizeof(magic))!=SPI_FLASH_RESULT_OK ) {
			return false;
		}
		if ( magic != PAGE_SIGNATURE) {
			return false;
		}
		if ( spi_flash_read(pageAddress(pageIdx)+4,&index,sizeof(index)) != SPI_FLASH_RESULT_OK ) {
			return false;
		}
		sequence = index;
		return true;
	}
GS_READ_PAGE()
{
  mem_req_t memReq2;
  mem_rep_t memRep1;
  page_t page;

  memReq2.cached = false;
  memReq2.rw = READ;
  memReq2.size = DWORD;
  memReq2.addr = pageAddress(pageId); 
  memRep1 = mem(memReq2); 
  memRep = memRep1;
  //If we use memRep1 instead of  memRep, the LHS will be unconnected
  page.fanoutDegree = fanoutInPage(memRep1.data); 
  linkId = startLinkIndxInPage(memRep1.data);
  if (page.fanoutDegree <= 32) {
    fanoutDegree = page.fanoutDegree;
  } else {
    fanoutDegree =  page.fanoutDegree & 31;
  }
  if (page.fanoutDegree == 0) {
    if (pageId == (Input.startPageId + Input.length - 1)) 
      State =  WaitForInputValid;
    else  {
      pageId = pageId + 1;
      State = GS_PROCESS_PAGE;
    }
  } else {
   State = GS_CALC_RANK;
  }
}
Ejemplo n.º 3
0
	IROM uint32_t Flash::flashReadQuad(uint32_t location) { // read QUad at quad boundary and cache
		static uint32_t w;
		static uint32_t lastLocation=0;
		if ( lastLocation != location )
		{
			spi_flash_read(pageAddress(_pageIdx)+location,&w,4);
			lastLocation=location;
		}
		return w;
	}
Ejemplo n.º 4
0
	IROM uint16_t Flash::findFreeBegin() {
		Quad temp;
		uint16_t offset=8; // after signature and sequence
		while(true) {
			if ( spi_flash_read(pageAddress(_pageIdx)+offset,&temp.w,4)!= SPI_FLASH_RESULT_OK )
			return 0;
			if ( temp.w == 0xFFFFFFFF ) break;
			if ( ((temp.index & 1)==0) && (temp.index >_keyMax)) _keyMax=temp.index;
			offset = offset + roundQuad(temp.length)+4;
			if ( offset > PAGE_SIZE) return 0;
		}
		_freePos=offset;
		return offset;
	}
Ejemplo n.º 5
0
	IROM uint16_t Flash::findItem(uint16_t idx) {
		Quad temp;
		uint16_t offset=8; // after signature and sequence
		uint16_t lastOffset=0;
		while(true) {
			if ( spi_flash_read(pageAddress(_pageIdx)+offset,&temp.w,4)!= SPI_FLASH_RESULT_OK )
			return 0;
			if ( temp.w == 0xFFFFFFFF ) break;
			if ( temp.index==idx ) {
				lastOffset=offset;
			}
			offset = offset + roundQuad(temp.length)+4;
			if ( offset > PAGE_SIZE) break;
		}
		return lastOffset;
	}
Ejemplo n.º 6
0
	IROM bool Flash::writeItem( uint16_t index,uint8_t* start,uint32_t length) {
//		INFO(" index : %u , length : %u ",index,length);
		uint32_t address = pageAddress(_pageIdx)+_freePos;
		Quad W;
		W.index = index;
		W.length=length;
//		INFO(" address 0x%x length %d",address,length);
		if (spi_flash_write(address,&W.w,4)!= SPI_FLASH_RESULT_OK ) return false;
		for(uint32_t i=0;i<length+3;i+=4) {
			W.w=0xFFFFFFFF;
			for(uint32_t j=0;i+j<length && j<4;j++) W.b[j]=start[i+j];
			if (spi_flash_write(address+4+i,&W.w,4)!= SPI_FLASH_RESULT_OK ) return false;
		}
		_freePos += 4+roundQuad(length);
		return true;
	}