Переделывание D-Link DIR-320 в 3G роутер
Я более чем уверен, что многие уже не один раз видели подобные заголовки. Но каждый раз, когда их читаешь, получается, что нужно купить какой-то самый в мире проверенный модем, да к тому же удача должна быть к тебе благосклонна. А ведь самая распространённая проблема заключается в том, что нет такого модема, который бы не зависал по истечению определенного времени. Самый длинный интервал, что я видел – это 8 (восемь) часов. Как следствие, многие отказываются от подобной задумки и опускают руки, а в случае если без роутера никак, то приспосабливают для этих целей старенький ПК, да еще и устанавливают Windows (как правило, XP, ну или что будет под рукой).
Так как ПК и уж тем более Windows, для меня не вариант и «того самого» модема у меня не было под руками, пришлось искать решение.
Если интересно продолжение, прошу под «кат».
Введение
Исследования и постановка целей
Итак, прежде чем делать что-то самому, я начал с того, что проанализировал многочисленные форумы и сообщества. На каждом форуме были ветки с описание тех самых чудо модемов и бесконечного ряда, связанных с ними проблем. Одни были мега стабильными, но с неприемлемо низкой скоростью, другие радовали производительностью, но уже через 30 минут «зависали» намертво. Все это очень сильно огорчало.
Прежде чем идти в «закрома родины» за стареньким ПК, я решил проанализировать имеющиеся факты и самостоятельно исследовать проблему.
- Находим модем из списка всех USB устройств:
for f in `ls /sys/bus/usb/devices/*/product`; do echo -e "$f\t`cat $f`"; done
echo “suspend” | sudo tee /sys/bus/usb/devices/1-1/power/level sleep 5 echo "on" | sudo tee /sys/bus/usb/devices/1-1/power/level
Взяв четыре прошивки для роутера: D-Link, Asus, OpenWRT или DD-WRT, начал повторять эксперимент, но вот незадача, на удивление, ни в одной из прошивок не оказалось возможности управления питанием USB. Вначале я подумал, что это проблема ядра 2.4.x. Но и та же проблема и с 2.6. Более того, после перезагрузки роутера модем оставался проинициализированным. Вывод напрашивался сам собой, нужно разбирать роутер.
Внимательный осмотр и «прозвонка» платы показали, что ножка питания «+5В» подключена непосредственно к источнику питания. Это меня не устраивает и нужно делать модернизацию платы и источника питания.
Наступил момент выбора дистрибутива. У этого замечательного роутера очень мало оперативной памяти и не хотелось, чтобы её потребляли ненужные сервисы, будь то httpd, FTP, SAMBA или что еще. Было принято решение построить дистрибутив на базе OpenWRT самостоятельно, при этом с минимумом предустановленных пакетов и сервисов.
Но прежде чем приступить к сборке дистрибутива и модернизации роутера, предстояла работа по выбору целевого модема/оператора и внешней антенны.
- 3G модем (был куплен MTS WeTelecom WM-D300)
- Направленная антенна CDMA-450 (неплохая по заверению продавца, какого-то неизвестного производителя)
- Он настойчиво отображается как CD-ROM
- Ни слова в интернете об этом модеме, максимум, что было найдено это упоминание о предыдущей модели (WM-D200)
Сборка OpenWRT
svn co svn://svn.openwrt.org/openwrt/branches/backfire openwrt-backfire
./scripts/feeds install sdparm
Target System (Broadcom BCM947xx/953xx [2.4])
sdparm. Read or modify SCSI or USB disk parameters chat. Establish conversation with a modem comgt. Option/Vodafone 3G/GPRS control tool kmod-scsi-generic. Kernel support for SCSI generic kmod-usb-core. Support for USB kmod-usb-ohci. Support for OHCI controllers kmod-usb-serial. Support for USB-to-Serial converters kmod-usb-storage. USB Storage support kmod-usb2. Support for USB2 controllers
make tools/install -j`grep -c processor /proc/cpuinfo` make toolchain/install -j`grep -c processor /proc/cpuinfo`
[*] Support 2-chip flash interleave
make -j`grep -c processor /proc/cpuinfo`
Проверка прошивки
После того как прошивка была «залита» и роутер перезагрузился, подключите к нему модем и соедините роутер посредством Ethernet с вашим ПК. Настройте на интерфейсе (в моём случае это eth0) вашего ПК IP адрес выполнив команду:
ifconfig eth0 inet 192.168.1.2/24
Вход будет совершен автоматически без запроса пароля. Это в корне не верно. Чтобы исправить ситуацию, задайте пароль, выполнив команду в консоли:
grep "^P\:.*22de.*6803" /proc/bus/usb/devices
Результатом выполнения этой команды, будет строка с VID и PID модема. В противном случае, проверьте, что было сделано не по инструкции.
Модернизация аппаратного обеспечения роутера
Для управления питанием USB порта нужна свободная ножка процессора. Но так как это не инженерная плата, а конечный продукт, данный вариант не подходит. По счастливой случайности, у этого роутера масса светодиодных индикаторов на передней панели. Один из них мы вполне можем приспособить под наши нужды. В моем случае выбор пал на индикатор со значком принтера, так как он соответствовал светодиоду USB на proc-fs (/proc/diag/led/usb).
Управление питанием будет осуществлять дополнительная плата с минимально необходимым набором деталей. Вот её схема:
Пара слов о схеме. Оба транзистора работают в качестве ключей. При подаче логической единицы на вход «CTRL», транзистор VT1 откроется, что в свою очередь приведет к открытию транзистора VT2 и питающее напряжение подастся на USB порт. Как таковые, расчеты не производились, поэтому, схема не может считаться оптимальной. Например, транзистор VT1, просто был единственным N-P-N транзистором в поле досягаемости, собственно как и резисторы.
На изготовление печатной платы не было ни времени, не желания, по этому, я обошелся небольшим кусочком монтажной платы. Вот так выглядит конечный вариант:
Зелёными надписями отмечены одноименные порты на схемы. Резистор R4, припаян непосредственно к ножке светодиода.
Пошаговая инструкция по модификации:
- Обесточьте роутер и разберите его
- Уберите не нужный R48 – этот резистор соединяет светодиод с ножкой процессора
- Удалите предохранитель F1 – этот предохранитель, должен обеспечить защиту в случае короткого замыкания на линиях питания USB. Его номинал мне не известен, но я его применил в своей схеме (R3). Обратите внимание, надписями желтого цвета отмечены места подключения платы управления
- Удалите защитное покрытие с проводника, ведущего сигнал от процессора к резистору R48. К этому проводнику, должен быть подпаян порт «CTRL» платы управления
- Приклейте плату управления в наиболее удобное для вас место. Мне, оказался, по душе свободный участок, чуть ниже антенного гнезда. В этом случае длина соединительных проводов будет наименьшей
- Припаяйте резистор R4 непосредственно к аноду светодиода, как указанно на фотографии. Также обратите внимание на подключение соединительных проводов
- Закончите монтаж соединительных проводов
- Итоговый результат
- Соберите и включите роутер
Модернизация программного обеспечения роутера
Это последний шаг на пути к «счастью». Нам нужно будет написать ряд новых скриптов и внести изменения в уже имеющиеся. Итак, все по прядку.
Подключитесь к роутеру по ssh, так как все следующие шаги будут выполняться непосредственно на нём.
Создание утилит для управления USB
Перейдите в папку /etc/ppp. Многих заинтересует, почему была выбрана именно эта папка в качестве целевой. Ответ прост, так исторически сложилось. Думаю, /usr/local/sbin будет более подходящей, но сути это не меняет
$ cat usb-up.sh #!/bin/sh logger -t "USB PwrCtrl" "Turn-on USB power" echo 1 > /proc/diag/led/usb
$ cat resetusb.sh #!/bin/sh logger -t "USB PwrCtrl" "Turn-off USB power" echo 0 > /proc/diag/led/usb # Sleep in 3 sec is an optional, but may be useful for some modem types #sleep 3 logger -t "USB PwrCtrl" "Turn-on USB power" echo 1 > /proc/diag/led/usb
#!/bin/sh if ps | grep -q /usr/sbin/pppd; then logger -t "PPP watcher" "PPP alive" else logger -t "PPP watcher" "No PPP daemon" /etc/ppp/resetusb.sh fi
$ cat /etc/hotplug.d/usb/11-modem #!/bin/sh # Copyright (C) 2013 Sergey Shcherbakov case "$ACTION" in add) (grep -q "^P\:.*22de.*6803" /proc/bus/usb/devices) && < logger -t "WM-D300" "Detected ZeroCD of WM-D300 modem" # Checking ZeroCD status while [ "$(sdparm -q --command=ready /dev/scsi/host0/bus0/target0/lun0/generic)" != "Ready" ]; do logger -t "WM-D300" "ZeroCD yet not ready" # Workaround for bug with multiple calls of scripts (/usr/bin/lsusb | grep -q 22de:6801) && < logger -t "WM-D300" "Seems that script called twice and device already initialized" return 0 >sleep 2 done logger -t "WM-D300" "ZeroCD ready and will be ejected" /usr/bin/sdparm --command=eject /dev/scsi/host0/bus0/target0/lun0/generic > (grep -q "^P\:.*22de.*6801" /proc/bus/usb/devices) && [ ! -c /dev/usb/tts/0 ] && < logger -t "WM-D300" "Updating USB Serial driver with D200/D300 vendor and product ID" rmmod usbserial && insmod usbserial vendor=0x22de product=0x6801 >(grep -q "^P\:.*22de.*6801" /proc/bus/usb/devices) && [ -c /dev/usb/tts/2 ] && ! (ifconfig 3g-wan 1>/dev/null 2>/dev/null) && < logger -t "WM-D300" "All modem interfaces installed, turning on WAN" ifdown wan && ifup wan >;; remove) ! (grep -q "^P\:.*22de.*6801" /proc/bus/usb/devices) && < logger -t "WM-D300" "Modem disconnected, turning off WAN interface" ifdown wan >;; esac
Внесение изменений в существующие скрипты
sed -i 's/interface\ wan$/interface\ wan_dflt/' /etc/config/network
$ cat /etc/config/network … config interface wan option ifname ppp0 option device /dev/usb/tts/0 option service evdo option proto 3g option username 'mobile' option password 'internet' option pppd_options 'noipdefault maxfail 3' option connect '/etc/ppp/usb-up.sh' option disconnect '/etc/ppp/resetusb.sh' option keepalive 20
ABORT BUSY ABORT 'NO CARRIER' ABORT ERROR ABORT 'NO DIAL TONE' ABORT 'NO DIALTONE' ABORT 'NO ANSWER' REPORT CONNECT TIMEOUT 10 '' AT OK ATDT#777 CONNECT ''
/etc/init.d/cron enable && /etc/init.d/cron start
Вместо эпилога
Домашние испытания продлились 41 день. Как результат, ни единого сбоя на протяжении всего периода. Ожидаемая стабильность достигнута.
Перед отправкой в «поля», были проведены испытания пропускной способности в киевской квартире. Разочарование застигло врасплох, достигнутый максимум не превышал 1Мбит/с, при этом только на больших файлах. Минимальный пинг был а пределах 220мс. Решив не прекращать испытания, поехал за город. Уровень был на максимуме, при этом индикатор CDMA Rev.B уже не горел. На самом деле, я не теплил надежд на 14Мбит/с, но ожидал увидеть, как минимум, уже достигнутый 1Мбит. Но очередное разочарование не заставило себя ждать, достигнутый максимум составлял уже около 350Кбит/с.
На этом, всяческие эксперименты с модемом от MTS были прекращены. Вернуть его так и не удалось. А вот антенну продавец обменял на модель способную работать в связке с модемами Интертелеком и PeopleNET. Чему я был несказанно рад, а модем пускай будет в коллекции, когда-нибудь пригодится.
Рабочая лошадка DIR-320
D-Link DIR-320 rev. A1/A2
OEM-производитель — Alpha Networks Inc., Jie Kuo District, Chang An, Dongguan City, Guangdong Province, China (модель WRG-G27)
D-Link Corporation, No.289, Shinhu 3rd Rd., Neihu District, Taipei, Taiwan
FCCID — KA2DIR320A1 (1 ноября 2007 г.)
Industry Canada ID (ICID) — 4216A-IR320
Физические ТТХ (рост, вес, объём бёдер)
Размеры: 142 × 109 × 31 мм
Вес: 0,22 кг
Блок питания: ⎓ 5 В, 2 А, с цилиндрическим разъёмом
- SoC — Broadcom 5352EKPB@240 МГц little-endian MIPS R4k
(в корпусе BGA-361 объединены PHY/MAC-контроллер и процессор базовой логики беспроводной сети Wi-Fi (IEEE 802.11b/g), логика Fast Ethernet-коммутатора и MIPS-процессор) - Flash — 4 MiB (Spansion S29AL032D90TFI03)
(максимальный объём прошивки — 3801088 байт) - RAM — 32 MiB (Samsung K4H561638H-UCCC)
Порты интерфейсов
- 4 LAN 10/100BASE-TX Ethernet (IEEE 802.3/802.3u)
- 1 WAN 10/100BASE-TX Ethernet (IEEE 802.3/802.3u)
- 1 USB 2.0 тип A
- 1 последовательный порт (на плате)
- 1 порт JTAG версии 1 или 2.0 (на плате)
Режимы работы Wi-Fi IEEE 802.11b и IEEE 802.11g
в диапазоне 2400 — 2483,5 МГц
Разъём соединения антенны — RP-SMA
IP-адрес по умолчанию — 192.168.0.1/24
Логин по умолчанию — admin
Пароль по умолчанию —