Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Need to write a small code to switch USB Dongle to modem mode

Status
Not open for further replies.

ElMobd3

Newbie level 6
Newbie level 6
Joined
Dec 8, 2012
Messages
12
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Visit site
Activity points
1,375
Hello All,
I'm trying to connect a USB Dongle to Arduino Mega, everything okay but there is a little problem.

My USB Modem Huawei k3770 has 2 modes Mass storage mode that's the initial and modem mode
when I plug it to my PC it's shown as Mass storage to get driver and the dashboard .. etc after installing it the modem mode will be shown to get connection.

to connect it to my usb host shield I need firstly to do mode switch
By examine the usbmodeswitch debug log in a linux system I found the required details
Code:
DefaultVendor= 0x12d1
DefaultProduct= 0x14d1
TargetVendor= 0x12d1
TargetProduct= 0x14c9
TargetClass= not set
TargetProductList=""

DetachStorageOnly=0
HuaweiMode=0
SierraMode=0
SonyMode=0
QisdaMode=0
GCTMode=0
KobilMode=0
SequansMode=0
MobileActionMode=0
CiscoMode=0
MessageEndpoint= not set
MessageContent="55534243123456780000000000000011062000000100000000000000000000"

so I think the important details is
DefaultVendor= 0x12d1
DefaultProduct= 0x14d1
TargetVendor= 0x12d1
TargetProduct= 0x14c9
MessageContent="55534243123456780000000000000011062000000100000000000000000000"


but unfortunately I don't know how I can use these details with my software
Could anyone tell me how I can make some coding in my software to switch Huawei k3770 to modem mode firstly before I sent AT Commands?

Thanks in advance,
Karim
 

did you mean these data

Code:
Device descriptor: 
Descriptor Length:	12
Descriptor type:	01
USB version:		0200
Device class:		00
Device Subclass:	00
Device Protocol:	00
Max.packet size:	40
Vendor  ID:		12D1
Product ID:		1001
Revision ID:		0000
Mfg.string index:	03
Prod.string index:	02
Serial number index:	00
Number of conf.:	01

Configuration descriptor:
Total length:		0055
Num.intf:		03
Conf.value:		01
Conf.string:		01
Attr.:			E0
Max.pwr:		FA

Interface descriptor:
Intf.number:		00
Alt.:			00
Endpoints:		03
Intf. Class:		FF
Intf. Subclass:		FF
Intf. Protocol:		FF
Intf.string:		00

Endpoint descriptor:
Endpoint address:	81
Attr.:			03
Max.pkt size:		0040
Polling interval:	05

Endpoint descriptor:
Endpoint address:	82
Attr.:			02
Max.pkt size:		0040
Polling interval:	20

Endpoint descriptor:
Endpoint address:	01
Attr.:			02
Max.pkt size:		0040
Polling interval:	20

Interface descriptor:
Intf.number:		01
Alt.:			00
Endpoints:		02
Intf. Class:		FF
Intf. Subclass:		FF
Intf. Protocol:		FF
Intf.string:		00

Endpoint descriptor:
Endpoint address:	83
Attr.:			02
Max.pkt size:		0040
Polling interval:	20

Endpoint descriptor:
Endpoint address:	02
Attr.:			02
Max.pkt size:		0040
Polling interval:	20

Interface descriptor:
Intf.number:		02
Alt.:			00
Endpoints:		02
Intf. Class:		FF
Intf. Subclass:		FF
Intf. Protocol:		FF
Intf.string:		00

Endpoint descriptor:
Endpoint address:	84
Attr.:			02
Max.pkt size:		0040
Polling interval:	20

Endpoint descriptor:
Endpoint address:	03
Attr.:			02
Max.pkt size:		0040
Polling interval:	20
 

Two points:

- I presume, the Huawaei GSM stick is just an USB combo device, combining a mass-storage device and a communication controller or vendor-specific device class. A respective USB driver is required to access the modem functionality. The mass storage device is provided to allow a comfortable driver installation on PCs.

- Arduino Mega exposes an USB device interface. You can't connect other USB devices to it, neither mass-storage nor communication devices.
 

@FvM & jayanth.devarayanadurga , Thanks for your reply,

Sorry I forgot to tell you that I'm using USB Host shield (which depend on MAX3421E).
and I'm knowing about the USB stick it's a combo device contain Modem & CD & Card Reader devices
I have found that AT^U2DIAG=0 runs the USB Stick in the Modem Mode only
I used putty(an app like Hyperterminal) and sent AT^U2DIAG=0 so the USB Stick runs now in the Modem Mode only

As I explained earlier, I'm using Arduino Mega and trying to modify this example to get my modem work

Code:
/* Arduino terminal for PL2303 USB to serial converter and DealeXtreme GPRS modem. */
/* USB support */
#include <avrpins.h>
#include <max3421e.h>
#include <usbhost.h>
#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
#include <address.h>
/* CDC support */
#include <cdcacm.h>
#include <cdcprolific.h>
/* Debug support */
#include <printhex.h>
#include <message.h>
#include <hexdump.h>
#include <parsetools.h>

class PLAsyncOper : public CDCAsyncOper
{
public:
    virtual uint8_t OnInit(ACM *pacm);
};

uint8_t PLAsyncOper::OnInit(ACM *pacm)
{
    uint8_t rcode;
    
    // Set DTR = 1
    rcode = pacm->SetControlLineState(1);

    if (rcode)
    {
        ErrorMessage<uint8_t>(PSTR("SetControlLineState"), rcode);
        return rcode;
    }

    LINE_CODING	lc;
    //lc.dwDTERate = 9600;
    lc.dwDTERate = 115200;
    lc.bCharFormat	= 0;
    lc.bParityType	= 0;
    lc.bDataBits	= 8;	

    rcode = pacm->SetLineCoding(&lc);

    if (rcode)
        ErrorMessage<uint8_t>(PSTR("SetLineCoding"), rcode);
            
    return rcode;
}
USB Usb;
//USBHub Hub(&Usb);
PLAsyncOper AsyncOper;
PL2303 Pl(&Usb, &AsyncOper);

void setup()
{
  Serial.begin( 115200 );
  Serial.println("Start");

  if (Usb.Init() == -1)
      Serial.println("OSCOKIRQ failed to assert");
      
  delay( 200 );
}

void loop()
{
    Usb.Task();
  
    if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
    {
       uint8_t rcode;
       
       /* reading the keyboard */
       if(Serial.available()) {
         uint8_t data= Serial.read();
       
         /* sending to the phone */
         rcode = Pl.SndData(1, &data);
         if (rcode)
            ErrorMessage<uint8_t>(PSTR("SndData"), rcode);
       }//if(Serial.available()...
       
        /* reading the converter */
        /* buffer size must be greater or equal to max.packet size */
        /* it it set to 64 (largest possible max.packet size) here, can be tuned down
for particular endpoint */
        uint8_t buf[64];
        uint16_t rcvd = 64;
        rcode = Pl.RcvData(&rcvd, buf);
         if (rcode && rcode != hrNAK)
           ErrorMessage<uint8_t>(PSTR("Ret"), rcode);
            
           if( rcvd ) { //more than zero bytes received
             for(uint16_t i=0; i < rcvd; i++ ) {
               Serial.print((char)buf[i]); //printing on the screen
             }
           }//if( rcvd ...
    }//if( Usb.getUsbTaskState() == USB_STATE_RUNNING..
}

I tried this code with these USB Modems list :
ZTE MF180
Huawei E303
Huawei E220
Huawei k3565
Huawei k3765
Huawei K3770

but unfortunately attempt didn't succeed :(

Reference files
**broken link removed**
https://github.com/felis/USB_Host_Shield_2.0/blob/master/cdcprolific.cpp
https://github.com/felis/USB_Host_Shield_2.0/blob/master/cdcprolific.h

I think the problem is in the cdcprolific.h & cdcprolific.cpp If I could to edit a few data in them, I'm sure I will get my USB Modem work

I hope anyone guide me what I do to get it work

- - - Updated - - -

I have used an a USB Sniff program to get the initial details till the PC detect the modem

Code:
1	in down	n/a	0.000	GET_DESCRIPTOR_FROM_DEVICE		
  URB Header (length: 80)
  SequenceNumber: 1
  Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
  
1	in up	n/a	0.000	GET_DESCRIPTOR_FROM_DEVICE		0x00000000
  URB Header (length: 80)
  SequenceNumber: 1
  Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
  
2	in down	n/a	0.000	GET_DESCRIPTOR_FROM_DEVICE		
  URB Header (length: 80)
  SequenceNumber: 2
  Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
  
2	in up	n/a	0.000	GET_DESCRIPTOR_FROM_DEVICE		0x00000000
  URB Header (length: 80)
  SequenceNumber: 2
  Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
  
3	in down	n/a	0.000	GET_DESCRIPTOR_FROM_DEVICE		
  URB Header (length: 80)
  SequenceNumber: 3
  Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
  
3	in up	n/a	0.000	GET_DESCRIPTOR_FROM_DEVICE		0x00000000
  URB Header (length: 80)
  SequenceNumber: 3
  Function: 000b (GET_DESCRIPTOR_FROM_DEVICE)
  
4	??? down	n/a	0.000	SELECT_CONFIGURATION		
  URB Header (length: 100)
  SequenceNumber: 4
  Function: 0000 (SELECT_CONFIGURATION)
  Configuration Descriptor:
  bLength: 9 (0x09)
  bDescriptorType: 2 (0x02)
  wTotalLength: 39 (0x0027)
  bNumInterfaces: 1 (0x01)
  bConfigurationValue: 1 (0x01)
  iConfiguration: 1 (0x01)
  bmAttributes: 224 (0xe0)
    0x80: Bus Powered
    0x40: Self Powered
    0x20: Remote Wakeup
  MaxPower: 250 (0xfa)
    (in 2 mA units, therefore 500 mA power consumption)
  
  Number of interfaces: 1
  Interface[0]:
    Length: 0x004c
    InterfaceNumber: 0x02
    AlternateSetting: 0x00
    Class             = 0x00
    SubClass          = 0x00
    Protocol          = 0x00
    InterfaceHandle   = 0x00000000
    NumberOfPipes     = 0x00000003
    Pipe[0]:
      MaximumPacketSize = 0x0000
      EndpointAddress   = 0x00
      Interval          = 0x00
      PipeType          = 0x00
        UsbdPipeTypeControl
      PipeHandle        = 0x00000000
      MaxTransferSize   = 0x00001000
      PipeFlags         = 0x00
    Pipe[1]:
      MaximumPacketSize = 0x0000
      EndpointAddress   = 0x00
      Interval          = 0x00
      PipeType          = 0x00
        UsbdPipeTypeControl
      PipeHandle        = 0x00000000
      MaxTransferSize   = 0x00001000
      PipeFlags         = 0x00
    Pipe[2]:
      MaximumPacketSize = 0x0000
      EndpointAddress   = 0x00
      Interval          = 0x00
      PipeType          = 0x00
        UsbdPipeTypeControl
      PipeHandle        = 0x00000000
      MaxTransferSize   = 0x00001000
      PipeFlags         = 0x00
  
4	??? up	n/a	0.000	SELECT_CONFIGURATION		0x00000000
  URB Header (length: 100)
  SequenceNumber: 4
  Function: 0000 (SELECT_CONFIGURATION)
  Configuration Descriptor:
  bLength: 9 (0x09)
  bDescriptorType: 2 (0x02)
  wTotalLength: 39 (0x0027)
  bNumInterfaces: 1 (0x01)
  bConfigurationValue: 1 (0x01)
  iConfiguration: 1 (0x01)
  bmAttributes: 224 (0xe0)
    0x80: Bus Powered
    0x40: Self Powered
    0x20: Remote Wakeup
  MaxPower: 250 (0xfa)
    (in 2 mA units, therefore 500 mA power consumption)
  
  Number of interfaces: 1
  Interface[0]:
    Length: 0x004c
    InterfaceNumber: 0x02
    AlternateSetting: 0x00
    Class             = 0xff
    SubClass          = 0xff
    Protocol          = 0xff
    InterfaceHandle   = 0x85adc0a8
    NumberOfPipes     = 0x00000003
    Pipe[0]:
      MaximumPacketSize = 0x0040
      EndpointAddress   = 0x83
      Interval          = 0x05
      PipeType          = 0x03
        UsbdPipeTypeInterrupt
      PipeHandle        = 0x85adc0c4
      MaxTransferSize   = 0x00001000
      PipeFlags         = 0x00
    Pipe[1]:
      MaximumPacketSize = 0x0200
      EndpointAddress   = 0x84
      Interval          = 0x20
      PipeType          = 0x02
        UsbdPipeTypeBulk
      PipeHandle        = 0x85adc0e4
      MaxTransferSize   = 0x00001000
      PipeFlags         = 0x00
    Pipe[2]:
      MaximumPacketSize = 0x0200
      EndpointAddress   = 0x03
      Interval          = 0x20
      PipeType          = 0x02
        UsbdPipeTypeBulk
      PipeHandle        = 0x85adc104
      MaxTransferSize   = 0x00001000
      PipeFlags         = 0x00
  
5	out down	n/a	0.000	CLEAR_FEATURE_TO_DEVICE		
  URB Header (length: 80)
  SequenceNumber: 5
  Function: 0010 (CLEAR_FEATURE_TO_DEVICE)
  
5	out up	n/a	0.000	CONTROL_TRANSFER	-	0x00000000
  URB Header (length: 80)
  SequenceNumber: 5
  Function: 0008 (CONTROL_TRANSFER)
  PipeHandle: 854c8a90
  
  SetupPacket:
  0000: 00 01 01 00 00 00 00 00 
  bmRequestType: 00
    DIR: Host-To-Device
    TYPE: Standard
    RECIPIENT: Device
  bRequest: 01  
    CLEAR_FEATURE

  No TransferBuffer
  
6	??? down	n/a	0.000	RESET_PIPE		
  URB Header (length: 24)
  SequenceNumber: 6
  Function: 001e (RESET_PIPE)
  
6	??? up	n/a	0.000	RESET_PIPE		0x00000000
  URB Header (length: 24)
  SequenceNumber: 6
  Function: 001e (RESET_PIPE)
  
7	??? down	n/a	0.000	RESET_PIPE		
  URB Header (length: 24)
  SequenceNumber: 7
  Function: 001e (RESET_PIPE)
  
7	??? up	n/a	0.000	RESET_PIPE		0x00000000
  URB Header (length: 24)
  SequenceNumber: 7
  Function: 001e (RESET_PIPE)
 
Last edited:

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top