UVC host library

Dependents:   LifeCam WebcamServer

Committer:
va009039
Date:
Wed Aug 15 13:52:53 2012 +0000
Revision:
3:3eb41d749f9a
Parent:
0:b0f04c137829
add USB_USE_MALLOC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:b0f04c137829 1 #include "UsbHostMgr.h"
va009039 0:b0f04c137829 2 //#define __DEBUG
va009039 0:b0f04c137829 3 #include "mydbg.h"
va009039 0:b0f04c137829 4
va009039 0:b0f04c137829 5 UsbDevice* UsbHostMgr::getDeviceByClass(uint8_t IfClass, int count)
va009039 0:b0f04c137829 6 {
va009039 0:b0f04c137829 7 DBG("IfClass=%02X count=%d\n", IfClass, count);
va009039 0:b0f04c137829 8 for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) {
va009039 0:b0f04c137829 9 UsbDevice* dev = m_lpDevices[i];
va009039 0:b0f04c137829 10 if (dev) {
va009039 0:b0f04c137829 11 if(dev->m_connected && dev->m_enumerated) {
va009039 0:b0f04c137829 12 if (dev->m_InterfaceClass == IfClass) { // found
va009039 0:b0f04c137829 13 if (count-- <= 0) {
va009039 0:b0f04c137829 14 return dev;
va009039 0:b0f04c137829 15 }
va009039 0:b0f04c137829 16 }
va009039 0:b0f04c137829 17 }
va009039 0:b0f04c137829 18 }
va009039 0:b0f04c137829 19 }
va009039 0:b0f04c137829 20 return NULL;
va009039 0:b0f04c137829 21 }
va009039 0:b0f04c137829 22
va009039 0:b0f04c137829 23 UsbDevice* UsbHostMgr::getDeviceByVidPid(uint16_t vid, uint16_t pid, int count)
va009039 0:b0f04c137829 24 {
va009039 0:b0f04c137829 25 for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) {
va009039 0:b0f04c137829 26 UsbDevice* dev = m_lpDevices[i];
va009039 0:b0f04c137829 27 if (dev) {
va009039 0:b0f04c137829 28 if(dev->m_connected && dev->m_enumerated) {
va009039 0:b0f04c137829 29 if (dev->m_vid == vid && dev->m_pid == pid) { // found
va009039 0:b0f04c137829 30 if (count-- <= 0) {
va009039 0:b0f04c137829 31 return dev;
va009039 0:b0f04c137829 32 }
va009039 0:b0f04c137829 33 }
va009039 0:b0f04c137829 34 }
va009039 0:b0f04c137829 35 }
va009039 0:b0f04c137829 36 }
va009039 0:b0f04c137829 37 return NULL;
va009039 0:b0f04c137829 38 }
va009039 0:b0f04c137829 39
va009039 0:b0f04c137829 40 void UsbHostMgr::onUsbDeviceConnected(int hub, int port, bool low_speed)
va009039 0:b0f04c137829 41 {
va009039 0:b0f04c137829 42 DBG("%p hub=%d port=%d %s\n", this, hub, port, low_speed ? "slow" : "full");
va009039 0:b0f04c137829 43 for(int i = 0; i < USB_HOSTMGR_MAX_DEVS; i++) {
va009039 0:b0f04c137829 44 UsbDevice* dev = m_lpDevices[i];
va009039 0:b0f04c137829 45 if (dev) {
va009039 0:b0f04c137829 46 if (dev->m_hub == hub && dev->m_port == port) { // skip
va009039 0:b0f04c137829 47 return;
va009039 0:b0f04c137829 48 }
va009039 0:b0f04c137829 49 }
va009039 0:b0f04c137829 50 }
va009039 0:b0f04c137829 51
va009039 0:b0f04c137829 52 int item = devicesCount();
va009039 0:b0f04c137829 53 DBG_ASSERT(item < USB_HOSTMGR_MAX_DEVS);
va009039 0:b0f04c137829 54 if( item == USB_HOSTMGR_MAX_DEVS )
va009039 0:b0f04c137829 55 return; //List full...
va009039 0:b0f04c137829 56 //Find a free address (not optimized, but not really important)
va009039 0:b0f04c137829 57 int addr = 1;
va009039 0:b0f04c137829 58 for(int i = 0; i < item; i++)
va009039 0:b0f04c137829 59 {
va009039 0:b0f04c137829 60 DBG_ASSERT(m_lpDevices[i]);
va009039 0:b0f04c137829 61 addr = MAX( addr, m_lpDevices[i]->m_addr + 1 );
va009039 0:b0f04c137829 62 }
va009039 0:b0f04c137829 63 DBG("item=%d addr=%d\n", item, addr);
va009039 0:b0f04c137829 64 UsbDevice* dev = new UsbDevice( this, hub, port, addr , low_speed);
va009039 0:b0f04c137829 65 DBG_ASSERT(dev);
va009039 0:b0f04c137829 66 dev->m_connected = true;
va009039 0:b0f04c137829 67 m_lpDevices[item] = dev;
va009039 0:b0f04c137829 68 }