supported callback

Dependents:   GraphicPoi

Fork of RAM_DISK by Samuel Mokrani

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