This my big project for PYRN Board
Dependencies: CAN HTTPClient MODSERIAL MyThings Pyrn3GModem Socket TinyGPS MyUSBHost lwip-sys lwip mbed-rtos mbed-src
HuaweiE372DongleInitializer.cpp@0:efe6085327fd, 2015-04-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |