doku newon / DokuUSBHostWithIso

Dependencies:   FATFileSystem mbed-rtos

Dependents:   Peach_AudioChannelDividerAndCompensator

Files at this revision

API Documentation at this revision

Comitter:
dokunewon
Date:
Sun Oct 18 08:16:18 2015 +0000
Parent:
31:271fcfd7cfc2
Commit message:
Change a little.

Changed in this revision

Doku_USBisochronous/USBIsochronous.cpp Show annotated file Show diff for this revision Revisions of this file
Doku_USBisochronous/USBIsochronous.h Show annotated file Show diff for this revision Revisions of this file
USBHost/TARGET_RENESAS/TARGET_RZ_A1H/usb_host_setting.h Show annotated file Show diff for this revision Revisions of this file
USBHost/USBHost.cpp Show annotated file Show diff for this revision Revisions of this file
USBHost/USBHost.h Show annotated file Show diff for this revision Revisions of this file
USBisochronous/USBIsochronous.cpp Show diff for this revision Revisions of this file
USBisochronous/USBIsochronous.h Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Doku_USBisochronous/USBIsochronous.cpp	Sun Oct 18 08:16:18 2015 +0000
@@ -0,0 +1,225 @@
+// USBIsochronous.cpp
+#include "USBHostConf.h"
+#include "USBHost.h"
+#include "USBIsochronous.h"
+#if defined(TARGET_RZ_A1H)
+#include "ohci_wrapp_RZ_A1.h"
+#endif
+
+#define  OR_CONTROL_PLE                 0x00000004
+#define  OR_CONTROL_IE                  0x00000008
+
+//#define ISO_DEBUG 1
+#ifdef ISO_DEBUG
+#define ISO_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
+#else
+#define ISO_DBG(...)  while(0);
+#endif
+
+#define TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
+
+HCITD::HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize) {
+    Control = 0xe0000000           | // CC ConditionCode NOT ACCESSED
+             ((FrameCount-1) << 24)| // FC FrameCount
+                  TD_DELAY_INT(0)  | // DI DelayInterrupt
+                 FrameNumber;        // SF StartingFrame
+    BufferPage0 = const_cast<uint8_t*>(buf);
+    BufferEnd = const_cast<uint8_t*>(buf) + PacketSize * FrameCount - 1;
+    Next = NULL; 
+    ep = obj;
+    uint32_t addr = reinterpret_cast<uint32_t>(buf);
+    for(int i = 0; i < FrameCount; i++) {
+        uint16_t offset = addr & 0x0fff;
+        if ((addr&0xfffff000) == (reinterpret_cast<uint32_t>(BufferEnd)&0xfffff000)) {
+            offset |= 0x1000;
+        }
+        OffsetPSW[i] = 0xe000|offset;
+        addr += PacketSize;
+    }
+}
+
+void IsochronousEp::init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount, uint8_t queueLimit) {
+    //ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size);
+    TEST_ASSERT(addr >= 1);    
+    TEST_ASSERT(size >= 8 && size <= 1023);
+    m_pED  = new _HCED(addr, ep, size);
+    TEST_ASSERT(m_pED);
+
+    m_pED->setFormat(); // F Format ITD
+
+    m_PacketSize = size;
+    TEST_ASSERT(frameCount >= 1 && frameCount <= 8);
+    m_FrameCount = frameCount;
+    TEST_ASSERT(queueLimit >= 1 && queueLimit <= HCITD_QUEUE_SIZE);
+    m_itd_queue_limit = queueLimit;
+
+    m_itd_queue_count = 0;
+    reset();
+    HCITD* itd = new_HCITD(this);
+    m_pED->init_queue<HCITD>(itd); 
+    TEST_ASSERT(itd);
+    if (itd == NULL) {
+        return;
+    }
+#if defined(TARGET_LPC1768)
+    _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
+#elif defined(TARGET_RZ_A1H)
+    _HCCA* hcca = reinterpret_cast<_HCCA*>(ohciwrapp_reg_r(OHCI_REG_HCCA));
+#endif
+    TEST_ASSERT(hcca);
+    if (hcca == NULL) {
+        return;
+    }
+    hcca->enqueue(m_pED);
+}
+
+void IsochronousEp::reset(int delay_ms)
+{
+#if defined(TARGET_LPC1768)
+    m_FrameNumber = LPC_USB->HcFmNumber + delay_ms;
+#elif defined(TARGET_RZ_A1H)
+    m_FrameNumber = ohciwrapp_reg_r(OHCI_REG_FMNUMBER) + delay_ms;
+#endif
+}
+
+HCITD* IsochronousEp::new_HCITD(IsochronousEp* obj) {
+    HCITD* itd = new(m_PacketSize*m_FrameCount)HCITD(obj, 0, m_FrameCount, m_PacketSize);
+    if (itd == NULL) {
+        return NULL;
+    } 
+    return itd;
+}
+
+HCITD* IsochronousEp::isochronousReceive(int timeout_ms) {
+    TEST_ASSERT(m_itd_queue_count >= 0);
+    while(m_itd_queue_count < m_itd_queue_limit) {
+        if (m_pED == NULL) {
+            ISO_DBG("m_pED is NULL");
+            break;
+        }
+        if (m_pED->Skip()) {
+            break;
+        }
+        HCITD* blank_itd = new_HCITD(this);
+        ((HCITD *)m_pED->TailTd)->SetStartingFrame(m_FrameNumber);
+        m_FrameNumber += m_FrameCount;
+        TEST_ASSERT(blank_itd);
+        if (m_pED->enqueue<HCITD>(blank_itd)) {
+            m_itd_queue_count++;
+        }
+        enable(); // Enable Periodic
+    }
+
+    HCITD* itd = get_queue_HCITD(timeout_ms);
+    if (itd) {
+        m_itd_queue_count--;
+    }
+    return itd;
+}
+
+int IsochronousEp::isochronousSend(uint8_t* buf, int len, int timeout_ms) {
+    //ISO_DBG("buf: %p, len: %d", buf, len);
+    HCITD* itd;
+
+    if (m_itd_queue_count >= m_itd_queue_limit) {
+        itd = get_queue_HCITD(timeout_ms);
+    } else {
+        itd = get_queue_HCITD(0);
+    }
+    if (itd) {
+        delete itd;
+        m_itd_queue_count--;
+        TEST_ASSERT(m_itd_queue_count >= 0);
+    }
+    TEST_ASSERT(m_itd_queue_count >= 0);
+    if(m_itd_queue_count < m_itd_queue_limit) {
+        if (m_pED == NULL) {
+            ISO_DBG("m_pED is NULL");
+            return 0;
+        }
+        if (m_pED->Skip()) {
+            return 0;
+        }
+        itd = new_HCITD(this);
+        TEST_ASSERT(itd);
+        //ISO_DBG("m_pED: %p itd: %p", m_pED, itd);
+        ((HCITD *)m_pED->TailTd)->SetStartingFrame(m_FrameNumber);
+        m_FrameNumber += m_FrameCount;
+        memcpy(const_cast<uint8_t*>(((HCITD *)m_pED->TailTd)->buf), buf, len);
+        if (m_pED->enqueue<HCITD>(itd)) {
+            m_itd_queue_count++;
+        }
+        enable(); // Enable Periodic
+        //ISO_DBG("m_itd_queue_count: %d", m_itd_queue_count);
+        return len;
+    }
+    return 0;
+}
+
+HCITD* IsochronousEp::get_queue_HCITD(int timeout_ms) {
+    osEvent evt = m_queue.get(timeout_ms);
+    if (evt.status == osEventMessage) {
+        HCITD* itd = reinterpret_cast<HCITD*>(evt.value.p);
+        TEST_ASSERT(itd);
+        return itd;
+    }
+    return NULL;
+}
+
+void IsochronousEp::enable() {
+#if defined(TARGET_LPC1768)
+    LPC_USB->HcControl |= (OR_CONTROL_PLE | OR_CONTROL_IE);
+#elif defined(TARGET_RZ_A1H)
+    uint32_t data;
+
+    data = ohciwrapp_reg_r(OHCI_REG_CONTROL) | OR_CONTROL_PLE | OR_CONTROL_IE;
+    ohciwrapp_reg_w(OHCI_REG_CONTROL, data);
+#endif
+}
+
+void IsochronousEp::disconnect() {
+    m_pED->setSkip(); // skip bit on
+    ISO_DBG("rtos-queue: %d", m_itd_queue_count);
+    int queue_count = m_itd_queue_count;
+    Timer t;
+    t.reset();
+    t.start();
+    do {
+        HCITD* itd = get_queue_HCITD(10);
+        if (itd) {
+            ISO_DBG("delete ITD:%p from rtos-queue %d ms", itd, t.read_ms());
+            delete itd;
+            queue_count--;
+            t.reset();
+        }
+    } while(t.read_ms() < 50);
+    ISO_DBG("rtos-queue: %d, %d ms", queue_count, t.read_ms());
+    TEST_ASSERT(queue_count >= 0);
+    while(1) {
+        HCITD* itd = m_pED->dequeue<HCITD>();
+        if (itd == NULL) {
+            break;
+        }
+        ISO_DBG("delete ITD:%p from ED(%p)-queue", itd, m_pED);        
+        delete itd;
+        TEST_ASSERT(queue_count > 0);
+        queue_count--;
+    }            
+    TEST_ASSERT(queue_count == 0);
+    HCITD* tail = reinterpret_cast<HCITD*>(m_pED->TailTd);
+    ISO_DBG("delete ITD:%p from ED(%p)-tail", tail, m_pED);
+    TEST_ASSERT(tail);
+    delete tail;
+    m_pED->init_queue<HCITD>(NULL);
+    
+#if defined(TARGET_LPC1768)
+    _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
+#elif defined(TARGET_RZ_A1H)
+    _HCCA* hcca = reinterpret_cast<_HCCA*>(ohciwrapp_reg_r(OHCI_REG_HCCA));
+#endif
+    TEST_ASSERT(hcca);
+    hcca->dequeue(m_pED);
+    ISO_DBG("delete ED:%p", m_pED);
+    delete m_pED;
+    m_pED = NULL;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Doku_USBisochronous/USBIsochronous.h	Sun Oct 18 08:16:18 2015 +0000
@@ -0,0 +1,246 @@
+// USBIsochronous.h
+#pragma once
+#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
+#include <malloc.h>
+#endif
+
+class IsochronousEp;
+struct HCITD {    // HostController Isochronous Transfer Descriptor
+    __IO uint32_t Control;      // +0 Transfer descriptor control
+    uint8_t*  BufferPage0;      // +4 Buffer Page 0
+    HCITD* Next;                // +8 Physical pointer to next Isochronous Transfer Descriptor
+    uint8_t*  BufferEnd;        // +12 buffer End
+    __IO uint16_t OffsetPSW[8]; // +16 Offset/PSW
+    IsochronousEp* ep;          // +32 endpoint object
+    __IO uint8_t buf[0];        // +36 buffer
+                                // +36
+    HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize);
+
+    inline void* operator new(size_t size, int buf_size) {
+        void* p;
+//      uint32_t addr;
+#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
+        // バッファ先頭アドレスは、下位12ビットが0となっていると好都合
+        // アイソクロナスパケットが小さい間は問題が無いが、大きくなると、異常を生じる様子。
+        // 獲得されるメモリアドレスは時によるので、運がよければ動作するが、12ビットアラインにすれば、確実に動くように思われる
+        //p = memalign(32, size+buf_size);というオリジナルの記述では下位4ビットしか0になってない。
+        p = memalign(0x1000, size+buf_size);
+        return p;
+#else
+        // バッファ先頭アドレスは、下位12ビットが0となっていると好都合
+        //p = posix_memalign(&p, 32, size+buf_size);というオリジナルの記述では下位4ビットしか0になってない。
+        if (posix_memalign(&p, 0x1000, size+buf_size) == 0) {
+        //if (posix_memalign(&p, 32, size+buf_size) == 0) {
+            return p;
+        }
+        return NULL;
+#endif
+    }
+
+//    inline void* operator new(size_t size, int buf_size) {
+//        void* p;
+//#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
+//        p = memalign(32, size+buf_size);
+//        return p;
+//#else
+//        if (posix_memalign(&p, 32, size+buf_size) == 0) {
+//            return p;
+//        }
+//        return NULL;
+//#endif
+//    }
+
+    inline void operator delete(void* p) {
+        free(p);
+    }
+
+    inline uint16_t StartingFrame() {
+        return Control & 0xffff;
+    }
+
+    inline void SetStartingFrame(uint16_t FrameNumber) {
+        Control = (Control & 0xffff0000) | FrameNumber;
+    }
+
+    inline uint8_t FrameCount() {
+        return ((Control>>24)&7)+1;
+    }    
+
+    inline uint8_t ConditionCode() {
+        return Control>>28;
+    }
+};
+
+struct _HCED {    // HostController EndPoint Descriptor
+    __IO uint32_t Control; // +0 Endpoint descriptor control
+    HCTD* TailTd;          // +4 Physical address of tail in Transfer descriptor list
+    __IO HCTD* HeadTd;     // +8 Physcial address of head in Transfer descriptor list
+    _HCED* Next;           // +12 Physical address of next Endpoint descriptor
+                           // +16
+    _HCED(int addr, uint8_t ep, uint16_t size, int lowSpeed = 0) {
+        Control =  addr            | /* USB address */
+        ((ep & 0x7F) << 7)         | /* Endpoint address */
+        (ep!=0?(((ep&0x80)?2:1) << 11):0)| /* direction : Out = 1, 2 = In */
+        ((lowSpeed?1:0) << 13)     | /* speed full=0 low=1 */
+        (size << 16);                /* MaxPkt Size */
+        Next = NULL;
+    }
+
+    inline void* operator new(size_t size) {
+        void* p;
+#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
+        p = memalign(16, size);
+        return p;
+#else
+        if (posix_memalign(&p, 16, size) == 0) {
+            return p;
+        }
+        return NULL;
+#endif
+    }
+
+    inline void operator delete(void* p) {
+        free(p);
+    }
+
+    inline uint8_t FunctionAddress() {
+        return Control & 0x7f;
+    }
+
+    inline int Speed() {
+        return (Control>>13)&1;
+    }
+
+    inline void setFunctionAddress(int addr) {
+        Control &= ~0x7f;
+        Control |= addr;
+    }
+
+    inline void setMaxPacketSize(uint16_t size) {
+        Control &= ~0xffff0000;
+        Control |= size<<16;
+    }
+
+    int Skip() {
+        return (Control>>14) & 1;
+    }
+
+    void setSkip() {
+        Control |= (1<<14);
+    }
+
+    void setFormat() {
+        Control |= (1<<15);
+    }
+
+    template<typename T>
+    inline bool enqueue(T* td) {
+        if (td) {
+            T* tail = reinterpret_cast<T*>(TailTd);
+            if (tail) {
+                tail->Next = td;
+                TailTd = reinterpret_cast<HCTD*>(td);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    template<typename T>
+    inline T* dequeue() {
+        T* head = reinterpret_cast<T*>(reinterpret_cast<uint32_t>(HeadTd)&~3); // delete Halted and Toggle Carry bit
+        T* tail = reinterpret_cast<T*>(TailTd);
+        if (head == NULL || tail == NULL || head == tail) {
+            return NULL;
+        }
+        HeadTd = reinterpret_cast<HCTD*>(head->Next);
+        return head;
+    }
+    template<typename T>
+    void init_queue(T* td) {
+        TailTd = reinterpret_cast<HCTD*>(td);
+        HeadTd = reinterpret_cast<HCTD*>(td); 
+    }
+};
+
+struct _HCCA {    // Host Controller Communication Area
+    _HCED* InterruptTable[32]; // +0 Interrupt Table
+    __IO uint16_t FrameNumber;// +128 Frame Number
+    __IO uint16_t Pad1;       // +130
+    __IO HCTD* DoneHead;      // +132 Done Head
+    uint8_t Reserved[116];    // +136 Reserved for future use
+    uint8_t Unknown[4];       // +252 Unused
+                              // +256
+    inline void* operator new(size_t size) {
+        void* p;
+#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
+        p = memalign(256, size);
+        return p;
+#else
+        if (posix_memalign(&p, 256, size) == 0) {
+            return p;
+        }
+        return NULL;
+#endif
+    }
+
+    inline void operator delete(void* p) {
+        free(p);
+    }
+    
+    inline void enqueue(_HCED* ed) {
+        for(int i = 0; i < 32; i++) {
+            if (InterruptTable[i] == NULL) {
+                InterruptTable[i] = ed;
+            } else {
+                _HCED* nextEd = InterruptTable[i];
+                while(nextEd->Next && nextEd->Next != ed) {
+                    nextEd = nextEd->Next;
+                }
+                nextEd->Next = ed;
+            }
+        }
+    }
+    
+    inline void dequeue(_HCED* ed) {
+         for(int i = 0; i < 32; i++) {
+            if (InterruptTable[i] == ed) {
+                InterruptTable[i] = ed->Next;
+            } else if (InterruptTable[i]) {
+                _HCED* nextEd = InterruptTable[i];
+                while(nextEd) {
+                    if (nextEd->Next == ed) {
+                        nextEd->Next = ed->Next;
+                        break;
+                    }
+                    nextEd = nextEd->Next;
+                }
+            }
+         }
+    }
+};
+
+//doku #define HCITD_QUEUE_SIZE 3
+#define HCITD_QUEUE_SIZE 11
+
+class IsochronousEp {
+public:
+    void init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount = 4, uint8_t queueLimit = HCITD_QUEUE_SIZE);
+    void reset(int delay_ms = 100);
+    HCITD* isochronousReceive(int timeout_ms);
+    int isochronousSend(uint8_t* buf, int len, int timeout_ms);
+    HCITD* get_queue_HCITD(int timeout_ms);
+    uint16_t m_PacketSize;
+    void disconnect();
+    void irqWdhHandler(HCITD* itd) {m_queue.put(itd);} // WDH
+    int getQueueNum() {return m_itd_queue_count;}
+private:
+    HCITD* new_HCITD(IsochronousEp* obj);
+    Queue<HCITD, HCITD_QUEUE_SIZE> m_queue; // ITD done queue
+    int m_itd_queue_count;
+    int m_itd_queue_limit;
+    uint16_t m_FrameNumber;
+    int m_FrameCount; // 1-8
+    void enable();
+    _HCED* m_pED;
+};
--- a/USBHost/TARGET_RENESAS/TARGET_RZ_A1H/usb_host_setting.h	Wed Sep 30 05:52:33 2015 +0000
+++ b/USBHost/TARGET_RENESAS/TARGET_RZ_A1H/usb_host_setting.h	Sun Oct 18 08:16:18 2015 +0000
@@ -29,7 +29,7 @@
 #endif
 
 #define USB_HOST_CH                           0
-#define USB_HOST_HISPEED                      1
+#define USB_HOST_HISPEED                      0     //doku
 
 #define INT_TRANS_MAX_NUM                     4    /* min:1 max:4 */
 #define ISO_TRANS_MAX_NUM                     2    /* min:0 max:2 */
--- a/USBHost/USBHost.cpp	Wed Sep 30 05:52:33 2015 +0000
+++ b/USBHost/USBHost.cpp	Sun Oct 18 08:16:18 2015 +0000
@@ -784,8 +784,9 @@
         return res;
     }
     total_conf_descr_length = buf[2] | (buf[3] << 8);
+printf("total_conf_descr_length:%d\n",total_conf_descr_length);
     total_conf_descr_length = MIN(max_len_buf, total_conf_descr_length);
-
+printf("max_len_buf:%d\n",max_len_buf);
     if (len_conf_descr)
         *len_conf_descr = total_conf_descr_length;
 
--- a/USBHost/USBHost.h	Wed Sep 30 05:52:33 2015 +0000
+++ b/USBHost/USBHost.h	Sun Oct 18 08:16:18 2015 +0000
@@ -297,7 +297,8 @@
     Mutex td_mutex;
 
     // buffer for conf descriptor
-    uint8_t data[415];
+//doku    uint8_t data[415];
+    uint8_t data[4150];
 
     /**
     * Add a transfer on the TD linked list associated to an ED
--- a/USBisochronous/USBIsochronous.cpp	Wed Sep 30 05:52:33 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,225 +0,0 @@
-// USBIsochronous.cpp
-#include "USBHostConf.h"
-#include "USBHost.h"
-#include "USBIsochronous.h"
-#if defined(TARGET_RZ_A1H)
-#include "ohci_wrapp_RZ_A1.h"
-#endif
-
-#define  OR_CONTROL_PLE                 0x00000004
-#define  OR_CONTROL_IE                  0x00000008
-
-//#define ISO_DEBUG 1
-#ifdef ISO_DEBUG
-#define ISO_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
-#else
-#define ISO_DBG(...)  while(0);
-#endif
-
-#define TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
-
-HCITD::HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize) {
-    Control = 0xe0000000           | // CC ConditionCode NOT ACCESSED
-             ((FrameCount-1) << 24)| // FC FrameCount
-                  TD_DELAY_INT(0)  | // DI DelayInterrupt
-                 FrameNumber;        // SF StartingFrame
-    BufferPage0 = const_cast<uint8_t*>(buf);
-    BufferEnd = const_cast<uint8_t*>(buf) + PacketSize * FrameCount - 1;
-    Next = NULL; 
-    ep = obj;
-    uint32_t addr = reinterpret_cast<uint32_t>(buf);
-    for(int i = 0; i < FrameCount; i++) {
-        uint16_t offset = addr & 0x0fff;
-        if ((addr&0xfffff000) == (reinterpret_cast<uint32_t>(BufferEnd)&0xfffff000)) {
-            offset |= 0x1000;
-        }
-        OffsetPSW[i] = 0xe000|offset;
-        addr += PacketSize;
-    }
-}
-
-void IsochronousEp::init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount, uint8_t queueLimit) {
-    //ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size);
-    TEST_ASSERT(addr >= 1);    
-    TEST_ASSERT(size >= 8 && size <= 1023);
-    m_pED  = new _HCED(addr, ep, size);
-    TEST_ASSERT(m_pED);
-
-    m_pED->setFormat(); // F Format ITD
-
-    m_PacketSize = size;
-    TEST_ASSERT(frameCount >= 1 && frameCount <= 8);
-    m_FrameCount = frameCount;
-    TEST_ASSERT(queueLimit >= 1 && queueLimit <= HCITD_QUEUE_SIZE);
-    m_itd_queue_limit = queueLimit;
-
-    m_itd_queue_count = 0;
-    reset();
-    HCITD* itd = new_HCITD(this);
-    m_pED->init_queue<HCITD>(itd); 
-    TEST_ASSERT(itd);
-    if (itd == NULL) {
-        return;
-    }
-#if defined(TARGET_LPC1768)
-    _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
-#elif defined(TARGET_RZ_A1H)
-    _HCCA* hcca = reinterpret_cast<_HCCA*>(ohciwrapp_reg_r(OHCI_REG_HCCA));
-#endif
-    TEST_ASSERT(hcca);
-    if (hcca == NULL) {
-        return;
-    }
-    hcca->enqueue(m_pED);
-}
-
-void IsochronousEp::reset(int delay_ms)
-{
-#if defined(TARGET_LPC1768)
-    m_FrameNumber = LPC_USB->HcFmNumber + delay_ms;
-#elif defined(TARGET_RZ_A1H)
-    m_FrameNumber = ohciwrapp_reg_r(OHCI_REG_FMNUMBER) + delay_ms;
-#endif
-}
-
-HCITD* IsochronousEp::new_HCITD(IsochronousEp* obj) {
-    HCITD* itd = new(m_PacketSize*m_FrameCount)HCITD(obj, 0, m_FrameCount, m_PacketSize);
-    if (itd == NULL) {
-        return NULL;
-    } 
-    return itd;
-}
-
-HCITD* IsochronousEp::isochronousReceive(int timeout_ms) {
-    TEST_ASSERT(m_itd_queue_count >= 0);
-    while(m_itd_queue_count < m_itd_queue_limit) {
-        if (m_pED == NULL) {
-            ISO_DBG("m_pED is NULL");
-            break;
-        }
-        if (m_pED->Skip()) {
-            break;
-        }
-        HCITD* blank_itd = new_HCITD(this);
-        ((HCITD *)m_pED->TailTd)->SetStartingFrame(m_FrameNumber);
-        m_FrameNumber += m_FrameCount;
-        TEST_ASSERT(blank_itd);
-        if (m_pED->enqueue<HCITD>(blank_itd)) {
-            m_itd_queue_count++;
-        }
-        enable(); // Enable Periodic
-    }
-
-    HCITD* itd = get_queue_HCITD(timeout_ms);
-    if (itd) {
-        m_itd_queue_count--;
-    }
-    return itd;
-}
-
-int IsochronousEp::isochronousSend(uint8_t* buf, int len, int timeout_ms) {
-    //ISO_DBG("buf: %p, len: %d", buf, len);
-    HCITD* itd;
-
-    if (m_itd_queue_count >= m_itd_queue_limit) {
-        itd = get_queue_HCITD(timeout_ms);
-    } else {
-        itd = get_queue_HCITD(0);
-    }
-    if (itd) {
-        delete itd;
-        m_itd_queue_count--;
-        TEST_ASSERT(m_itd_queue_count >= 0);
-    }
-    TEST_ASSERT(m_itd_queue_count >= 0);
-    if(m_itd_queue_count < m_itd_queue_limit) {
-        if (m_pED == NULL) {
-            ISO_DBG("m_pED is NULL");
-            return 0;
-        }
-        if (m_pED->Skip()) {
-            return 0;
-        }
-        itd = new_HCITD(this);
-        TEST_ASSERT(itd);
-        //ISO_DBG("m_pED: %p itd: %p", m_pED, itd);
-        ((HCITD *)m_pED->TailTd)->SetStartingFrame(m_FrameNumber);
-        m_FrameNumber += m_FrameCount;
-        memcpy(const_cast<uint8_t*>(((HCITD *)m_pED->TailTd)->buf), buf, len);
-        if (m_pED->enqueue<HCITD>(itd)) {
-            m_itd_queue_count++;
-        }
-        enable(); // Enable Periodic
-        //ISO_DBG("m_itd_queue_count: %d", m_itd_queue_count);
-        return len;
-    }
-    return 0;
-}
-
-HCITD* IsochronousEp::get_queue_HCITD(int timeout_ms) {
-    osEvent evt = m_queue.get(timeout_ms);
-    if (evt.status == osEventMessage) {
-        HCITD* itd = reinterpret_cast<HCITD*>(evt.value.p);
-        TEST_ASSERT(itd);
-        return itd;
-    }
-    return NULL;
-}
-
-void IsochronousEp::enable() {
-#if defined(TARGET_LPC1768)
-    LPC_USB->HcControl |= (OR_CONTROL_PLE | OR_CONTROL_IE);
-#elif defined(TARGET_RZ_A1H)
-    uint32_t data;
-
-    data = ohciwrapp_reg_r(OHCI_REG_CONTROL) | OR_CONTROL_PLE | OR_CONTROL_IE;
-    ohciwrapp_reg_w(OHCI_REG_CONTROL, data);
-#endif
-}
-
-void IsochronousEp::disconnect() {
-    m_pED->setSkip(); // skip bit on
-    ISO_DBG("rtos-queue: %d", m_itd_queue_count);
-    int queue_count = m_itd_queue_count;
-    Timer t;
-    t.reset();
-    t.start();
-    do {
-        HCITD* itd = get_queue_HCITD(10);
-        if (itd) {
-            ISO_DBG("delete ITD:%p from rtos-queue %d ms", itd, t.read_ms());
-            delete itd;
-            queue_count--;
-            t.reset();
-        }
-    } while(t.read_ms() < 50);
-    ISO_DBG("rtos-queue: %d, %d ms", queue_count, t.read_ms());
-    TEST_ASSERT(queue_count >= 0);
-    while(1) {
-        HCITD* itd = m_pED->dequeue<HCITD>();
-        if (itd == NULL) {
-            break;
-        }
-        ISO_DBG("delete ITD:%p from ED(%p)-queue", itd, m_pED);        
-        delete itd;
-        TEST_ASSERT(queue_count > 0);
-        queue_count--;
-    }            
-    TEST_ASSERT(queue_count == 0);
-    HCITD* tail = reinterpret_cast<HCITD*>(m_pED->TailTd);
-    ISO_DBG("delete ITD:%p from ED(%p)-tail", tail, m_pED);
-    TEST_ASSERT(tail);
-    delete tail;
-    m_pED->init_queue<HCITD>(NULL);
-    
-#if defined(TARGET_LPC1768)
-    _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
-#elif defined(TARGET_RZ_A1H)
-    _HCCA* hcca = reinterpret_cast<_HCCA*>(ohciwrapp_reg_r(OHCI_REG_HCCA));
-#endif
-    TEST_ASSERT(hcca);
-    hcca->dequeue(m_pED);
-    ISO_DBG("delete ED:%p", m_pED);
-    delete m_pED;
-    m_pED = NULL;
-}
--- a/USBisochronous/USBIsochronous.h	Wed Sep 30 05:52:33 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,223 +0,0 @@
-// USBIsochronous.h
-#pragma once
-#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
-#include <malloc.h>
-#endif
-
-class IsochronousEp;
-struct HCITD {    // HostController Isochronous Transfer Descriptor
-    __IO uint32_t Control;      // +0 Transfer descriptor control
-    uint8_t*  BufferPage0;      // +4 Buffer Page 0
-    HCITD* Next;                // +8 Physical pointer to next Isochronous Transfer Descriptor
-    uint8_t*  BufferEnd;        // +12 buffer End
-    __IO uint16_t OffsetPSW[8]; // +16 Offset/PSW
-    IsochronousEp* ep;          // +32 endpoint object
-    __IO uint8_t buf[0];        // +36 buffer
-                                // +36
-    HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize);
-    inline void* operator new(size_t size, int buf_size) {
-        void* p;
-#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
-        p = memalign(32, size+buf_size);
-        return p;
-#else
-        if (posix_memalign(&p, 32, size+buf_size) == 0) {
-            return p;
-        }
-        return NULL;
-#endif
-    }
-
-    inline void operator delete(void* p) {
-        free(p);
-    }
-
-    inline uint16_t StartingFrame() {
-        return Control & 0xffff;
-    }
-
-    inline void SetStartingFrame(uint16_t FrameNumber) {
-        Control = (Control & 0xffff0000) | FrameNumber;
-    }
-
-    inline uint8_t FrameCount() {
-        return ((Control>>24)&7)+1;
-    }    
-
-    inline uint8_t ConditionCode() {
-        return Control>>28;
-    }
-};
-
-struct _HCED {    // HostController EndPoint Descriptor
-    __IO uint32_t Control; // +0 Endpoint descriptor control
-    HCTD* TailTd;          // +4 Physical address of tail in Transfer descriptor list
-    __IO HCTD* HeadTd;     // +8 Physcial address of head in Transfer descriptor list
-    _HCED* Next;           // +12 Physical address of next Endpoint descriptor
-                           // +16
-    _HCED(int addr, uint8_t ep, uint16_t size, int lowSpeed = 0) {
-        Control =  addr            | /* USB address */
-        ((ep & 0x7F) << 7)         | /* Endpoint address */
-        (ep!=0?(((ep&0x80)?2:1) << 11):0)| /* direction : Out = 1, 2 = In */
-        ((lowSpeed?1:0) << 13)     | /* speed full=0 low=1 */
-        (size << 16);                /* MaxPkt Size */
-        Next = NULL;
-    }
-
-    inline void* operator new(size_t size) {
-        void* p;
-#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
-        p = memalign(16, size);
-        return p;
-#else
-        if (posix_memalign(&p, 16, size) == 0) {
-            return p;
-        }
-        return NULL;
-#endif
-    }
-
-    inline void operator delete(void* p) {
-        free(p);
-    }
-
-    inline uint8_t FunctionAddress() {
-        return Control & 0x7f;
-    }
-
-    inline int Speed() {
-        return (Control>>13)&1;
-    }
-
-    inline void setFunctionAddress(int addr) {
-        Control &= ~0x7f;
-        Control |= addr;
-    }
-
-    inline void setMaxPacketSize(uint16_t size) {
-        Control &= ~0xffff0000;
-        Control |= size<<16;
-    }
-
-    int Skip() {
-        return (Control>>14) & 1;
-    }
-
-    void setSkip() {
-        Control |= (1<<14);
-    }
-
-    void setFormat() {
-        Control |= (1<<15);
-    }
-
-    template<typename T>
-    inline bool enqueue(T* td) {
-        if (td) {
-            T* tail = reinterpret_cast<T*>(TailTd);
-            if (tail) {
-                tail->Next = td;
-                TailTd = reinterpret_cast<HCTD*>(td);
-                return true;
-            }
-        }
-        return false;
-    }
-
-    template<typename T>
-    inline T* dequeue() {
-        T* head = reinterpret_cast<T*>(reinterpret_cast<uint32_t>(HeadTd)&~3); // delete Halted and Toggle Carry bit
-        T* tail = reinterpret_cast<T*>(TailTd);
-        if (head == NULL || tail == NULL || head == tail) {
-            return NULL;
-        }
-        HeadTd = reinterpret_cast<HCTD*>(head->Next);
-        return head;
-    }
-    template<typename T>
-    void init_queue(T* td) {
-        TailTd = reinterpret_cast<HCTD*>(td);
-        HeadTd = reinterpret_cast<HCTD*>(td); 
-    }
-};
-
-struct _HCCA {    // Host Controller Communication Area
-    _HCED* InterruptTable[32]; // +0 Interrupt Table
-    __IO uint16_t FrameNumber;// +128 Frame Number
-    __IO uint16_t Pad1;       // +130
-    __IO HCTD* DoneHead;      // +132 Done Head
-    uint8_t Reserved[116];    // +136 Reserved for future use
-    uint8_t Unknown[4];       // +252 Unused
-                              // +256
-    inline void* operator new(size_t size) {
-        void* p;
-#if !defined (__CC_ARM) && (!defined (_POSIX_C_SOURCE) || (_POSIX_C_SOURCE < 200112L))
-        p = memalign(256, size);
-        return p;
-#else
-        if (posix_memalign(&p, 256, size) == 0) {
-            return p;
-        }
-        return NULL;
-#endif
-    }
-
-    inline void operator delete(void* p) {
-        free(p);
-    }
-    
-    inline void enqueue(_HCED* ed) {
-        for(int i = 0; i < 32; i++) {
-            if (InterruptTable[i] == NULL) {
-                InterruptTable[i] = ed;
-            } else {
-                _HCED* nextEd = InterruptTable[i];
-                while(nextEd->Next && nextEd->Next != ed) {
-                    nextEd = nextEd->Next;
-                }
-                nextEd->Next = ed;
-            }
-        }
-    }
-    
-    inline void dequeue(_HCED* ed) {
-         for(int i = 0; i < 32; i++) {
-            if (InterruptTable[i] == ed) {
-                InterruptTable[i] = ed->Next;
-            } else if (InterruptTable[i]) {
-                _HCED* nextEd = InterruptTable[i];
-                while(nextEd) {
-                    if (nextEd->Next == ed) {
-                        nextEd->Next = ed->Next;
-                        break;
-                    }
-                    nextEd = nextEd->Next;
-                }
-            }
-         }
-    }
-};
-
-#define HCITD_QUEUE_SIZE 3
-
-class IsochronousEp {
-public:
-    void init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount = 4, uint8_t queueLimit = HCITD_QUEUE_SIZE);
-    void reset(int delay_ms = 100);
-    HCITD* isochronousReceive(int timeout_ms);
-    int isochronousSend(uint8_t* buf, int len, int timeout_ms);
-    HCITD* get_queue_HCITD(int timeout_ms);
-    uint16_t m_PacketSize;
-    void disconnect();
-    void irqWdhHandler(HCITD* itd) {m_queue.put(itd);} // WDH
-    int getQueueNum() {return m_itd_queue_count;}
-private:
-    HCITD* new_HCITD(IsochronousEp* obj);
-    Queue<HCITD, HCITD_QUEUE_SIZE> m_queue; // ITD done queue
-    int m_itd_queue_count;
-    int m_itd_queue_limit;
-    uint16_t m_FrameNumber;
-    int m_FrameCount; // 1-8
-    void enable();
-    _HCED* m_pED;
-};