AirioBase + 2 chip PicoSSD board.
Dependencies: mbed EEPROM USBDevice
Diff: USBMSD_STEP1.cpp
- Revision:
- 4:2e8b78a74493
- Parent:
- 2:5895d66ce410
--- a/USBMSD_STEP1.cpp Wed Feb 10 03:45:12 2021 +0000 +++ b/USBMSD_STEP1.cpp Wed Sep 15 16:32:12 2021 +0000 @@ -1,7 +1,7 @@ #include "USBMSD_STEP1.h" #include "RawNAND.h" -USBMSD_STEP1::USBMSD_STEP1(PinName ceb, PinName cle, +USBMSD_STEP1::USBMSD_STEP1(PinName ceb0,PinName ceb1, PinName cle, PinName ale, PinName web, PinName reb, PinName wpb, PinName rbb, @@ -11,8 +11,8 @@ PinName io7, PinName io8, PinName ledRd,PinName ledWr,PinName swInit) { - m_rawNand = new RawNAND(ceb,cle,ale,web,reb,wpb,rbb,io1,io2,io3,io4,io5,io6,io7,io8); - m_bbt = new bbt_eeprom(1004); + m_rawNand = new RawNAND(ceb0,ceb1,cle,ale,web,reb,wpb,rbb,io1,io2,io3,io4,io5,io6,io7,io8); + m_bbt = new bbt_eeprom(2048-40); m_ledRead = new DigitalOut(ledRd,1); @@ -27,8 +27,8 @@ *m_ledWrite=0; // search bad blocks in replace area. block 1004-1023 - for (int r=0;r<20;r++) { - m_rawNand->pageRead(&pagebuff,(r+1004),63,2175,1); + for (int r=0;r<40;r++) { + m_rawNand->pageRead(get_cs_from_block(2048-40+r),&pagebuff,get_chip_block_from_block(2048-40+r),63,2175,1); if( pagebuff!=0xff) { m_bbt->setSlot_EEP(r,1,0,0); } @@ -39,8 +39,8 @@ } // search bad blocks - for (int b=0;b<1024-20;b++) { - m_rawNand->pageRead(&pagebuff,b,63,2175,1); + for (int b=0;b<2048-40;b++) { + m_rawNand->pageRead(get_cs_from_block(b),&pagebuff,get_chip_block_from_block(b),63,2175,1); if (pagebuff!=0xff){ m_bbt->setSlot_EEP(m_bbt->getFreeSlot_EEP(), 0, 1,b); } @@ -56,11 +56,31 @@ } +uint8_t USBMSD_STEP1::get_cs_from_block(uint16_t block) +{ + if (block<1024) { + return 0; + } else { + return 1; + } +} + +uint16_t USBMSD_STEP1::get_chip_block_from_block(uint16_t block) +{ + if (block<1024) { + return block; + } else { + return block-1024; + } +} + + int USBMSD_STEP1::disk_read(uint8_t* data, uint64_t block, uint8_t count) { *m_ledRead = 0; - m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block>>1),62+(block&0x1),0,512); + m_rawNand->pageRead(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),data, + get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+(block&0x1),0,512); //m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); *m_ledRead = 1; return 0; @@ -71,15 +91,16 @@ // copy data for (uint16_t c=0;c<2;c++){ if ( (block&0x1) == c) continue; - m_rawNand->pageRead(m_buffer,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); + m_rawNand->pageRead(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),m_buffer, + get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+c,0,512); } // write data - m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block>>1)); + m_rawNand->erase(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1))); for (uint16_t c=0;c<2;c++){ if ( (block&0x1) == c) { - m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); + m_rawNand->pageProgram(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),data,get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+c,0,512); } else { - m_rawNand->pageProgram(m_buffer,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); + m_rawNand->pageProgram(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),m_buffer,get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+c,0,512); } }