1MB version

Dependencies:   mbed EEPROM USBDevice

Committer:
muraguchi
Date:
Wed Feb 10 03:45:12 2021 +0000
Revision:
3:28ceea26c918
Parent:
2:5895d66ce410
Comment

Who changed what in which revision?

UserRevisionLine numberNew 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 }