This my big project for PYRN Board

Dependencies:   CAN HTTPClient MODSERIAL MyThings Pyrn3GModem Socket TinyGPS MyUSBHost lwip-sys lwip mbed-rtos mbed-src

Committer:
clemounet
Date:
Tue Apr 14 13:30:02 2015 +0000
Revision:
0:efe6085327fd
All the projet PYRN 3G-CAN-ACC...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
clemounet 0:efe6085327fd 1
clemounet 0:efe6085327fd 2 #include "HuaweiE372DongleInitializer.h"
clemounet 0:efe6085327fd 3
clemounet 0:efe6085327fd 4 #define __DEBUG__ 5
clemounet 0:efe6085327fd 5 #ifndef __MODULE__
clemounet 0:efe6085327fd 6 #define __MODULE__ "MyThread.cpp"
clemounet 0:efe6085327fd 7 #endif
clemounet 0:efe6085327fd 8 #include "MyDebug.h"
clemounet 0:efe6085327fd 9
clemounet 0:efe6085327fd 10 #define VENDSPEC_CLASS 0xFF
clemounet 0:efe6085327fd 11
clemounet 0:efe6085327fd 12 //Huawei E372 (Vodafone)
clemounet 0:efe6085327fd 13
clemounet 0:efe6085327fd 14 // switch string => "55 53 42 43 00 00 00 00 00 00 00 00 00 00 00 11 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00"
clemounet 0:efe6085327fd 15 static uint8_t huawei_E372_switch_packet[] = {
clemounet 0:efe6085327fd 16 0x55, 0x53, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
clemounet 0:efe6085327fd 17 0x11, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
clemounet 0:efe6085327fd 18 0x00
clemounet 0:efe6085327fd 19 };
clemounet 0:efe6085327fd 20
clemounet 0:efe6085327fd 21 HuaweiE372DongleInitializer::HuaweiE372DongleInitializer(USBHost *h): WANDongleInitializer(h) {
clemounet 0:efe6085327fd 22
clemounet 0:efe6085327fd 23 }
clemounet 0:efe6085327fd 24
clemounet 0:efe6085327fd 25 bool HuaweiE372DongleInitializer::switchMode(USBDeviceConnected* pDev) {
clemounet 0:efe6085327fd 26 for (int i = 0; i < pDev->getNbIntf(); i++) {
clemounet 0:efe6085327fd 27 if (pDev->getInterface(i)->intf_class == MSD_CLASS) {
clemounet 0:efe6085327fd 28 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
clemounet 0:efe6085327fd 29 if ( pEp != NULL ) {
clemounet 0:efe6085327fd 30 USB_DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
clemounet 0:efe6085327fd 31 m_pHost->bulkWrite(pDev, pEp, huawei_E372_switch_packet, 31);
clemounet 0:efe6085327fd 32 return true;
clemounet 0:efe6085327fd 33 }
clemounet 0:efe6085327fd 34 }
clemounet 0:efe6085327fd 35 }
clemounet 0:efe6085327fd 36 return false;
clemounet 0:efe6085327fd 37 }
clemounet 0:efe6085327fd 38
clemounet 0:efe6085327fd 39 USBEndpoint* HuaweiE372DongleInitializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx) {
clemounet 0:efe6085327fd 40 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx ? OUT : IN, 0);
clemounet 0:efe6085327fd 41 }
clemounet 0:efe6085327fd 42
clemounet 0:efe6085327fd 43 void HuaweiE372DongleInitializer::setVidPid(uint16_t vid, uint16_t pid) {
clemounet 0:efe6085327fd 44 if( (vid == getSerialVid()) && (pid == getSerialPid()) ) {
clemounet 0:efe6085327fd 45 m_hasSwitched = true;
clemounet 0:efe6085327fd 46 m_currentSerialIntf = 0;
clemounet 0:efe6085327fd 47 m_endpointsToFetch = 4*2;
clemounet 0:efe6085327fd 48 } else {
clemounet 0:efe6085327fd 49 m_hasSwitched = false;
clemounet 0:efe6085327fd 50 m_endpointsToFetch = 1;
clemounet 0:efe6085327fd 51 }
clemounet 0:efe6085327fd 52 }
clemounet 0:efe6085327fd 53
clemounet 0:efe6085327fd 54 bool HuaweiE372DongleInitializer::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) {
clemounet 0:efe6085327fd 55 if( m_hasSwitched ) {
clemounet 0:efe6085327fd 56 USB_DBG("Interface #%d; Class:%02x; SubClass:%02x; Protocol:%02x", intf_nb, intf_class, intf_subclass, intf_protocol);
clemounet 0:efe6085327fd 57 if( intf_class == VENDSPEC_CLASS ) {
clemounet 0:efe6085327fd 58 // The first 4 Interfaces are parsable.
clemounet 0:efe6085327fd 59 if( m_currentSerialIntf <4 ) {
clemounet 0:efe6085327fd 60 m_currentSerialIntf++;
clemounet 0:efe6085327fd 61 return true;
clemounet 0:efe6085327fd 62 }
clemounet 0:efe6085327fd 63 m_currentSerialIntf++;
clemounet 0:efe6085327fd 64 }
clemounet 0:efe6085327fd 65 } else {
clemounet 0:efe6085327fd 66 // The first 2 Interface are parsable.
clemounet 0:efe6085327fd 67 if( ((intf_nb == 0) || (intf_nb == 1)) && (intf_class == MSD_CLASS) ) {
clemounet 0:efe6085327fd 68 return true;
clemounet 0:efe6085327fd 69 }
clemounet 0:efe6085327fd 70 }
clemounet 0:efe6085327fd 71 return false;
clemounet 0:efe6085327fd 72 }
clemounet 0:efe6085327fd 73
clemounet 0:efe6085327fd 74 bool HuaweiE372DongleInitializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) {//Must return true if the endpoint will be used
clemounet 0:efe6085327fd 75 if( m_hasSwitched ) {
clemounet 0:efe6085327fd 76 USB_DBG("USBEndpoint on Inteface #%d; Type:%d; Direction:%d", intf_nb, type, dir);
clemounet 0:efe6085327fd 77 if( (type == BULK_ENDPOINT) && m_endpointsToFetch ) {
clemounet 0:efe6085327fd 78 m_endpointsToFetch--;
clemounet 0:efe6085327fd 79 return true;
clemounet 0:efe6085327fd 80 }
clemounet 0:efe6085327fd 81 } else {
clemounet 0:efe6085327fd 82 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch ) {
clemounet 0:efe6085327fd 83 m_endpointsToFetch--;
clemounet 0:efe6085327fd 84 return true;
clemounet 0:efe6085327fd 85 }
clemounet 0:efe6085327fd 86 }
clemounet 0:efe6085327fd 87 return false;
clemounet 0:efe6085327fd 88 }