Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Dec 2007 10:36:58 +0100
From:      "no@spam@mgedv.net" <nospam@mgedv.net>
To:        <freebsd-usb@freebsd.org>, <freebsd-questions@freebsd.org>, "Hans Petter Selasky" <hselasky@c2i.net>
Subject:   Re: huawei e220 hsdpa on freebsd 6.3-BETA2
Message-ID:  <001101c838b4$b7153bf0$14b1a8c0@bstandard.lan>
References:  <006701c8380d$e12ecc50$14b1a8c0@bstandard.lan><200712061553.54412.hselasky@c2i.net><000601c8382b$0b9459c0$14b1a8c0@bstandard.lan> <200712062018.50262.hselasky@c2i.net>

next in thread | previous in thread | raw e-mail | index | archive | help

> Your HSDPA modem presented itself like a mass storage device, probably 
> with
> some autorun and virus like drivers intended for the Windows operating
> system :-)

unfortunately, this is the "intended" behaviour. this device has the
ability to present itself as "mass storage" which will show up as a
cd-rom device where the windows drivers are stored on.

this is the way it works under windows:
- plug it in first time
- (auto)run the setup on the device for the win-driver
- as soon as the driver is loaded, the cd device disappears and a modem is 
detected

but when loading the ucom/ubsa stuff before umass, the device will
not be recognised as /dev/cdX and show up as a communication device
(ucom).

of course there must be a way for getting the serial device working,
because this is one of the most sold umts/hsdpa modems across eu and
many people run it under linux as well (there are no drivers from
the vendor provided except windows and mac).
i'm pretty sure there is some "message" or anything else which will
render this device switching to serial mode.
there is some code, which i found (doesn't compile/run under freebsd)
which "puts" this device in pure serial mode. maybe someone out there
is able to tell me, how/if this can be done on freebsd as well?
(btw, i'm not a c-guru)

do you (or anybody else reading this) have an idea, how to get this
device working and put it in serial mode "completely" ?

regards...

THIS IS THE C CODE WHICH WORKS (ANYHOW) ON LINUX:


===========================================
1st: huaweiAktBbo.c
===========================================


/* HUAWEI E220 3G HSDPA modem - Aktivator modemu = aktivuje ttyUSB0 tty USB1
   bobovsky 11.12.2006
   dalej sa uz pouzije usbserial a usb-storage
   cc huaweiAktBbo.c -lusb  (resp -I. -L.)
   armeb-linux-gcc huaweiAktBbo.c -L. -I. -lusb
   Copyright (C) 2006 bobovsky bobovsky@kanoistika.sk  GPL
   This program is free software; you can redistribute it and/or modify it 
under the terms of the GNU General Public License2.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include <usb.h>
#if 0
 #include <linux/usbdevice_fs.h>
 #define LIBUSB_AUGMENT
 #include "libusb_augment.h"
#endif

struct usb_dev_handle *devh;

void release_usb_device(int dummy) {
    int ret;
    ret = usb_release_interface(devh, 0);
    if (!ret)
 printf("failed to release interface: %d\n", ret);
    usb_close(devh);
    if (!ret)
 printf("failed to close interface: %d\n", ret);
    exit(1);
}

void list_devices() {
    struct usb_bus *bus;
    for (bus = usb_get_busses(); bus; bus = bus->next) {
 struct usb_device *dev;

 for (dev = bus->devices; dev; dev = dev->next)
     printf("0x%04x 0x%04x\n",
     dev->descriptor.idVendor,
     dev->descriptor.idProduct);
    }
}

struct usb_device *find_device(int vendor, int product) {
    struct usb_bus *bus;

    for (bus = usb_get_busses(); bus; bus = bus->next) {
 struct usb_device *dev;

 for (dev = bus->devices; dev; dev = dev->next) {
     if (dev->descriptor.idVendor == vendor
  && dev->descriptor.idProduct == product)
  return dev;
 }
    }
    return NULL;
}

void print_bytes(char *bytes, int len) {
    int i;
    if (len > 0) {
 for (i=0; i<len; i++) {
     printf("%02x ", (int)((unsigned char)bytes[i]));
 }
 printf("\"");
        for (i=0; i<len; i++) {
     printf("%c", isprint(bytes[i]) ? bytes[i] : '.');
        }
        printf("\"");
    }
}


int main(int argc, char **argv) {
    int ret, vendor, product;
    struct usb_device *dev;
    char buf[65535], *endptr;
#if 0
    usb_urb *isourb;
    struct timeval isotv;
    char isobuf[32768];
#endif

    usb_init();
//    usb_set_debug(255);
    usb_find_busses();
    usb_find_devices();
/*
    if (argc!=3) {
 printf("usage: %s vendorID productID\n", argv[0]);
 printf("ID numbers of currently attached devices:\n");
 list_devices();
 exit(1);
    }
    vendor = strtol(argv[1], &endptr, 16);
    if (*endptr != '\0') {
 printf("invalid vendor id\n");
 exit(1);
    }
    product = strtol(argv[2], &endptr, 16);
    if (*endptr != '\0') {
 printf("invalid product id\n");
 exit(1);
    }
*/
    printf("Hladam HUAWEI E220 a prepnem na modem - bbo 06\n");
    vendor = 0x12d1;
    product = 0x1003;
    dev = find_device(vendor, product);
    assert(dev);

    devh = usb_open(dev);
    assert(devh);

    signal(SIGTERM, release_usb_device);

/*
    ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
    printf("usb_get_driver_np returned %d\n", ret);
    if (ret == 0) {
 printf("interface 0 already claimed by driver \"%s\", attempting to detach 
it\n", buf);
 ret = usb_detach_kernel_driver_np(devh, 0);
 printf("usb_detach_kernel_driver_np returned %d\n", ret);
    }
    ret = usb_claim_interface(devh, 0);
    if (ret != 0) {
 printf("claim failed with error %d\n", ret);
  exit(1);
    }

    ret = usb_set_altinterface(devh, 0);
    assert(ret >= 0);
*/
// BBO typ 1 = DEVICE
ret = usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
//printf("1 get descriptor returned %d, bytes: ", ret);
//print_bytes(buf, ret);
//printf("\n");
usleep(1*1000);
// BBO typ 2 = CONFIGURATION
ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000009);
//printf("2 get descriptor returned %d, bytes: ", ret);
//print_bytes(buf, ret);
//printf("\n");
usleep(1*1000);
// BBO typ 2 = CONFIGURATION
ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000020);
//printf("3 get descriptor returned %d, bytes: ", ret);
//print_bytes(buf, ret);
//printf("\n");
usleep(1*1000);
/*
ret = usb_release_interface(devh, 0);
if (ret != 0) printf("failed to release interface before set_configuration: 
%d\n", ret);
ret = usb_set_configuration(devh, 0x0000001);
printf("4 set configuration returned %d\n", ret);
ret = usb_claim_interface(devh, 0);
if (ret != 0) printf("claim after set_configuration failed with error %d\n", 
ret);
ret = usb_set_altinterface(devh, 0);
printf("4 set alternate setting returned %d\n", ret);
usleep(50*1000);
ret = usb_set_altinterface(devh, 0);
printf("5 set alternate setting returned %d\n", ret);
usleep(62*1000);
*/
ret = usb_control_msg(devh, USB_TYPE_STANDARD + USB_RECIP_DEVICE, 
USB_REQ_SET_FEATURE, 00000001, 0, buf, 0, 1000);
printf("4 set feature request returned %d\n", ret);
/*
 ret = usb_release_interface(devh, 0);
 assert(ret == 0);
*/
 ret = usb_close(devh);
 assert(ret == 0);
 printf("Prepnute-OK, Mas ttyUSB0 ttyUSB1 (cez usbserial vendor=0x12d1 
product=0x1003)\n");
 printf("pozri /proc/bus/usb/devices\n");
 return 0;
}


===========================================
and the other c-code: (huaweiAktBbo_pt-BR.c)
===========================================

/* HUAWEI E220 3G HSDPA modem - Utilitário para Ativação = ativa ttyUSB0 e 
ttyUSB1
   bobovsky 11.12.2006
   O próximo passo é usar usbserial e usb-storage para ppp(Discagem) e para 
usb mass-storage(Mídia de armazenamento USB)
   para compilar: cc huaweiAktBbo.c -lusb  (resp -I. -L.)
   ou compilação cruzada: armeb-linux-gcc huaweiAktBbo.c -L. -I. -lusb
   Copyright (C) 2006 bobovsky bobovsky@kanoistika.sk  GPL
   Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo 
sob os termos da GNU General Public License2.
   Tradução para o português (pt-BR) por Andrius Ribas andriusmao@gmail.com
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include <usb.h>
#if 0
 #include <linux/usbdevice_fs.h>
 #define LIBUSB_AUGMENT
 #include "libusb_augment.h"
#endif

struct usb_dev_handle *devh;

void release_usb_device(int dummy) {
    int ret;
    ret = usb_release_interface(devh, 0);
    if (!ret)
 printf("Falha ao liberar interface: %d\n", ret);
    usb_close(devh);
    if (!ret)
 printf("Falha ao fechar interface: %d\n", ret);
    exit(1);
}

void list_devices() {
    struct usb_bus *bus;
    for (bus = usb_get_busses(); bus; bus = bus->next) {
 struct usb_device *dev;

 for (dev = bus->devices; dev; dev = dev->next)
     printf("0x%04x 0x%04x\n",
     dev->descriptor.idVendor,
     dev->descriptor.idProduct);
    }
}

struct usb_device *find_device(int vendor, int product) {
    struct usb_bus *bus;

    for (bus = usb_get_busses(); bus; bus = bus->next) {
 struct usb_device *dev;

 for (dev = bus->devices; dev; dev = dev->next) {
     if (dev->descriptor.idVendor == vendor
  && dev->descriptor.idProduct == product)
  return dev;
 }
    }
    return NULL;
}

void print_bytes(char *bytes, int len) {
    int i;
    if (len > 0) {
 for (i=0; i<len; i++) {
     printf("%02x ", (int)((unsigned char)bytes[i]));
 }
 printf("\"");
        for (i=0; i<len; i++) {
     printf("%c", isprint(bytes[i]) ? bytes[i] : '.');
        }
        printf("\"");
    }
}


int main(int argc, char **argv) {
    int ret, vendor, product;
    struct usb_device *dev;
    char buf[65535], *endptr;
#if 0
    usb_urb *isourb;
    struct timeval isotv;
    char isobuf[32768];
#endif

    usb_init();
//    usb_set_debug(255);
    usb_find_busses();
    usb_find_devices();
/*
    if (argc!=3) {
 printf("usage: %s vendorID productID\n", argv[0]);
 printf("ID numbers of currently attached devices:\n");
 list_devices();
 exit(1);
    }
    vendor = strtol(argv[1], &endptr, 16);
    if (*endptr != '\0') {
 printf("invalid vendor id\n");
 exit(1);
    }
    product = strtol(argv[2], &endptr, 16);
    if (*endptr != '\0') {
 printf("invalid product id\n");
 exit(1);
    }
*/
    printf("Encontrando e ativando o modem HUAWEI E220\n");
    vendor = 0x12d1;
    product = 0x1003;
    dev = find_device(vendor, product);
    assert(dev);

    devh = usb_open(dev);
    assert(devh);

    signal(SIGTERM, release_usb_device);

/*
    ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
    printf("usb_get_driver_np returned %d\n", ret);
    if (ret == 0) {
 printf("interface 0 already claimed by driver \"%s\", attempting to detach 
it\n", buf);
 ret = usb_detach_kernel_driver_np(devh, 0);
 printf("usb_detach_kernel_driver_np returned %d\n", ret);
    }
    ret = usb_claim_interface(devh, 0);
    if (ret != 0) {
 printf("claim failed with error %d\n", ret);
  exit(1);
    }

    ret = usb_set_altinterface(devh, 0);
    assert(ret >= 0);
*/
// BBO typ 1 = DEVICE
ret = usb_get_descriptor(devh, 0x0000001, 0x0000000, buf, 0x0000012);
//printf("1 get descriptor returned %d, bytes: ", ret);
//print_bytes(buf, ret);
//printf("\n");
usleep(1*1000);
// BBO typ 2 = CONFIGURATION
ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000009);
//printf("2 get descriptor returned %d, bytes: ", ret);
//print_bytes(buf, ret);
//printf("\n");
usleep(1*1000);
// BBO typ 2 = CONFIGURATION
ret = usb_get_descriptor(devh, 0x0000002, 0x0000000, buf, 0x0000020);
//printf("3 get descriptor returned %d, bytes: ", ret);
//print_bytes(buf, ret);
//printf("\n");
usleep(1*1000);
/*
ret = usb_release_interface(devh, 0);
if (ret != 0) printf("failed to release interface before set_configuration: 
%d\n", ret);
ret = usb_set_configuration(devh, 0x0000001);
printf("4 set configuration returned %d\n", ret);
ret = usb_claim_interface(devh, 0);
if (ret != 0) printf("claim after set_configuration failed with error %d\n", 
ret);
ret = usb_set_altinterface(devh, 0);
printf("4 set alternate setting returned %d\n", ret);
usleep(50*1000);
ret = usb_set_altinterface(devh, 0);
printf("5 set alternate setting returned %d\n", ret);
usleep(62*1000);
*/
ret = usb_control_msg(devh, USB_TYPE_STANDARD + USB_RECIP_DEVICE, 
USB_REQ_SET_FEATURE, 00000001, 0, buf, 0, 1000);
printf("4 Requisição de estabelecer característica retornou %d\n", ret);
/*
 ret = usb_release_interface(devh, 0);
 assert(ret == 0);
*/
 ret = usb_close(devh);
 assert(ret == 0);
 printf("Ligado-OK, Você tem os dispositivos ttyUSB0 e ttyUSB1 (use o 
usbserial vendor=0x12d1 product=0x1003)\n");
 printf("veja /proc/bus/usb/devices\n");
 return 0;
}

===========================================
EOF.






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?001101c838b4$b7153bf0$14b1a8c0>