Skylink cdma usb modem wetelecom wm-d200

Маємо WeTelecom WM-D200, який - має EV-DO Rev.A, що значно швидше від того EV-DO; - має гніздо для підключення зовнішньої антени, що в наших місцевостях дуже корисно; - продавався по "акції" за досить смішні гроші. Як і слід було очікувати, при втиканні в Linux box впізнаватись ця тварина не стала і замість модему система бачила. USB-CD-ROM!

Щож.. починаємо танці з бубном)

usb_modeswitch та gcc

Перше, що спало на думку - це один з тих дебільних донглів, які треба перемикати драйвером з CD-ROM в модем, оскільки саме драйвери для віндозу і мацусу лежали на тому сидюку. І тут з'ясовується, що утиліти та система usb_modeswitch в ubuntu 8 відсутні як клас і треба їх компілити з вихідних джерел. Сам usb_modeswitch мешкає тут: http://www.draisberghof.de/usb_modeswitc h/. А ось з компіляцією довелося помучитися, оскільки маркетологи убунти вважають, що це не Linux, а такий собі віндоз і ніяких засобів розробки за умовчанням не ставлять. Ігого, для компіляції та запуску довелося доставляти gcc, хідери, tcl, бібліотеки. Замучили загалом. І найприкріше виявилося те, що нічого, крім того, що тепер на сервері стоїть usb_modeswitch ці маніпуляції не дали. Чи не запрацювало. Бо дурень.

Ретельне вивчення девайса командоюlsusb -v -d 22de:6801(відразу це зробити - релігія не дозволила, ймовірно) показало, що крім CD-ROM на девайсі висить ще три "vendor specific" девайса, які цілком мабуть, є інтерфейсами модему.

А чому б не спробувати змусити модуль usbserial з'їсти ці дивні девайси? Доперто – зроблено! Беремо/etc/modprobe.confі заносимо до нього рядок:

options usbserial vendor=0x22deproduct=0x6801

Далі, перевантажуємо модулі usbserialі варіант, якщо такі висят і, при включенні модема, отримуємо в логе:

guard kernel: [1194848.835704] usb 1-2: новий повношвидкісний USB-пристрій з використанням uhci_hcd і адреси 44 guard kernel: [1194849.007489] usb 1-2: конфігурація №1, вибрана з 1 вибору guard kernel: [1194849.025514 ] scsi46 : емуляція SCSI для накопичувачів USB захисне ядро: [1194854.020899] scsi 46:0:0:0: CD-ROM We Telecom CD-ROM 1.00 PQ: 0 ANSI: 2 захисне ядро: [ 1194854.053826] sr1: scsi-1 drive guard kernel: [1194854.053982] sr 46:0:0:0: Attached scsi generic sg2 type 5 guard kernel: [1194854.150618] sr1: CDROM не готовий. Переконайтеся, що в дисководі є диск. захисне ядро: [1194864.049540] usb 1-2: відключення USB, адреса 44 захисне ядро: [1194865.586859] usb 1-2: новий повношвидкісний USB-пристрій за допомогою uhci_hcd та адреса 45 захисне ядро: [1194865.753797] usb 1-2: конфігурація #1 вибрано з 1 вибору захисне ядро: [1194865.756773] usbserial_generic 1-2:1.0: виявлено загальний конвертер захисне ядро: [ 1194865.756987] usb 1-2: загальний конвертер тепер підключено до ttyUSB0 guard kernel: [1194865.759955] usbserial_generic 1-2:1.1: загальний конвертер виявлено guard kernel: [1194865.760193] usb 1-2: загальний конвертер тепер підключено до ядра ttyUSB1 guard: [1194865.761856] usbserial_generic 1-2:1.2: виявлено загальний конвертер ядро guard: [1194865.762082] usb 1-2: загальний конвертер тепер підключено до ядра ttyUSB2 guard: [1194865.796607] scsi47 : емуляція SCSI для накопичувачів USB guard kernel: [1194870.795188] scsi 47:0:0:0: CD-ROM We Telecom CD-ROM 1.00 PQ: 0 ANSI: 2 guard kernel: [1194870.807191 ] sr1: диск scsi3-mmc: 0x/0x caddy guard kernel: [1194870.807352] sr 47:0:0:0: приєднано scsi generic sg2 type 5 guard kernel: [1194870.901012] sr: Sense Key : Немає сенсу[current] guard kernel: [1194870.901017] sr: Add. Sense: No additional sense information

Тобто, маємо три порти usbserial (працює лише 0) і ЦД-ром, а за рахунок маніпуляцій першого уроку, нульовий порт вже світиться як /dev/skylink. Пускаємо pppd і насолоджуємося порівняно швидким інтернетом.

І все б нічого, та тільки скулінк славний тим, що кожні 8 годин рве зв'язок, причому не обриваючи канал, а шлячи нескінченні LCP terminate, вважаючи, що канал порве клієнт. Але на жаль, у випадку з WM-D200 це не так, тобто pppd з'єднання розриває, відпускає порт, а модем залишається на зв'язку і при спробі повторного з'єднання chat бачить не інтерфейс модему, а лінк PPP, що залишився, з пакетами LCP terminate від скулінківського обладнання. Це, природно, той самий "епік фейл", який осягає pppd у цьому випадку. Коротше, треба навчити pppd "кидати трубку".

На щастя, pppd має опцію "disconnect", яка дозволяє виконати скрипт після закінчення з'єднання. Найпростіше, що спадає на думку це послати щось у модем, на зразок древнього +++ATH, але експерименти з minicom показали що так просто цей модем не проймеш. Наступним кроком спало на думку послати на пристрій reset. Відповідної утиліти на цей випадок не виявилося і довелося писати свою примітивну версію (resetdev.c):

#include #include #include #include #include

void main(int argc, char argv) const char *filename; int fd; filename = argv[1]; fd = Open(filename, O_WRONLY); ioctl(fd, USBDEVFS_RESET, 0); close(fd); return; >

тепер, хапаємо цю фігню, компілюємо та нацьковуємо на пристрій модему, тобто. робимо щось на зразок

Ресет проходить, але, на жаль, модем не кидає слухавку. ГИ)

Залишилося останнє – спробувати програмно"пересмикнути" харчування на модемі. Могутній пошук по мережі показав, що це робиться через пристрої типу/sys/bus/usb/devices/usb1/1-2/power/leve l- типу, для відключення посилаємо:

echo suspend > /sys/bus/usb/devices/usb1/1-2/power/leve l

Як виявилося, цей захід на модем впливає. Залишилося тільки написати скриптик, який знаходить пристрій у /sys/bus/usb і вставити його в опцію disconnect у файлі/etc/ppp/peers/SkyLink(або як він там у вас називається). Скрипт я назвав resetwetelecom:

/usr/bin/logger -p 'syslog.warning' "Виконати перехід CDMA WeTelecom modem ($WETELDEV)."

/usr/sbin/lsusb -d "$WETELDEV" >/dev/null exit 1 BUS=`/usr/sbin/lsusb -d "$WETELDEV"/usr/bin/awk '< print( $2 ) >'` DEV=`/usr/sbin/lsusb -d "$WETELDEV"/usr/bin/awk '< print( $4 ) >' \ /usr/bin/awk -F':' '< print( $1 ) >'` BUSn=`echo $BUS/bin/sed 's/^0*//'` DEVn=`echo $DEV/bin/sed 's/^0* // ''

/usr/bin/logger -p 'syslog.debug' "lsusb: bus $BUS ($BUSn), device $DEV ($DEVn)"

for dev in `/usr/bin/find "/sys/bus/usb/devices/usb$/" -name devnum -print`; do devv=`/bin/cat "$"` if ["$devv" -eq "$DEVn"]; then device=`dirname "$dev"` fi done

if [-n "$BUS" -a -n "$DEV"]; then /usr/bin/logger -p 'syslog.warning' "Found modem bus $BUS, device $DEV ($device)" /usr/local/bin/resetdev /dev/bus/usb /$BUS/$DEV echo suspend > "$/power/level" /bin/sleep 2 echo on > "$/power/level" exit 0 else /usr/bin/logger -p 'syslog.warning' "Failed to found modem devices" exit 1 fi

Як видно, залишив я в ньому і resetdev, написаний раніше. Чого добру пропадати;) Власне, все. Та й працює все.