AirioBase + 2 chip PicoSSD board.

Dependencies:   mbed EEPROM USBDevice

Committer:
muraguchi
Date:
Wed Sep 15 16:32:12 2021 +0000
Revision:
4:2e8b78a74493
Parent:
2:5895d66ce410
AirioBase + 2 chip PicoSSD board.

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 4:2e8b78a74493 4 USBMSD_STEP1::USBMSD_STEP1(PinName ceb0,PinName ceb1, 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 4:2e8b78a74493 14 m_rawNand = new RawNAND(ceb0,ceb1,cle,ale,web,reb,wpb,rbb,io1,io2,io3,io4,io5,io6,io7,io8);
muraguchi 4:2e8b78a74493 15 m_bbt = new bbt_eeprom(2048-40);
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 4:2e8b78a74493 30 for (int r=0;r<40;r++) {
muraguchi 4:2e8b78a74493 31 m_rawNand->pageRead(get_cs_from_block(2048-40+r),&pagebuff,get_chip_block_from_block(2048-40+r),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 4:2e8b78a74493 42 for (int b=0;b<2048-40;b++) {
muraguchi 4:2e8b78a74493 43 m_rawNand->pageRead(get_cs_from_block(b),&pagebuff,get_chip_block_from_block(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 4:2e8b78a74493 59 uint8_t USBMSD_STEP1::get_cs_from_block(uint16_t block)
muraguchi 4:2e8b78a74493 60 {
muraguchi 4:2e8b78a74493 61 if (block<1024) {
muraguchi 4:2e8b78a74493 62 return 0;
muraguchi 4:2e8b78a74493 63 } else {
muraguchi 4:2e8b78a74493 64 return 1;
muraguchi 4:2e8b78a74493 65 }
muraguchi 4:2e8b78a74493 66 }
muraguchi 4:2e8b78a74493 67
muraguchi 4:2e8b78a74493 68 uint16_t USBMSD_STEP1::get_chip_block_from_block(uint16_t block)
muraguchi 4:2e8b78a74493 69 {
muraguchi 4:2e8b78a74493 70 if (block<1024) {
muraguchi 4:2e8b78a74493 71 return block;
muraguchi 4:2e8b78a74493 72 } else {
muraguchi 4:2e8b78a74493 73 return block-1024;
muraguchi 4:2e8b78a74493 74 }
muraguchi 4:2e8b78a74493 75 }
muraguchi 4:2e8b78a74493 76
muraguchi 4:2e8b78a74493 77
muraguchi 0:1472308ded03 78
muraguchi 0:1472308ded03 79 int USBMSD_STEP1::disk_read(uint8_t* data, uint64_t block, uint8_t count)
muraguchi 0:1472308ded03 80 {
muraguchi 0:1472308ded03 81 *m_ledRead = 0;
muraguchi 4:2e8b78a74493 82 m_rawNand->pageRead(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),data,
muraguchi 4:2e8b78a74493 83 get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+(block&0x1),0,512);
muraguchi 2:5895d66ce410 84 //m_rawNand->pageRead(data,m_bbt->getTranslatedBlockAddress(block),63,0,512);
muraguchi 0:1472308ded03 85 *m_ledRead = 1;
muraguchi 0:1472308ded03 86 return 0;
muraguchi 0:1472308ded03 87 }
muraguchi 0:1472308ded03 88 int USBMSD_STEP1::disk_write(const uint8_t* data, uint64_t block, uint8_t count)
muraguchi 0:1472308ded03 89 {
muraguchi 0:1472308ded03 90 *m_ledWrite = 0;
muraguchi 0:1472308ded03 91 // copy data
muraguchi 2:5895d66ce410 92 for (uint16_t c=0;c<2;c++){
muraguchi 2:5895d66ce410 93 if ( (block&0x1) == c) continue;
muraguchi 4:2e8b78a74493 94 m_rawNand->pageRead(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),m_buffer,
muraguchi 4:2e8b78a74493 95 get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),62+c,0,512);
muraguchi 0:1472308ded03 96 }
muraguchi 0:1472308ded03 97 // write data
muraguchi 4:2e8b78a74493 98 m_rawNand->erase(get_cs_from_block(m_bbt->getTranslatedBlockAddress(block>>1)),get_chip_block_from_block(m_bbt->getTranslatedBlockAddress(block>>1)));
muraguchi 2:5895d66ce410 99 for (uint16_t c=0;c<2;c++){
muraguchi 2:5895d66ce410 100 if ( (block&0x1) == c) {
muraguchi 4:2e8b78a74493 101 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);
muraguchi 0:1472308ded03 102 } else {
muraguchi 4:2e8b78a74493 103 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);
muraguchi 0:1472308ded03 104 }
muraguchi 0:1472308ded03 105 }
muraguchi 2:5895d66ce410 106
muraguchi 2:5895d66ce410 107 //m_rawNand->erase(m_bbt->getTranslatedBlockAddress(block));
muraguchi 2:5895d66ce410 108 //m_rawNand->pageProgram(data,m_bbt->getTranslatedBlockAddress(block),63,0,512);
muraguchi 0:1472308ded03 109
muraguchi 0:1472308ded03 110 *m_ledWrite = 1;
muraguchi 0:1472308ded03 111 return 0;
muraguchi 0:1472308ded03 112 }
muraguchi 0:1472308ded03 113 int USBMSD_STEP1::disk_status()
muraguchi 0:1472308ded03 114 {
muraguchi 0:1472308ded03 115 return 0;
muraguchi 0:1472308ded03 116 }
muraguchi 0:1472308ded03 117 int USBMSD_STEP1::disk_initialize()
muraguchi 0:1472308ded03 118 {
muraguchi 0:1472308ded03 119
muraguchi 0:1472308ded03 120 return 0;
muraguchi 0:1472308ded03 121 }
muraguchi 0:1472308ded03 122 uint64_t USBMSD_STEP1::disk_sectors()
muraguchi 0:1472308ded03 123 {
muraguchi 0:1472308ded03 124 return USBMSD_STEP1_SECTORS;
muraguchi 0:1472308ded03 125 }
muraguchi 0:1472308ded03 126 uint64_t USBMSD_STEP1::disk_size()
muraguchi 0:1472308ded03 127 {
muraguchi 0:1472308ded03 128 return USBMSD_STEP1_DISK_SIZE;
muraguchi 0:1472308ded03 129 }