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; } }
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; }
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; }
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; }
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; }