500KB USB mass storage

Dependencies:   mbed EEPROM USBDevice

Committer:
muraguchi
Date:
Tue Feb 09 12:02:52 2021 +0000
Revision:
1:49963e1662d6
Parent:
0:1472308ded03
Initial release

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 0:1472308ded03 63 //m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block>>3),56+(block&0x7),0,512);
muraguchi 0:1472308ded03 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 /*
muraguchi 0:1472308ded03 72 // copy data
muraguchi 0:1472308ded03 73 for (uint16_t c=0;c<8;c++){
muraguchi 0:1472308ded03 74 m_rawNand->pageRead(m_buffer+512*c,m_bbt->getTranslatedBlockAddress(block>>3),56+c,0,512);
muraguchi 0:1472308ded03 75 }
muraguchi 0:1472308ded03 76 // write data
muraguchi 0:1472308ded03 77 m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block>>3));
muraguchi 0:1472308ded03 78 for (uint16_t c=0;c<8;c++){
muraguchi 0:1472308ded03 79 if ( (block&0x7) == c) {
muraguchi 0:1472308ded03 80 m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block>>3),56+c,0,512);
muraguchi 0:1472308ded03 81 } else {
muraguchi 0:1472308ded03 82 m_rawNand->pageProgram(m_buffer+512*c,m_bbt->getTranslatedBlockAddress(block>>3),56+c,0,512);
muraguchi 0:1472308ded03 83 }
muraguchi 0:1472308ded03 84 }
muraguchi 0:1472308ded03 85 */
muraguchi 0:1472308ded03 86 m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block));
muraguchi 0:1472308ded03 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 }