1MB version
Dependencies: mbed EEPROM USBDevice
USBMSD_STEP1.cpp
00001 #include "USBMSD_STEP1.h" 00002 #include "RawNAND.h" 00003 00004 USBMSD_STEP1::USBMSD_STEP1(PinName ceb, PinName cle, 00005 PinName ale, PinName web, 00006 PinName reb, PinName wpb, 00007 PinName rbb, 00008 PinName io1, PinName io2, 00009 PinName io3, PinName io4, 00010 PinName io5, PinName io6, 00011 PinName io7, PinName io8, 00012 PinName ledRd,PinName ledWr,PinName swInit) 00013 { 00014 m_rawNand = new RawNAND(ceb,cle,ale,web,reb,wpb,rbb,io1,io2,io3,io4,io5,io6,io7,io8); 00015 m_bbt = new bbt_eeprom(1004); 00016 00017 00018 m_ledRead = new DigitalOut(ledRd,1); 00019 m_ledWrite = new DigitalOut(ledWr,1); 00020 m_swInit = new DigitalIn(swInit); 00021 00022 // if SW is pushed, build BBT table 00023 if (*m_swInit==0) { 00024 uint8_t pagebuff; 00025 00026 *m_ledRead=0; 00027 *m_ledWrite=0; 00028 00029 // search bad blocks in replace area. block 1004-1023 00030 for (int r=0;r<20;r++) { 00031 m_rawNand->pageRead(&pagebuff,(r+1004),63,2175,1); 00032 if( pagebuff!=0xff) { 00033 m_bbt->setSlot_EEP(r,1,0,0); 00034 } 00035 else { 00036 // remove broken flag and user flag 00037 m_bbt->setSlot_EEP(r,0,0,0); 00038 } 00039 } 00040 00041 // search bad blocks 00042 for (int b=0;b<1024-20;b++) { 00043 m_rawNand->pageRead(&pagebuff,b,63,2175,1); 00044 if (pagebuff!=0xff){ 00045 m_bbt->setSlot_EEP(m_bbt->getFreeSlot_EEP(), 0, 1,b); 00046 } 00047 } 00048 00049 // set temp 00050 m_bbt->put(1,0x00); 00051 *m_ledRead=1; 00052 *m_ledWrite=1; 00053 00054 } 00055 m_bbt->updateTranslateTable(); 00056 00057 } 00058 00059 00060 int USBMSD_STEP1::disk_read(uint8_t* data, uint64_t block, uint8_t count) 00061 { 00062 *m_ledRead = 0; 00063 m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block>>1),62+(block&0x1),0,512); 00064 //m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); 00065 *m_ledRead = 1; 00066 return 0; 00067 } 00068 int USBMSD_STEP1::disk_write(const uint8_t* data, uint64_t block, uint8_t count) 00069 { 00070 *m_ledWrite = 0; 00071 // copy data 00072 for (uint16_t c=0;c<2;c++){ 00073 if ( (block&0x1) == c) continue; 00074 m_rawNand->pageRead(m_buffer,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); 00075 } 00076 // write data 00077 m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block>>1)); 00078 for (uint16_t c=0;c<2;c++){ 00079 if ( (block&0x1) == c) { 00080 m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); 00081 } else { 00082 m_rawNand->pageProgram(m_buffer,m_bbt->getTranslatedBlockAddress(block>>1),62+c,0,512); 00083 } 00084 } 00085 00086 //m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block)); 00087 //m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); 00088 00089 *m_ledWrite = 1; 00090 return 0; 00091 } 00092 int USBMSD_STEP1::disk_status() 00093 { 00094 return 0; 00095 } 00096 int USBMSD_STEP1::disk_initialize() 00097 { 00098 00099 return 0; 00100 } 00101 uint64_t USBMSD_STEP1::disk_sectors() 00102 { 00103 return USBMSD_STEP1_SECTORS; 00104 } 00105 uint64_t USBMSD_STEP1::disk_size() 00106 { 00107 return USBMSD_STEP1_DISK_SIZE; 00108 }
Generated on Mon Jul 25 2022 04:43:05 by 1.7.2