Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed EEPROM USBDevice
USBMSD_STEP1.cpp
00001 #include "USBMSD_STEP1.h" 00002 #include "RawNAND.h" 00003 00004 USBMSD_STEP1::USBMSD_STEP1(PinName ceb0,PinName ceb1, 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(ceb0,ceb1,cle,ale,web,reb,wpb,rbb,io1,io2,io3,io4,io5,io6,io7,io8); 00015 m_bbt = new bbt_eeprom(2048-40); 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<40;r++) { 00031 m_rawNand->pageRead(get_cs_from_block(2048-40+r),&pagebuff,get_chip_block_from_block(2048-40+r),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<2048-40;b++) { 00043 m_rawNand->pageRead(get_cs_from_block(b),&pagebuff,get_chip_block_from_block(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 uint8_t USBMSD_STEP1::get_cs_from_block(uint16_t block) 00060 { 00061 if (block<1024) { 00062 return 0; 00063 } else { 00064 return 1; 00065 } 00066 } 00067 00068 uint16_t USBMSD_STEP1::get_chip_block_from_block(uint16_t block) 00069 { 00070 if (block<1024) { 00071 return block; 00072 } else { 00073 return block-1024; 00074 } 00075 } 00076 00077 00078 00079 int USBMSD_STEP1::disk_read(uint8_t* data, uint64_t block, uint8_t count) 00080 { 00081 *m_ledRead = 0; 00082 m_rawNand->pageRead(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),data, 00083 get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+(block&0x1),0,512); 00084 //m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); 00085 *m_ledRead = 1; 00086 return 0; 00087 } 00088 int USBMSD_STEP1::disk_write(const uint8_t* data, uint64_t block, uint8_t count) 00089 { 00090 *m_ledWrite = 0; 00091 // copy data 00092 for (uint16_t c=0;c<2;c++){ 00093 if ( (block&0x1) == c) continue; 00094 m_rawNand->pageRead(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),m_buffer, 00095 get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+c,0,512); 00096 } 00097 // write data 00098 m_rawNand->erase(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1))); 00099 for (uint16_t c=0;c<2;c++){ 00100 if ( (block&0x1) == c) { 00101 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); 00102 } else { 00103 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); 00104 } 00105 } 00106 00107 //m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block)); 00108 //m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block),63,0,512); 00109 00110 *m_ledWrite = 1; 00111 return 0; 00112 } 00113 int USBMSD_STEP1::disk_status() 00114 { 00115 return 0; 00116 } 00117 int USBMSD_STEP1::disk_initialize() 00118 { 00119 00120 return 0; 00121 } 00122 uint64_t USBMSD_STEP1::disk_sectors() 00123 { 00124 return USBMSD_STEP1_SECTORS; 00125 } 00126 uint64_t USBMSD_STEP1::disk_size() 00127 { 00128 return USBMSD_STEP1_DISK_SIZE; 00129 }
Generated on Thu Aug 4 2022 19:21:41 by
1.7.2