AirioBase + 2 chip PicoSSD board.
Dependencies: mbed EEPROM USBDevice
USBMSD_STEP1.cpp@2:5895d66ce410, 2021-02-10 (annotated)
- Committer:
- muraguchi
- Date:
- Wed Feb 10 01:11:07 2021 +0000
- Revision:
- 2:5895d66ce410
- Parent:
- 0:1472308ded03
- Child:
- 4:2e8b78a74493
1MB version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
muraguchi | 0:1472308ded03 | 1 | #include "USBMSD_STEP1.h" |
muraguchi | 0:1472308ded03 | 2 | #include "RawNAND.h" |
muraguchi | 0:1472308ded03 | 3 | |
muraguchi | 0:1472308ded03 | 4 | USBMSD_STEP1::USBMSD_STEP1(PinName ceb, PinName cle, |
muraguchi | 0:1472308ded03 | 5 | PinName ale, PinName web, |
muraguchi | 0:1472308ded03 | 6 | PinName reb, PinName wpb, |
muraguchi | 0:1472308ded03 | 7 | PinName rbb, |
muraguchi | 0:1472308ded03 | 8 | PinName io1, PinName io2, |
muraguchi | 0:1472308ded03 | 9 | PinName io3, PinName io4, |
muraguchi | 0:1472308ded03 | 10 | PinName io5, PinName io6, |
muraguchi | 0:1472308ded03 | 11 | PinName io7, PinName io8, |
muraguchi | 0:1472308ded03 | 12 | PinName ledRd,PinName ledWr,PinName swInit) |
muraguchi | 0:1472308ded03 | 13 | { |
muraguchi | 0:1472308ded03 | 14 | m_rawNand = new RawNAND(ceb,cle,ale,web,reb,wpb,rbb,io1,io2,io3,io4,io5,io6,io7,io8); |
muraguchi | 0:1472308ded03 | 15 | m_bbt = new bbt_eeprom(1004); |
muraguchi | 0:1472308ded03 | 16 | |
muraguchi | 0:1472308ded03 | 17 | |
muraguchi | 0:1472308ded03 | 18 | m_ledRead = new DigitalOut(ledRd,1); |
muraguchi | 0:1472308ded03 | 19 | m_ledWrite = new DigitalOut(ledWr,1); |
muraguchi | 0:1472308ded03 | 20 | m_swInit = new DigitalIn(swInit); |
muraguchi | 0:1472308ded03 | 21 | |
muraguchi | 0:1472308ded03 | 22 | // if SW is pushed, build BBT table |
muraguchi | 0:1472308ded03 | 23 | if (*m_swInit==0) { |
muraguchi | 0:1472308ded03 | 24 | uint8_t pagebuff; |
muraguchi | 0:1472308ded03 | 25 | |
muraguchi | 0:1472308ded03 | 26 | *m_ledRead=0; |
muraguchi | 0:1472308ded03 | 27 | *m_ledWrite=0; |
muraguchi | 0:1472308ded03 | 28 | |
muraguchi | 0:1472308ded03 | 29 | // search bad blocks in replace area. block 1004-1023 |
muraguchi | 0:1472308ded03 | 30 | for (int r=0;r<20;r++) { |
muraguchi | 0:1472308ded03 | 31 | m_rawNand->pageRead(&pagebuff,(r+1004),63,2175,1); |
muraguchi | 0:1472308ded03 | 32 | if( pagebuff!=0xff) { |
muraguchi | 0:1472308ded03 | 33 | m_bbt->setSlot_EEP(r,1,0,0); |
muraguchi | 0:1472308ded03 | 34 | } |
muraguchi | 0:1472308ded03 | 35 | else { |
muraguchi | 0:1472308ded03 | 36 | // remove broken flag and user flag |
muraguchi | 0:1472308ded03 | 37 | m_bbt->setSlot_EEP(r,0,0,0); |
muraguchi | 0:1472308ded03 | 38 | } |
muraguchi | 0:1472308ded03 | 39 | } |
muraguchi | 0:1472308ded03 | 40 | |
muraguchi | 0:1472308ded03 | 41 | // search bad blocks |
muraguchi | 0:1472308ded03 | 42 | for (int b=0;b<1024-20;b++) { |
muraguchi | 0:1472308ded03 | 43 | m_rawNand->pageRead(&pagebuff,b,63,2175,1); |
muraguchi | 0:1472308ded03 | 44 | if (pagebuff!=0xff){ |
muraguchi | 0:1472308ded03 | 45 | m_bbt->setSlot_EEP(m_bbt->getFreeSlot_EEP(), 0, 1,b); |
muraguchi | 0:1472308ded03 | 46 | } |
muraguchi | 0:1472308ded03 | 47 | } |
muraguchi | 0:1472308ded03 | 48 | |
muraguchi | 0:1472308ded03 | 49 | // set temp |
muraguchi | 0:1472308ded03 | 50 | m_bbt->put(1,0x00); |
muraguchi | 0:1472308ded03 | 51 | *m_ledRead=1; |
muraguchi | 0:1472308ded03 | 52 | *m_ledWrite=1; |
muraguchi | 0:1472308ded03 | 53 | |
muraguchi | 0:1472308ded03 | 54 | } |
muraguchi | 0:1472308ded03 | 55 | m_bbt->updateTranslateTable(); |
muraguchi | 0:1472308ded03 | 56 | |
muraguchi | 0:1472308ded03 | 57 | } |
muraguchi | 0:1472308ded03 | 58 | |
muraguchi | 0:1472308ded03 | 59 | |
muraguchi | 0:1472308ded03 | 60 | int USBMSD_STEP1::disk_read(uint8_t* data, uint64_t block, uint8_t count) |
muraguchi | 0:1472308ded03 | 61 | { |
muraguchi | 0:1472308ded03 | 62 | *m_ledRead = 0; |
muraguchi | 2:5895d66ce410 | 63 | m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block>>1),62+(block&0x1),0,512); |
muraguchi | 2:5895d66ce410 | 64 | //m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); |
muraguchi | 0:1472308ded03 | 65 | *m_ledRead = 1; |
muraguchi | 0:1472308ded03 | 66 | return 0; |
muraguchi | 0:1472308ded03 | 67 | } |
muraguchi | 0:1472308ded03 | 68 | int USBMSD_STEP1::disk_write(const uint8_t* data, uint64_t block, uint8_t count) |
muraguchi | 0:1472308ded03 | 69 | { |
muraguchi | 0:1472308ded03 | 70 | *m_ledWrite = 0; |
muraguchi | 0:1472308ded03 | 71 | // copy data |
muraguchi | 2:5895d66ce410 | 72 | for (uint16_t c=0;c<2;c++){ |
muraguchi | 2:5895d66ce410 | 73 | if ( (block&0x1) == c) continue; |
muraguchi | 2:5895d66ce410 | 74 | m_rawNand->pageRead(m_buffer,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); |
muraguchi | 0:1472308ded03 | 75 | } |
muraguchi | 0:1472308ded03 | 76 | // write data |
muraguchi | 2:5895d66ce410 | 77 | m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block>>1)); |
muraguchi | 2:5895d66ce410 | 78 | for (uint16_t c=0;c<2;c++){ |
muraguchi | 2:5895d66ce410 | 79 | if ( (block&0x1) == c) { |
muraguchi | 2:5895d66ce410 | 80 | m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); |
muraguchi | 0:1472308ded03 | 81 | } else { |
muraguchi | 2:5895d66ce410 | 82 | m_rawNand->pageProgram(m_buffer,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); |
muraguchi | 0:1472308ded03 | 83 | } |
muraguchi | 0:1472308ded03 | 84 | } |
muraguchi | 2:5895d66ce410 | 85 | |
muraguchi | 2:5895d66ce410 | 86 | //m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block)); |
muraguchi | 2:5895d66ce410 | 87 | //m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); |
muraguchi | 0:1472308ded03 | 88 | |
muraguchi | 0:1472308ded03 | 89 | *m_ledWrite = 1; |
muraguchi | 0:1472308ded03 | 90 | return 0; |
muraguchi | 0:1472308ded03 | 91 | } |
muraguchi | 0:1472308ded03 | 92 | int USBMSD_STEP1::disk_status() |
muraguchi | 0:1472308ded03 | 93 | { |
muraguchi | 0:1472308ded03 | 94 | return 0; |
muraguchi | 0:1472308ded03 | 95 | } |
muraguchi | 0:1472308ded03 | 96 | int USBMSD_STEP1::disk_initialize() |
muraguchi | 0:1472308ded03 | 97 | { |
muraguchi | 0:1472308ded03 | 98 | |
muraguchi | 0:1472308ded03 | 99 | return 0; |
muraguchi | 0:1472308ded03 | 100 | } |
muraguchi | 0:1472308ded03 | 101 | uint64_t USBMSD_STEP1::disk_sectors() |
muraguchi | 0:1472308ded03 | 102 | { |
muraguchi | 0:1472308ded03 | 103 | return USBMSD_STEP1_SECTORS; |
muraguchi | 0:1472308ded03 | 104 | } |
muraguchi | 0:1472308ded03 | 105 | uint64_t USBMSD_STEP1::disk_size() |
muraguchi | 0:1472308ded03 | 106 | { |
muraguchi | 0:1472308ded03 | 107 | return USBMSD_STEP1_DISK_SIZE; |
muraguchi | 0:1472308ded03 | 108 | } |