USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

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;
+  }
+}