Support Isochronous transfer additionally

Dependents:   USBHostC270_example_GR-PEACH USBHostDac_example USBHostDac_Audio_in_out

Fork of USBHost_custom by Renesas

Revision:
39:4a7c5479dc23
Parent:
33:6c4cab4d356f
--- a/USBHostMSD/USBHostMSD.cpp	Tue Mar 14 05:38:25 2017 +0000
+++ b/USBHostMSD/USBHostMSD.cpp	Thu Mar 16 04:38:43 2017 +0000
@@ -29,13 +29,20 @@
 #define GET_MAX_LUN             (0xFE)
 #define BO_MASS_STORAGE_RESET   (0xFF)
 
-USBHostMSD::USBHostMSD(const char * rootdir) : FATFileSystem(rootdir)
+USBHostMSD::USBHostMSD()
 {
     host = USBHost::getHostInst();
-    init();
+    msd_init();
 }
 
-void USBHostMSD::init() {
+USBHostMSD::~USBHostMSD()
+{
+    if (_is_initialized) {
+        deinit();
+    }
+}
+
+void USBHostMSD::msd_init() {
     dev_connected = false;
     dev = NULL;
     bulk_in = NULL;
@@ -45,7 +52,7 @@
     blockCount = 0;
     msd_intf = -1;
     msd_device_found = false;
-    disk_init = false;
+    _is_initialized = false;
     dev_connected = false;
     nb_ep = 0;
 }
@@ -80,14 +87,14 @@
 
                 USB_INFO("New MSD device: VID:%04x PID:%04x [dev: %p - intf: %d]", dev->getVid(), dev->getPid(), dev, msd_intf);
                 dev->setName("MSD", msd_intf);
-                host->registerDriver(dev, msd_intf, this, &USBHostMSD::init);
+                host->registerDriver(dev, msd_intf, this, &USBHostMSD::msd_init);
 
                 dev_connected = true;
                 return true;
             }
         } //if()
     } //for()
-    init();
+    msd_init();
     return false;
 }
 
@@ -301,10 +308,17 @@
     return res;
 }
 
-int USBHostMSD::disk_initialize() {
-    USB_DBG("FILESYSTEM: init");
+#define USB_BLOCK_DEVICE_ERROR_WOULD_BLOCK        -5001 /*!< operation would block */
+#define USB_BLOCK_DEVICE_ERROR_UNSUPPORTED        -5002 /*!< unsupported operation */
+#define USB_BLOCK_DEVICE_ERROR_PARAMETER          -5003 /*!< invalid parameter */
+#define USB_BLOCK_DEVICE_ERROR_NO_INIT            -5004 /*!< uninitialized */
+#define USB_BLOCK_DEVICE_ERROR_NO_DEVICE          -5005 /*!< device is missing or not connected */
+#define USB_BLOCK_DEVICE_ERROR_WRITE_PROTECTED    -5006 /*!< write protected */
+
+int USBHostMSD::init() {
     uint16_t i, timeout = 10;
 
+    _lock.lock();
     getMaxLun();
 
     for (i = 0; i < timeout; i++) {
@@ -314,53 +328,116 @@
     }
 
     if (i == timeout) {
-        disk_init = false;
-        return -1;
+        return BD_ERROR_DEVICE_ERROR;
     }
 
     inquiry(0, 0);
-    disk_init = 1;
-    return readCapacity();
+    if (readCapacity() != 0) {
+        _lock.unlock();
+        return BD_ERROR_DEVICE_ERROR;
+    }
+    _is_initialized = true;
+    _lock.unlock();
+
+    return BD_ERROR_OK;
+}
+
+int USBHostMSD::deinit() {
+    return 0;
 }
 
-int USBHostMSD::disk_write(const uint8_t* buffer, uint32_t block_number, uint32_t count) {
-    USB_DBG("FILESYSTEM: write block: %lld, count: %d", block_number, count);
-    if (!disk_init) {
-        disk_initialize();
+int USBHostMSD::program(const void *b, bd_addr_t addr, bd_size_t size)
+{
+    if (!is_valid_program(addr, size)) {
+        return USB_BLOCK_DEVICE_ERROR_PARAMETER;
+    }
+
+    _lock.lock();
+    if (!_is_initialized) {
+        _lock.unlock();
+        return USB_BLOCK_DEVICE_ERROR_NO_INIT;
     }
-    if (!disk_init)
-        return -1;
-    for (uint32_t b = block_number; b < block_number + count; b++) {
-        if (dataTransfer((uint8_t*)buffer, b, 1, HOST_TO_DEVICE))
-            return -1;
+
+    const uint8_t *buffer = static_cast<const uint8_t*>(b);
+    while (size > 0) {
+        bd_addr_t block = addr / 512;
+
+        // send the data block
+        if (dataTransfer((uint8_t*)buffer, block, 1, HOST_TO_DEVICE)) {
+            _lock.unlock();
+            return BD_ERROR_DEVICE_ERROR;
+        }
+
         buffer += 512;
+        addr += 512;
+        size -= 512;
     }
+    _lock.unlock();
     return 0;
 }
 
-int USBHostMSD::disk_read(uint8_t* buffer, uint32_t block_number, uint32_t count) {
-    USB_DBG("FILESYSTEM: read block: %lld, count: %d", block_number, count);
-    if (!disk_init) {
-        disk_initialize();
+int USBHostMSD::read(void *b, bd_addr_t addr, bd_size_t size)
+{
+    if (!is_valid_read(addr, size)) {
+        return USB_BLOCK_DEVICE_ERROR_PARAMETER;
+    }
+
+    _lock.lock();
+    if (!_is_initialized) {
+        _lock.unlock();
+        return USB_BLOCK_DEVICE_ERROR_PARAMETER;
     }
-    if (!disk_init)
-        return -1;
-    for (uint32_t b = block_number; b < block_number + count; b++) {
-        if (dataTransfer((uint8_t*)buffer, b, 1, DEVICE_TO_HOST))
-            return -1;
+
+    uint8_t *buffer = static_cast<uint8_t *>(b);
+    while (size > 0) {
+        bd_addr_t block = addr / 512;
+
+        // receive the data
+        if (dataTransfer((uint8_t*)buffer, block, 1, DEVICE_TO_HOST)) {
+            _lock.unlock();
+            return BD_ERROR_DEVICE_ERROR;
+        }
         buffer += 512;
+        addr += 512;
+        size -= 512;
     }
+    _lock.unlock();
     return 0;
 }
 
-uint32_t USBHostMSD::disk_sectors() {
-    USB_DBG("FILESYSTEM: sectors");
-    if (!disk_init) {
-        disk_initialize();
+int USBHostMSD::erase(bd_addr_t addr, bd_size_t size)
+{
+    return 0;
+}
+
+bd_size_t USBHostMSD::get_read_size() const
+{
+    return 512;
+}
+
+bd_size_t USBHostMSD::get_program_size() const
+{
+    return 512;
+}
+
+bd_size_t USBHostMSD::get_erase_size() const
+{
+    return 512;
+}
+
+bd_size_t USBHostMSD::size() const
+{
+    bd_size_t sectors = 0;
+    if(_is_initialized) {
+        sectors = blockCount;
     }
-    if (!disk_init)
-        return 0;
-    return blockCount;
+    return 512*sectors;
+}
+
+void USBHostMSD::debug(bool dbg)
+{
+//    _dbg = dbg;
 }
 
 #endif
+