Takanobu Muraguchi / Mbed 2 deprecated picossd_step1_2cs

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