supported callback
Fork of RAM_DISK by
Diff: USBMSD_Ram.cpp
- Revision:
- 2:69984d40fc4b
- Parent:
- 1:3d0c421fe52b
- Child:
- 3:5b6b3320c4f4
--- a/USBMSD_Ram.cpp Thu May 16 09:19:46 2013 +0000 +++ b/USBMSD_Ram.cpp Thu Dec 01 01:58:16 2016 +0000 @@ -32,9 +32,9 @@ const char mbr[] = { //sector 0: boot sector 0xEB,0x3C,0x90,0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30, 0x00,0x02,/*bytes per sector: 512*/ 0x01, /*sectors per cluster*/ 0x01,0x00,/*number of reserved sector*/ - 0x01, /* number of FATs*/ 0x10,0x00, /*Maximum number of root directory entries: 16*/ LSByte(NB_SECTORS),MSByte(NB_SECTORS), /*Total sector count*/ 0xF0, 0x01,0x00,/*sectors per FAT: 1*/ 0x01,0x00,/*Sectors per track*/ 0x01,0x00, /*Number of heads*/ 0x00,0x00,0x00,0x00, - 0x00,0x01,0x00,0x00,0x00,0x00, 0x29, /*boot signature*/ 0x74,0x19,0x02,0x27, /*volume ID*/ 'M','b','e','d',' ', - 'U','S','B',' ',' ',' ', /*volume label: Mbed USB*/ 0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,0x33,0xC9, + 0x01, /* number of FATs*/ 0x10,0x00, /*Maximum number of root directory entries: 16*/ LSByte(IMG_SECTORS),MSByte(IMG_SECTORS), /*Total sector count*/ 0xF0, 0x01,0x00,/*sectors per FAT: 1*/ 0x01,0x00,/*Sectors per track*/ 0x01,0x00, /*Number of heads*/ 0x00,0x00,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x00, 0x29, /*boot signature*/ 0x74,0x19,0x02,0x27, /*volume ID*/ 'G','r','a','p','h', + 'i','c','P','o','i',' ', /*volume label*/ 0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,0x33,0xC9, 0x8E,0xD1,0xBC,0xF0,0x7B,0x8E,0xD9,0xB8,0x00,0x20,0x8E,0xC0,0xFC,0xBD,0x00,0x7C, 0x38,0x4E,0x24,0x7D,0x24,0x8B,0xC1,0x99,0xE8,0x3C,0x01,0x72,0x1C,0x83,0xEB,0x3A, 0x66,0xA1,0x1C,0x7C,0x26,0x66,0x3B,0x07,0x26,0x8A,0x57,0xFC,0x75,0x06,0x80,0xCA, @@ -70,7 +70,7 @@ const char root_dir[] = { //sector 3: root directory //entry 1 - 'M','b','e','d',' ','U','S','B',' ',' ',' ', 0x28,0x00,0x00,0x00,0x00, + 'G','r','a','p','h','i','c','P','o','i',' ', 0x28,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //entry 2 'R','E','A','D','M','E',0x20,0x20,'T','X','T', /*readme.txt*/ 0x20,0x00,0x00,0x00,0x00, @@ -84,20 +84,21 @@ }; //3 sectors -SECTOR sectors[4] = { +const SECTOR sectors[4] = { {mbr , 512}, {fat, 8}, - {root_dir, 4*16}, + {root_dir, 2*16}, // contains readme.txt - {data, 2*16} +// {data, 2*16} }; USBMSD_Ram::USBMSD_Ram() { //no init _status = 0x01; + parseFat = NULL; memset(disk_image, 0, 512*4); - for (uint8_t i = 0; i < 4; i++) { + for (uint8_t i = 0; i < 3; i++) { memcpy(disk_image + 512*i, sectors[i].sect, sectors[i].length); } connect(); @@ -109,17 +110,57 @@ return 0; } -int USBMSD_Ram::disk_write(const uint8_t * buffer, uint64_t block_number) { - memcpy(disk_image + block_number*512, buffer, 512); +int USBMSD_Ram::disk_write(const uint8_t * buffer, uint64_t block_number, uint8_t count) { + if (block_number < RAW_SECTORS) { + memcpy(&disk_image[block_number*512], buffer, 512*count); + } + parseFat(block_number, buffer); return 0; } -int USBMSD_Ram::disk_read(uint8_t * buffer, uint64_t block_number) { - memcpy(buffer, disk_image + block_number*512, 512); +int USBMSD_Ram::disk_read(uint8_t * buffer, uint64_t block_number, uint8_t count) { + if (block_number < RAW_SECTORS) { + memcpy(buffer, &disk_image[block_number*512], 512*count); + } else { + memset(buffer, 0, 512*count); + } return 0; } int USBMSD_Ram::disk_status() { return _status; } int USBMSD_Ram::disk_sync() { return 0; } -uint64_t USBMSD_Ram::disk_sectors() { return NB_SECTORS; } -uint64_t USBMSD_Ram::disk_size() { return NB_SECTORS*512;} +uint64_t USBMSD_Ram::disk_sectors() { return IMG_SECTORS; } +uint64_t USBMSD_Ram::disk_size() { return IMG_SECTORS*512;} + +int USBMSD_Ram::disk_ioctl (uint8_t pdrv, uint8_t cmd, void* buff) { + int res; + + res = 1; + switch (cmd) { + case 0 : /* Make sure that no pending write process */ + break; + + case 1 : /* Get number of sectors on the disk (DWORD) */ + *(int*)buff = disk_sectors(); + res = 0; + break; + + case 2 : + *(int*)buff = disk_size(); + res = 0; + break; + + case 3 : /* Get erase block size in unit of sector (DWORD) */ + *(int*)buff = 1; + res = 0; + break; + + case 4 : + break; + + default: + res = 4; + } + + return res; +}