USB host library, support isochronous,bulk,interrupt and control.

Dependents:   BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BaseUsbHostUvc.cpp Source File

BaseUsbHostUvc.cpp

00001 // BaseUsbHostUvc.cpp 2013/1/11
00002 #include "mbed.h"
00003 #include "rtos.h"
00004 #include "BaseUsbHost.h"
00005 #define DEBUG
00006 #include "BaseUsbHostDebug.h"
00007 #define TEST
00008 #include "BaseUsbHostTest.h"
00009 
00010 void BaseUvc::poll(int millisec)
00011 {
00012     HCITD* itd = m_isoEp->isochronousReveive(millisec);
00013     if (itd) {
00014         uint8_t cc = itd->ConditionCode();
00015         report_cc_count[cc]++;
00016         if (cc == 0) {
00017             uint16_t frame = itd->StartingFrame();
00018             int fc = itd->FrameCount();
00019             uint8_t* buf = const_cast<uint8_t*>(itd->buf); 
00020             int mps = m_isoEp->m_PacketSize;
00021             for(int i = 0; i < fc; i++) {
00022                 uint16_t psw = itd->OffsetPSW[i];
00023                 cc = psw>>12;
00024                 if (cc == 0 || cc == 9) {
00025                     int len = psw & 0x7ff;
00026                     onResult(frame, buf, len);
00027                }
00028                report_ps_cc_count[cc]++;
00029                buf += mps;
00030                frame++;
00031             }
00032         }
00033         delete itd;
00034     }
00035 }
00036 
00037 int BaseUvc::Control(int req, int cs, int index, uint8_t* buf, int size)
00038 {
00039     TEST_ASSERT(m_ctlEp);
00040     if (m_ctlEp == NULL) {
00041         return USB_ERROR;
00042     }
00043     int rc;
00044     if (req == SET_CUR) {    
00045         rc = m_ctlEp->controlSend(
00046                     USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, 
00047                     req, cs<<8, index, buf, size);
00048         return rc;
00049     }
00050     rc = m_ctlEp->controlReceive(
00051                 USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, 
00052                 req, cs<<8, index, buf, size);
00053     return rc;
00054 }
00055 
00056 void BaseUvc::onResult(uint16_t frame, uint8_t* buf, int len)
00057 {
00058   if(m_pCbItem && m_pCbMeth)
00059     (m_pCbItem->*m_pCbMeth)(frame, buf, len);
00060   else if(m_pCb)
00061     m_pCb(frame, buf, len);
00062 }
00063 
00064 void BaseUvc::setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) )
00065 {
00066     m_pCb = pMethod;
00067     m_pCbItem = NULL;
00068     m_pCbMeth = NULL;
00069 }
00070     
00071 void BaseUvc::clearOnResult()
00072 {
00073     m_pCb = NULL;
00074     m_pCbItem = NULL;
00075     m_pCbMeth = NULL;
00076 }