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

General project help for Adafruit customers

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
ElMobd3
 
Posts: 7
Joined: Sat Dec 08, 2012 4:25 pm

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

Post by ElMobd3 »

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: Select all

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

ElMobd3
 
Posts: 7
Joined: Sat Dec 08, 2012 4:25 pm

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

Post by ElMobd3 »

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: Select all

/* 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
https://github.com/felis/USB_Host_Shiel ... rminal.pde
https://github.com/felis/USB_Host_Shiel ... olific.cpp
https://github.com/felis/USB_Host_Shiel ... prolific.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

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

Code: Select all

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
  BANNED: 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
  BANNED: 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)
  

Avtop
 
Posts: 1
Joined: Tue Oct 09, 2012 12:58 pm

Re: Need to write a small code to switch USB Dongle to modem

Post by Avtop »

Hi any one have done to switch USB cd rom to Modem mode as above said

thx
Avtar

Locked
Please be positive and constructive with your questions and comments.

Return to “General Project help”