USB Host WAN Dongle library
Fork of USBHostWANDongle_bleedingedge by
Diff: USB3GModule/WANDongle.cpp
- Revision:
- 6:075e36a3463e
- Parent:
- 4:d229ebfb85c4
- Child:
- 8:0d1ec493842c
--- a/USB3GModule/WANDongle.cpp Wed Jul 25 11:13:50 2012 +0000 +++ b/USB3GModule/WANDongle.cpp Fri Jul 27 16:14:07 2012 +0000 @@ -16,7 +16,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#define __DEBUG__ 0 //Maximum verbosity +#define __DEBUG__ 0 #ifndef __MODULE__ #define __MODULE__ "WANDongle.cpp" #endif @@ -28,7 +28,7 @@ #include "WANDongle.h" #include "WANDongleInitializer.h" -WANDongle::WANDongle() : m_serialCount(0) +WANDongle::WANDongle() : m_pInitializer(NULL), m_serialCount(0) { host = USBHost::getHostInst(); init(); @@ -41,8 +41,6 @@ bool WANDongle::tryConnect() { - bool found = false; - //FIXME should run on USB thread DBG("Trying to connect device"); @@ -50,6 +48,8 @@ if (dev_connected) { return true; } + + m_pInitializer = NULL; host->lock(); @@ -57,26 +57,26 @@ { if ((dev = host->getDevice(i)) != NULL) { - DBG("Found one device, reset it"); + m_pInitializer = NULL; //Will be set in setVidPid callback + + DBG("Found one device reset it"); host->resetDevice(dev); DBG("Enumerate"); - host->enumerate(dev); + host->enumerate(dev, this); DBG("Device has VID:%04x PID%04x", dev->getVid(), dev->getPid()); - - WANDongleInitializer** initializer = WANDongleInitializer::getInitializers(host); - - while((*initializer)) + + if(m_pInitializer) //If an initializer has been found { - DBG("*initializer=%p", *initializer); - DBG("(*initializer)->getSerialVid()=%04x", (*initializer)->getSerialVid()); - DBG("(*initializer)->getSerialPid()=%04x", (*initializer)->getSerialPid()); - if ((dev->getVid() == (*initializer)->getSerialVid()) && (dev->getPid() == (*initializer)->getSerialPid())) + DBG("m_pInitializer=%p", m_pInitializer); + DBG("m_pInitializer->getSerialVid()=%04x", m_pInitializer->getSerialVid()); + DBG("m_pInitializer->getSerialPid()=%04x", m_pInitializer->getSerialPid()); + if ((dev->getVid() == m_pInitializer->getSerialVid()) && (dev->getPid() == m_pInitializer->getSerialPid())) { DBG("The dongle is in virtual serial mode"); host->registerDriver(dev, 0, this, &WANDongle::init); - m_serialCount = (*initializer)->getSerialPortCount(); + m_serialCount = m_pInitializer->getSerialPortCount(); if( m_serialCount > WANDONGLE_MAX_SERIAL_PORTS ) { m_serialCount = WANDONGLE_MAX_SERIAL_PORTS; @@ -84,9 +84,9 @@ for(int j = 0; j < m_serialCount; j++) { DBG("Connecting serial port #%d", j+1); - DBG("Ep %p", (*initializer)->getEp(dev, j, false)); - DBG("Ep %p", (*initializer)->getEp(dev, j, true)); - m_serial[j].connect( dev, (*initializer)->getEp(dev, j, false), (*initializer)->getEp(dev, j, true) ); + DBG("Ep %p", m_pInitializer->getEp(dev, j, false)); + DBG("Ep %p", m_pInitializer->getEp(dev, j, true)); + m_serial[j].connect( dev, m_pInitializer->getEp(dev, j, false), m_pInitializer->getEp(dev, j, true) ); } DBG("Device connected"); @@ -97,11 +97,11 @@ return true; } - else if ((dev->getVid() == (*initializer)->getMSDVid()) && (dev->getPid() == (*initializer)->getMSDPid())) + else if ((dev->getVid() == m_pInitializer->getMSDVid()) && (dev->getPid() == m_pInitializer->getMSDPid())) { DBG("Vodafone K3370 dongle detected in MSD mode"); //Try to switch - if( (*initializer)->switchMode(dev) ) + if( m_pInitializer->switchMode(dev) ) { DBG("Switched OK"); host->unlock(); @@ -114,8 +114,7 @@ return false; } } - (*initializer)++; - } //while() + } //if() } //if() } //for() host->unlock(); @@ -141,3 +140,58 @@ m_serial[i].init(host); } } + + +/*virtual*/ void WANDongle::setVidPid(uint16_t vid, uint16_t pid) +{ + //Load right initializer + WANDongleInitializer** initializer = WANDongleInitializer::getInitializers(host); + + while((*initializer)) + { + DBG("*initializer=%p", *initializer); + DBG("(*initializer)->getSerialVid()=%04x", (*initializer)->getSerialVid()); + DBG("(*initializer)->getSerialPid()=%04x", (*initializer)->getSerialPid()); + if ((dev->getVid() == (*initializer)->getSerialVid()) && (dev->getPid() == (*initializer)->getSerialPid())) + { + DBG("The dongle is in virtual serial mode"); + m_pInitializer = *initializer; + break; + } + else if ((dev->getVid() == (*initializer)->getMSDVid()) && (dev->getPid() == (*initializer)->getMSDPid())) + { + DBG("Vodafone K3370 dongle detected in MSD mode"); + m_pInitializer = *initializer; + break; + } + (*initializer)++; + } //while() + if(m_pInitializer) + { + m_pInitializer->setVidPid(vid, pid); + } +} + +/*virtual*/ bool WANDongle::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed +{ + if(m_pInitializer) + { + return m_pInitializer->parseInterface(intf_nb, intf_class, intf_subclass, intf_protocol); + } + else + { + return false; + } +} + +/*virtual*/ bool WANDongle::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used +{ + if(m_pInitializer) + { + return m_pInitializer->useEndpoint(intf_nb, type, dir); + } + else + { + return false; + } +}