l'E220 è un modem usb UMTS-HDSPA.
veniamo al succo, le memorie su come ho fatto per farlo funzionare (ho seguito delle guide per gentoo):
- ho compilato il file huaweiAktBbo.c il cui sorgente è qui sotto, scaricato da http://www.kanoistika.sk/bobovsky/archiv/umts/huaweiAktBbo.c e l'ho spostato in /usr/local/sbin dopo avergli impostato lo sticky bit, per farlo sempre eseguire come root, con
gcc huaweiAktBbo.c -lusb -o huaweiAktBbo
sudo chmod +s huaweiAktBbo
sudo mv huaweiAktBbo /usr/local/sbin/
questo file serve per cambiare la modalità di utilizzo del modem, che è anche un dispositivo usb di memorizzazione (sul quale sono memorizzati dei driver per windows). se, alla connessione del modem alla porta usb, già si hanno i dispositivi /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyUSB2 allora si è a posto e non occorre usare questo file.
- in /etc/udev/rules.d/50-huawei.rules ho scritto queste cose
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe usbserial vendor=0x12d1 product=0x1003"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe ppp_generic"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe ppp_async"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="sleep 10"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/usr/local/sbin/huaweiAktBbo"
i codici che ci sono nel caricare il modulo usbserial in genere per l'E220 sono quelli. se uno ha codici diversi, forse li vede da dmesg al momento in cui connette il dispositivo, oppure da
con quella roba, alla connessione del modem linux carica correttamente i moduli che gli servono, e cambia la modalità di funzionamento del modem.
se il cambio modalità non ha effetto, provare ad eseguirlo da un terminale.
file: 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;
}
una volta fatto ciò, per connettersi con tre italia (e SOLO con tre italia, per non spendere soldi in roaming, con la tariffa che ho attivato io), uso questo file nella mia home e mi connetto ad esempio con gnome-ppp:
.wvdial.conf
[Dialer Defaults]
Modem = /dev/ttyUSB0
ISDN = off
Modem Type = Analog Modem
Baud = 460800
Init = ATX3
Init2 = AT&F Q0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = at+cops=1,0,"3 Italy",2
Init4 = at+cgdcont=1,"IP","datacard.tre.it"
Init5 =
Init6 =
Init7 =
Init8 =
Init9 =
Phone = *99***1#
Phone1 = *99***1#
Phone2 =
Phone3 =
Phone4 =
Dial Prefix =
Dial Attempts = 20
Dial Command = ATM1L3DT
Ask Password = off
Password = anon
Username = anon
Auto Reconnect = off
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = on
Idle Seconds = 0
Auto DNS = on
;Minimize = on
;Dock = on
;Do NOT edit this file by hand!
in particolare la riga che imposta manualmente l'operatore, per evitare che in fase di connessione il modem si connetta a qualche altro operatore, è:
at+cops=1,0,"3 Italy",2
dove:
1 (primo parametro) imposta l'operatore manualmente
0 (secondo parametro) specifica il formato alfanumerico lungo per il nome dell'operatore
"3 Italy" (terzo parametro) è il nome dell'operatore, in questo caso 3 italia.
2 (quarto parametro) specifica con quale tecnologia connettersi. 2 è UMTS.
altri comandi utili, da lanciare magari con minicom (da installare), in base alle necessità, sono
AT+CLCK="PN",2
guarda se è attivo il lock PN (per la documentazione dei tipi di lock, vedere i manuali riportati in fondo).
è possibile anche bloccare e sbloccare funzionalità, inserendo la password impostata dal costruttore (se la si ha...).
nella documentazione sono descritti tutti i tipi di lock impostabili.
AT+COPS?
interroga il modem per sapere chi è l'operatore corrente
AT+COPS=?
riporta le reti disponibili attualmente. la rete corrente ha impostato 2 nel campo dello stato.
per tutti gli altri (molti!) comandi AT disponibili, e per le sintassi ed i dettagli di quelli riportati qui sopra, vedere il manuale riportato qui in fondo
riferimenti:
~ http://gentoo-wiki.com/HARDWARE_HUAWEI_E220_HSDPA_USB_MODEM guida su gentoo
~ http://www.kanoistika.sk/bobovsky/archiv/umts/huaweiAktBbo.c programma che cambia la modalità dell'E220
~ http://www.3gpp.org/ftp/Specs/archive/27_series/27.007/27007... documentazione AT command set
veniamo al succo, le memorie su come ho fatto per farlo funzionare (ho seguito delle guide per gentoo):
- ho compilato il file huaweiAktBbo.c il cui sorgente è qui sotto, scaricato da http://www.kanoistika.sk/bobovsky/archiv/umts/huaweiAktBbo.c e l'ho spostato in /usr/local/sbin dopo avergli impostato lo sticky bit, per farlo sempre eseguire come root, con
gcc huaweiAktBbo.c -lusb -o huaweiAktBbo
sudo chmod +s huaweiAktBbo
sudo mv huaweiAktBbo /usr/local/sbin/
questo file serve per cambiare la modalità di utilizzo del modem, che è anche un dispositivo usb di memorizzazione (sul quale sono memorizzati dei driver per windows). se, alla connessione del modem alla porta usb, già si hanno i dispositivi /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyUSB2 allora si è a posto e non occorre usare questo file.
- in /etc/udev/rules.d/50-huawei.rules ho scritto queste cose
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe usbserial vendor=0x12d1 product=0x1003"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe ppp_generic"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe ppp_async"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="sleep 10"
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/usr/local/sbin/huaweiAktBbo"
i codici che ci sono nel caricare il modulo usbserial in genere per l'E220 sono quelli. se uno ha codici diversi, forse li vede da dmesg al momento in cui connette il dispositivo, oppure da
sudo lsusb -v
con quella roba, alla connessione del modem linux carica correttamente i moduli che gli servono, e cambia la modalità di funzionamento del modem.
se il cambio modalità non ha effetto, provare ad eseguirlo da un terminale.
file: 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;
}
una volta fatto ciò, per connettersi con tre italia (e SOLO con tre italia, per non spendere soldi in roaming, con la tariffa che ho attivato io), uso questo file nella mia home e mi connetto ad esempio con gnome-ppp:
.wvdial.conf
[Dialer Defaults]
Modem = /dev/ttyUSB0
ISDN = off
Modem Type = Analog Modem
Baud = 460800
Init = ATX3
Init2 = AT&F Q0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = at+cops=1,0,"3 Italy",2
Init4 = at+cgdcont=1,"IP","datacard.tre.it"
Init5 =
Init6 =
Init7 =
Init8 =
Init9 =
Phone = *99***1#
Phone1 = *99***1#
Phone2 =
Phone3 =
Phone4 =
Dial Prefix =
Dial Attempts = 20
Dial Command = ATM1L3DT
Ask Password = off
Password = anon
Username = anon
Auto Reconnect = off
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = on
Idle Seconds = 0
Auto DNS = on
;Minimize = on
;Dock = on
;Do NOT edit this file by hand!
in particolare la riga che imposta manualmente l'operatore, per evitare che in fase di connessione il modem si connetta a qualche altro operatore, è:
at+cops=1,0,"3 Italy",2
dove:
1 (primo parametro) imposta l'operatore manualmente
0 (secondo parametro) specifica il formato alfanumerico lungo per il nome dell'operatore
"3 Italy" (terzo parametro) è il nome dell'operatore, in questo caso 3 italia.
2 (quarto parametro) specifica con quale tecnologia connettersi. 2 è UMTS.
altri comandi utili, da lanciare magari con minicom (da installare), in base alle necessità, sono
AT+CLCK="PN",2
guarda se è attivo il lock PN (per la documentazione dei tipi di lock, vedere i manuali riportati in fondo).
è possibile anche bloccare e sbloccare funzionalità, inserendo la password impostata dal costruttore (se la si ha...).
nella documentazione sono descritti tutti i tipi di lock impostabili.
AT+COPS?
interroga il modem per sapere chi è l'operatore corrente
AT+COPS=?
riporta le reti disponibili attualmente. la rete corrente ha impostato 2 nel campo dello stato.
per tutti gli altri (molti!) comandi AT disponibili, e per le sintassi ed i dettagli di quelli riportati qui sopra, vedere il manuale riportato qui in fondo
riferimenti:
~ http://gentoo-wiki.com/HARDWARE_HUAWEI_E220_HSDPA_USB_MODEM guida su gentoo
~ http://www.kanoistika.sk/bobovsky/archiv/umts/huaweiAktBbo.c programma che cambia la modalità dell'E220
~ http://www.3gpp.org/ftp/Specs/archive/27_series/27.007/27007... documentazione AT command set

