![](/media/cache/profiles/f095cedd23b99f1696fc8caecbcf257e.jpg.50x50_q85.jpg)
see: http://mbed.org/users/okini3939/notebook/wifi_webcam/
Dependencies: GSwifiInterface_ap_webcam USBHost mbed
USBHostC270/BaseUvc.cpp@0:8558bdecb0fa, 2014-06-06 (annotated)
- Committer:
- okini3939
- Date:
- Fri Jun 06 00:44:06 2014 +0000
- Revision:
- 0:8558bdecb0fa
1st build
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:8558bdecb0fa | 1 | // BaseUvc.cpp |
okini3939 | 0:8558bdecb0fa | 2 | #include "USBHostConf.h" |
okini3939 | 0:8558bdecb0fa | 3 | #include "USBHost.h" |
okini3939 | 0:8558bdecb0fa | 4 | #include "USBIsochronous.h" |
okini3939 | 0:8558bdecb0fa | 5 | #include "BaseUvc.h" |
okini3939 | 0:8558bdecb0fa | 6 | |
okini3939 | 0:8558bdecb0fa | 7 | void BaseUvc::poll(int millisec) |
okini3939 | 0:8558bdecb0fa | 8 | { |
okini3939 | 0:8558bdecb0fa | 9 | HCITD* itd = m_isoEp->isochronousReceive(millisec); |
okini3939 | 0:8558bdecb0fa | 10 | if (itd) { |
okini3939 | 0:8558bdecb0fa | 11 | uint8_t cc = itd->ConditionCode(); |
okini3939 | 0:8558bdecb0fa | 12 | report_cc_count[cc]++; |
okini3939 | 0:8558bdecb0fa | 13 | if (cc == 0) { |
okini3939 | 0:8558bdecb0fa | 14 | uint16_t frame = itd->StartingFrame(); |
okini3939 | 0:8558bdecb0fa | 15 | int fc = itd->FrameCount(); |
okini3939 | 0:8558bdecb0fa | 16 | uint8_t* buf = const_cast<uint8_t*>(itd->buf); |
okini3939 | 0:8558bdecb0fa | 17 | int mps = m_isoEp->m_PacketSize; |
okini3939 | 0:8558bdecb0fa | 18 | for(int i = 0; i < fc; i++) { |
okini3939 | 0:8558bdecb0fa | 19 | uint16_t psw = itd->OffsetPSW[i]; |
okini3939 | 0:8558bdecb0fa | 20 | cc = psw>>12; |
okini3939 | 0:8558bdecb0fa | 21 | if (cc == 0 || cc == 9) { |
okini3939 | 0:8558bdecb0fa | 22 | int len = psw & 0x7ff; |
okini3939 | 0:8558bdecb0fa | 23 | onResult(frame, buf, len); |
okini3939 | 0:8558bdecb0fa | 24 | } |
okini3939 | 0:8558bdecb0fa | 25 | report_ps_cc_count[cc]++; |
okini3939 | 0:8558bdecb0fa | 26 | buf += mps; |
okini3939 | 0:8558bdecb0fa | 27 | frame++; |
okini3939 | 0:8558bdecb0fa | 28 | } |
okini3939 | 0:8558bdecb0fa | 29 | } |
okini3939 | 0:8558bdecb0fa | 30 | delete itd; |
okini3939 | 0:8558bdecb0fa | 31 | } |
okini3939 | 0:8558bdecb0fa | 32 | } |
okini3939 | 0:8558bdecb0fa | 33 | |
okini3939 | 0:8558bdecb0fa | 34 | USB_TYPE BaseUvc::Control(int req, int cs, int index, uint8_t* buf, int size) |
okini3939 | 0:8558bdecb0fa | 35 | { |
okini3939 | 0:8558bdecb0fa | 36 | if (req == SET_CUR) { |
okini3939 | 0:8558bdecb0fa | 37 | return host->controlWrite(dev, |
okini3939 | 0:8558bdecb0fa | 38 | USB_HOST_TO_DEVICE | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, |
okini3939 | 0:8558bdecb0fa | 39 | req, cs<<8, index, buf, size); |
okini3939 | 0:8558bdecb0fa | 40 | } |
okini3939 | 0:8558bdecb0fa | 41 | return host->controlRead(dev, |
okini3939 | 0:8558bdecb0fa | 42 | USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE, |
okini3939 | 0:8558bdecb0fa | 43 | req, cs<<8, index, buf, size); |
okini3939 | 0:8558bdecb0fa | 44 | } |
okini3939 | 0:8558bdecb0fa | 45 | |
okini3939 | 0:8558bdecb0fa | 46 | USB_TYPE BaseUvc::setInterfaceAlternate(uint8_t intf, uint8_t alt) |
okini3939 | 0:8558bdecb0fa | 47 | { |
okini3939 | 0:8558bdecb0fa | 48 | return host->controlWrite(dev, USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, |
okini3939 | 0:8558bdecb0fa | 49 | SET_INTERFACE, alt, intf, NULL, 0); |
okini3939 | 0:8558bdecb0fa | 50 | } |
okini3939 | 0:8558bdecb0fa | 51 | |
okini3939 | 0:8558bdecb0fa | 52 | void BaseUvc::onResult(uint16_t frame, uint8_t* buf, int len) |
okini3939 | 0:8558bdecb0fa | 53 | { |
okini3939 | 0:8558bdecb0fa | 54 | if(m_pCbItem && m_pCbMeth) |
okini3939 | 0:8558bdecb0fa | 55 | (m_pCbItem->*m_pCbMeth)(frame, buf, len); |
okini3939 | 0:8558bdecb0fa | 56 | else if(m_pCb) |
okini3939 | 0:8558bdecb0fa | 57 | m_pCb(frame, buf, len); |
okini3939 | 0:8558bdecb0fa | 58 | } |
okini3939 | 0:8558bdecb0fa | 59 | |
okini3939 | 0:8558bdecb0fa | 60 | void BaseUvc::setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) ) |
okini3939 | 0:8558bdecb0fa | 61 | { |
okini3939 | 0:8558bdecb0fa | 62 | m_pCb = pMethod; |
okini3939 | 0:8558bdecb0fa | 63 | m_pCbItem = NULL; |
okini3939 | 0:8558bdecb0fa | 64 | m_pCbMeth = NULL; |
okini3939 | 0:8558bdecb0fa | 65 | } |
okini3939 | 0:8558bdecb0fa | 66 | |
okini3939 | 0:8558bdecb0fa | 67 | void BaseUvc::clearOnResult() |
okini3939 | 0:8558bdecb0fa | 68 | { |
okini3939 | 0:8558bdecb0fa | 69 | m_pCb = NULL; |
okini3939 | 0:8558bdecb0fa | 70 | m_pCbItem = NULL; |
okini3939 | 0:8558bdecb0fa | 71 | m_pCbMeth = NULL; |
okini3939 | 0:8558bdecb0fa | 72 | } |
okini3939 | 0:8558bdecb0fa | 73 | |
okini3939 | 0:8558bdecb0fa | 74 |