AirioBase + 2 chip PicoSSD board.
Dependencies: mbed EEPROM USBDevice
Diff: bbt_eeprom.cpp
- Revision:
- 0:1472308ded03
- Child:
- 4:2e8b78a74493
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bbt_eeprom.cpp Tue Feb 09 12:00:44 2021 +0000 @@ -0,0 +1,120 @@ +#include "bbt_eeprom.h" + +bbt_eeprom::bbt_eeprom(uint16_t offsetReservedBlockAddress=1004){ + m_offsetReservedBlockAddress = offsetReservedBlockAddress; + m_translateTableMaxIndex=0; + m_tempSlot=0; +} + +uint8_t bbt_eeprom::getStatus_EEP(){ + return m_eeprom.get(BBT_EEPROM_STATUS_ADDR); +} + +void bbt_eeprom::setStatus_EEP(uint8_t status){ + m_eeprom.put(BBT_EEPROM_STATUS_ADDR,status); +} + +void bbt_eeprom::clearAllSlot_EEP(){ + for (int l=0;l<BBT_EEPROM_SLOT_LENGTH;l++){ + setSlot_EEP(l,0,0,0); + } +} + +void bbt_eeprom::setSlot_EEP(uint8_t slot, uint8_t broken, uint8_t used,uint16_t blockAddress){ + m_eeprom.put(BBT_EEPROM_SLOT_BASE_ADDR+slot*BBT_EEPROM_SLOT_SIZE, (blockAddress&0xFF) ); + m_eeprom.put(BBT_EEPROM_SLOT_BASE_ADDR+slot*BBT_EEPROM_SLOT_SIZE+1, ((broken&1)<<7) | ((used&1)<<6) | ((blockAddress>>8)&0x3F) ); +} + +void bbt_eeprom::getSlot_EEP(uint8_t slot, uint8_t * broken, uint8_t * used, uint16_t * blockAddress){ + uint8_t high_byte; + uint8_t low_byte; + low_byte = m_eeprom.get(BBT_EEPROM_SLOT_BASE_ADDR+slot*BBT_EEPROM_SLOT_SIZE); + high_byte = m_eeprom.get(BBT_EEPROM_SLOT_BASE_ADDR+slot*BBT_EEPROM_SLOT_SIZE+1); + *broken = high_byte >> 7; + *used = ( high_byte >> 6 ) & 1; + *blockAddress = ( ( high_byte & 0x3F ) << 8 ) | low_byte; +} + +uint16_t bbt_eeprom::slotToReservedBlockAddress(uint8_t slot){ + return m_offsetReservedBlockAddress + slot; +} + +uint8_t bbt_eeprom::reservedBlockAddressToSlot(uint16_t reservedBlockAddress){ + return reservedBlockAddress - m_offsetReservedBlockAddress; +} + +// 0-19: free slot number +// 255: fail +uint8_t bbt_eeprom::getFreeSlot_EEP(){ + uint8_t broken,used; + uint16_t block_addr; + for (int s=0;s<BBT_EEPROM_SLOT_LENGTH;s++){ + getSlot_EEP(s,&broken,&used,&block_addr); + if( broken==0 && used==0 ) { + return s; + } + } + return 255; +} + +void bbt_eeprom::updateTranslateTable(){ + m_translateTableMaxIndex = 0; + uint8_t broken,used; + uint16_t block_addr; + for (int s=0;s<BBT_EEPROM_SLOT_LENGTH;s++){ + getSlot_EEP(s,&broken,&used,&block_addr); + if (broken==0 && used==1) { + m_translateTableFrom[m_translateTableMaxIndex]=block_addr; + m_translateTableTo[m_translateTableMaxIndex]=slotToReservedBlockAddress(s); + m_translateTableMaxIndex++; + } + } +} + +uint16_t bbt_eeprom::getTranslatedBlockAddress(uint16_t blockAddress){ + for (int i=0;i<m_translateTableMaxIndex;i++){ + if(m_translateTableFrom[i]==blockAddress){ + return m_translateTableTo[i]; + } + } + return blockAddress; +} + +void bbt_eeprom::setTempSlot_EEP(uint8_t tempSlot){ + m_eeprom.put(BBT_EEPROM_TEMPSLOT_ADDR,tempSlot); +} + +uint8_t bbt_eeprom::getTempSlot_EEP(){ + return m_eeprom.get(BBT_EEPROM_TEMPSLOT_ADDR); +} + +void bbt_eeprom::incrTempSlot_EEP(){ + setTempSlot_EEP(getTempSlot_EEP()+1); +} + +void bbt_eeprom::updateTempSlot(){ + m_tempSlot = getTempSlot_EEP(); +} + +void bbt_eeprom::setTempSlot(uint8_t tempSlot){ + m_tempSlot = tempSlot; +} + +uint8_t bbt_eeprom::getTempSlot(){ + return m_tempSlot; +} + +bool bbt_eeprom::isReservedBlockAddress(uint16_t blockAddress){ + if(m_offsetReservedBlockAddress>=blockAddress){ + return true; + } + return false; +} + +uint8_t bbt_eeprom::get(uint16_t address){ + return m_eeprom.get(address); +} + +void bbt_eeprom::put(uint16_t address,uint8_t data){ + m_eeprom.put(address,data); +}