supported GR-PEACH original: http://developer.mbed.org/users/va009039/code/USBHostC270_example/ The function of Isochronous has moved to USBHost_AddIso library.

Dependencies:   USBHost_custom_Addiso

Fork of USBHostC270_example_GR-PEACH by GR-PEACH_producer_meeting

Files at this revision

API Documentation at this revision

Comitter:
dkato
Date:
Wed Apr 01 05:46:06 2015 +0000
Parent:
12:ea4badc78215
Child:
14:7d4864959eb7
Commit message:
The function of Isochronous has moved to USBHost_AddIso library.

Changed in this revision

USBHost.lib Show diff for this revision Revisions of this file
USBHostC270/USBHostC270.cpp Show annotated file Show diff for this revision Revisions of this file
USBHostC270/USBisochronous/USBIsochronous.cpp Show diff for this revision Revisions of this file
USBHostC270/USBisochronous/USBIsochronous.h Show diff for this revision Revisions of this file
USBHostCam/USBHostCam.cpp Show annotated file Show diff for this revision Revisions of this file
USBHost_AddIso.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/USBHost.lib	Wed Mar 20 14:28:39 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/va009039/code/USBHost/#a338d6a681fb
--- a/USBHostC270/USBHostC270.cpp	Wed Mar 20 14:28:39 2013 +0000
+++ b/USBHostC270/USBHostC270.cpp	Wed Apr 01 05:46:06 2015 +0000
@@ -75,8 +75,6 @@
                     report_cc_count[i] = 0;
                     report_ps_cc_count[i] = 0;
                 }
-                LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable
-                LPC_USB->HcControl |= OR_CONTROL_IE;  // IsochronousEnable
 
                 dev_connected = true;
                 return true;
--- a/USBHostC270/USBisochronous/USBIsochronous.cpp	Wed Mar 20 14:28:39 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-// USBIsochronous.cpp
-#include "USBHostConf.h"
-#include "USBHost.h"
-#include "USBIsochronous.h"
-
-//#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
-
-    TEST_ASSERT(size >= 128 && size <= 1023);
-    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;
-    }
-    _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
-    TEST_ASSERT(hcca);
-    if (hcca == NULL) {
-        return;
-    }
-    hcca->enqueue(m_pED);
-}
-
-void IsochronousEp::reset(int delay_ms)
-{
-    m_FrameNumber = LPC_USB->HcFmNumber + delay_ms;
-}
-
-HCITD* IsochronousEp::new_HCITD(IsochronousEp* obj)
-{
-    HCITD* itd = new(m_PacketSize*m_FrameCount)HCITD(obj, m_FrameNumber, m_FrameCount, m_PacketSize);
-    if (itd == NULL) {
-        return NULL;
-    } 
-    m_FrameNumber += m_FrameCount;
-    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);
-        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 = get_queue_HCITD(timeout_ms);
-    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);
-        memcpy(const_cast<uint8_t*>(itd->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)
-{
-    Timer t;
-    t.reset();
-    t.start();
-    do {
-        osEvent evt = m_queue.get(0);
-        if (evt.status == osEventMessage) {
-            HCITD* itd = reinterpret_cast<HCITD*>(evt.value.p);
-            TEST_ASSERT(itd);
-            return itd;
-        } else if (evt.status == osOK) {
-            ;
-        } else if (evt.status == osEventTimeout) {
-            break;
-        } else {
-            ISO_DBG("evt.status: %02x\n", evt.status);
-            TEST_ASSERT(evt.status == osEventMessage);
-            break;
-        }
-    } while(t.read_ms() < timeout_ms);
-    return NULL;
-}
-
-void IsochronousEp::enable()
-{
-    LPC_USB->HcControl |= OR_CONTROL_PLE;
-}
-
-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);
-    
-    _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA);
-    TEST_ASSERT(hcca);
-    hcca->dequeue(m_pED);
-    ISO_DBG("delete ED:%p", m_pED);
-    delete m_pED;
-    m_pED = NULL;
-}
--- a/USBHostC270/USBisochronous/USBIsochronous.h	Wed Mar 20 14:28:39 2013 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-// USBIsochronous.h
-#pragma once
-
-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 (posix_memalign(&p, 32, size+buf_size) == 0) {
-            return p;
-        }
-        return NULL;
-    }
-
-    inline void operator delete(void* p) {
-        free(p);
-    }
-
-    inline uint16_t StartingFrame() {
-        return Control & 0xffff;
-    }
-
-    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 (posix_memalign(&p, 16, size) == 0) {
-            return p;
-        }
-        return NULL;
-    }
-
-    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 (posix_memalign(&p, 256, size) == 0) {
-            return p;
-        }
-        return NULL;
-    }
-
-    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
-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/USBHostCam/USBHostCam.cpp	Wed Mar 20 14:28:39 2013 +0000
+++ b/USBHostCam/USBHostCam.cpp	Wed Apr 01 05:46:06 2015 +0000
@@ -82,8 +82,6 @@
                     report_cc_count[i] = 0;
                     report_ps_cc_count[i] = 0;
                 }
-                LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable
-                LPC_USB->HcControl |= OR_CONTROL_IE;  // IsochronousEnable
 
                 dev_connected = true;
                 return true;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBHost_AddIso.lib	Wed Apr 01 05:46:06 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/GR-PEACH_producer_meeting/code/USBHost_AddIso/#2851a9b2bbfb
--- a/main.cpp	Wed Mar 20 14:28:39 2013 +0000
+++ b/main.cpp	Wed Apr 01 05:46:06 2015 +0000
@@ -4,13 +4,14 @@
 Serial pc(USBTX, USBRX);
 BusOut leds(LED1, LED2, LED3);
 
+static uint8_t buf[1024*10];
+
 int main() {
     pc.baud(921600);
 
     USBHostMSD* msd = new USBHostMSD("usb"); // USB flash drive
     USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_160x120, _5FPS); // Logitech C270
 
-    uint8_t buf[1024*3];
     Timer interval_t;
     interval_t.reset();
     interval_t.start();
--- a/mbed.bld	Wed Mar 20 14:28:39 2013 +0000
+++ b/mbed.bld	Wed Apr 01 05:46:06 2015 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/5e5da4a5990b
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/487b796308b0
\ No newline at end of file