1MB version

Dependencies:   mbed EEPROM USBDevice

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers USBMSD_STEP1.cpp Source File

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 }