RU EN DE
Illegal Systems Corporation

Железо должно работать так, как МНЕ нужно...

SkyLinux - Open Source прошивка для C-motech CNU-550pro

Warning: Я вынужден был отказаться от услуг Скайлинка по причине совершенно неадекватных цен и отсутствия какого-либо желания оператора заниматься опорной сетью в Московской области. Кроме того, у меня в лесу появилось 3G от Мегафона и от МТС, за вполне вменяемые деньги и с хорошей скоростью. Поэтому для меня лично актуальность данной темы сошла на нет, и вряд-ли я буду продолжать развивать свою прошивку. В принципе, ничего сложного там нет, и возможно кто-то, для кого эта тема актуальна подхватит разработку. Я постарался привести описание и прошивку в максимльно приличное состояние, описать всё, что может вызвать вопросы, и выложил последнюю версию 0.3. Удачи.

Итак, поехали!

Те, кто умудрился потерять питание во время прошивки, или иным образом "убил" CNU, идут внимательно читать этот трактатъ, в котором описано как всё починить.

Железо

  • SoC - Samsung S3C2510A (на основе ARM940T - ARM без MMU и FPU)
  • RAM - 16 Мб
  • ROM - 4 Мб
  • Ethernet port
  • 2 USB host
  • USB device
  • RS232
  • JTAG

Совершенно стандартная схема включения - Samsung S3C2510 reference design На одном из USB host висит модуль CDMA EVDO модема Cmotech CNE-550 Более подробно о процессоре - см. datasheet (google - S3C2510A).

Как всё это собрать.

Должны быть установлены кросс-тулзы из архива arm-elf-tools-20030314.tgz который лежит внутри этого:
http://europe.giga-byte.com/FileList/Firmware/comm_b41g_gpl_v1.24.zip (В этом же архиве лежат и исходники прошивки для Гигабайтовского роутера B41G, тоже собранного на SoC S3C2510A - оттуда я взял исходники ядра, busybox и uClibc, а также утилиты mkcramfs).

Или же кросс-тулзы с бубном собраются из: http://www.uclinux.org/pub/uClinux/arm-elf-tools/tools-20030314/

Теперь - собственно то, из чего делается прошивка: CNU-550pro-open-0.3-src.tar.gz 52 Мб

Распаковываем её куда-нибудь.

ВНИМАНИЕ! Некоторые древние версии tar неправильно распаковывают device inodes! Обязательно проверьте содержимое CNU-550pro-open/cramfs/dev/. Там должно быть такое:

console loop1 mtd0 mtd8 mtdblock6 pcmcia2 ram ram7 tty tty7 ttyp2 wd core loop2 mtd1 mtd9 mtdblock7 port ram0 ram8 tty0 tty8 ttyS0 zero full loop3 mtd2 mtdblock0 mtdblock8 ppp ram1 ram9 tty1 tty9 ttyS1 gpiod loop4 mtd3 mtdblock1 mtdblock9 pppox0 ram2 random tty2 ttyACM0 ttyS2 gpiom loop5 mtd4 mtdblock2 null pppox1 ram3 sda tty3 ttyACM1 ttyUSB0 kmem loop6 mtd5 mtdblock3 nvram ptyp0 ram4 sda1 tty4 ttyACM2 ttyUSB1 log loop7 mtd6 mtdblock4 pcmcia0 ptyp1 ram5 sr0 tty5 ttyp0 ttyUSB2 loop0 mem mtd7 mtdblock5 pcmcia1 ptyp2 ram6 sr1 tty6 ttyp1 urandom
Если чего-то не хватает - надо скопировать dev/ из образа cramfs, слитого из CNU-550pro, примонтировав образ куда-нибудь
# mount -o loop CNU.cramfs /какое/нибудь/место
Если образа нет - то можно извлечь cramfs из CNU-550pro-open-0.3-stanson.bin
# dd if=CNU-550pro-open-0.3-stanson.bin of=CNU.cramfs bs=1 skip=16

В каталоге CNU-550pro-open/cramfs находится файловая система прошивки CNU-550pro, uClibc уже собрана и лежит в каталоге CNU-550pro-open/devel

По-большому счёту для добавления нужной софтины в прошивку, достаточно поместить исходники в каталог CNU-550pro-open/apps, настроить для кросс-компиляции по образу и подобию исходников уже лежащих в CNU-550pro-open/apps (см. напр. siproxd-config.sh или Makefile в CNU-550pro-open/gpio), собрать софтину и установить в CNU-550pro-open/cramfs

Следует учесть, что у S3C2510A нет MMU, поэтому, возможно, придётся при портировании повоевать с fork'ами или с другими требующими MMU вещами. Свои ограничения накладывает и не очень свежая uClibc. Однако, что-то простое и незамысловатое, типа того же picocom собирается вообще без проблем.

Далее в каталоге CNU-550pro-open делаем

$ make clean $ make
Появится файлик CNU-550pro-open-0.3-stanson.bin - это и есть новая нарядная прошивка.

На самом деле это образ cramfs с заголовком из 16 байт.

4 байта - 0x49 0x54 0x00 0x01 8 байт - любые (там что-то типа хитрой контрольной суммы, но она не проверяется прошивалкой встроенной в webs. Ага. Тивоизация по-китайски/корейски). 4 байта - размер образа cramfs в big-endian.

Заголовок добавляется к образу cramfs простым перловым скриптиком CNU-550pro-open/utils/mkimage.pl

Итак, прошивка создана. Теперь надо её прошить в роутер. Это делается так:

Заливка прошивки

Заходим телнетом на роутер.

Login: root password: inewdc
далее, убиваем веб-сервер
# killprog webs
(после перепрошивки надо будет использовать стандартный killall вместо killprog) И запускаем его без отрыва от терминала, чтобы видеть его stdout
# webs -r /htdocs -p 80
В меню вебморды выбираем Upgrade, выбираем нашу прошивку, жмём кнопку Upgrade и смотрим в telnet. Там будет такое:
# webs -r /htdocs -p 80 unlocking flash segments... 3170304Bytes Received. programming FLASH device Programming 2496 Kbyte -- 75 % complete
Ждём когда оно закончит:
Programming 3328 Kbyte -- 100 % complete,Please Reboot
Жмём Ctrl+C и
# reboot
После перезагрузки всё должно само подняться и дать интернет.

Немного о внутренностях прошивки

файловая система прошивки из которой при сборке создаётся образ cramfs лежит в каталоге CNU-550pro-open/cramfs - это корень будущей ФС.

Ядро лежит в /boot. Ядро пока не пересобирал, это надо делать с подключенной по RS232 консолью, чтобы иметь доступ к бутлоадеру, чтобы перепрошиться, если что. Ядро обязательно надо пересобрать, т.к., например, не работает target REDIRECT в iptables, хотелось бы иметь драйвера для разных USB устройств (в CNU-550pro второй выход USB host свободен и доступен для паяльника - туда можно подключить любое USB устройство, например WiMAX или HSDPA модем или флешку) и т.д.

При загрузке выполняется /bin/init который читает /etc/inittab и запускает скрипт /etc/rc Из /etc/rc запускается всё остальное.

На /var монтируется ramfs для записи всякой информации

Т.к. корневая ФС - только на чтение, все конфиги для которых возможны пользовательские настройки создаются при загрузке в /var/etc/. Это надо учитывать при сборке софтин с конфигами.

Настройки хранятся в разделе flash-памяти /dev/mtd1. Доступ к ним - через утилиту nvram. При работе утилита проверяет наличие файла /var/config.cache, если его нет, то он создаётся и в него копируется содержимое раздела с настройками. После чего утилита работает с этим файлом, а не с flash'ем, чтобы не тратить время и поберечь flash.
Все настройки сразу в алфавитном порядке можно вывести командой

# nvram -l | sort
При перепрошивке все настройки сохраняются.

Конфиги в /etc - в основном "рыбы" для реальных конфигов. При загрузке на "рыбу" конфига натравливается nvram с ключом -x, которая читая строки типа
<% sysmode0/adminname %>:<% sysmode0/adminpass %>:0:0:root:/:/bin/msh
лезет в nvram и заменяет <% имя/переменной %> на её значение из nvram Затем, то что получилось записывается в /var/etc/, откуда проги и читают конфиги.

Поменять значение в nvram можно используя команду
# nvram -s 'имя/переменной = значение переменной'
Краткая инструкция по использованию утилиты выводится командой
# nvram -h
Не забудьте дать команду
# nvram -c
если хотите сохранить значения во flash. Эта команда скопирует текущее содержимое файла /var/config.cache в соответствующий раздел flash. Этим можно пользоваться если настройки по каким-то причинам "слетели". Нужно скопировать "исправный" config.cache на поверх "сломанного" и дать вышеописанную команду. Лучше, конечно пользоваться своим config.cache (сохраните его на всякий случай после заливки прошивки), но на всякий случай резервный config.cache лежит в файлах этого проекта. Логин-пароль там по умолчанию root:admin, IP-адрес ethernet 192.168.253.253

Всё вышенаписанное относится только к версиям старше 0.2 Начиная с версии 0.3 прошивки изменён способ общения с nvram, где хранятся все настройки. Теперь всё делает утилита nvram, однако, вебморда, которую я так и не заменил ещё на что-то человеческое работает с памятью по-старому. Так что если что-то было изменено через вебморду, то нужно либо перезагрузить CNU, либо удалить файл /var/config.cache (он пересоздастся при следующем запуске утилиты nvram).

ВНИМАНИЕ!: После перепрошивки для рутового доступа через телнет надо использовать логин и пароль к вебморде. Т.к. доступ к вебморде и телнету открыт по умолчанию только через интерфейс eth0 - то всё вполне удобоваримо с точки зрения секьюрности.

Работает ли сброс настроек - я не проверял. По-идее это делается утилитой factory, которая проверяет состояние кнопки reset, и если она не отжата - то переписывает настройки. factory запускается скриптом /etc/rc.modules в процессе загрузки.

CDMA Модем

Модем висит на USB порту SoC

Виден в /proc/bus/usb/devices как

T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 15 Spd=12 MxCh= 0 D: Ver= 2.00 Cls=02(comm.) Sub=00 Prot=00 MxPS=16 #Cfgs= 1 P: Vendor=16d8 ProdID=5543 Rev= 0.00 S: Manufacturer=CMOTECH CO., LTD. S: Product=CMOTECH CDMA Technologies S: SerialNumber=Serial Number C:* #Ifs= 3 Cfg#= 1 Atr=80 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=acm E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=32ms I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=acm E: Ad=8a(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=0b(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms I: If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=serial E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=05(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
Эта штука имеет 2 последовательных интерфейса - /dev/ttyACM0 и /dev/ttyUSB0 /dev/ttyACM0 - банальный модем. С ним можно общаться AT-командами. Например:
AT$$READALLMT - выведет все принятые модемом СМС AT$$DISCHV1=pin-код - Отключает запрос PIN-кода
Список спецкоманд модема в файле AT-commands.txt Вроде как именно к CNE-550 (модуль в роутере) Где нашёл - не помню.
Описания команд практически нет. Частично что-то можно найти погуглив на предмет IS-707 AT commands
Некоторые команды имеют отношение к PIN PUK и всё такое, так что осторожнее.
Для замучивания модема в прошивке есть picocom - простейший терминал.
Использовать так:
Сначала прибиваем pppd
# killall pppd
Потом запускаем терминал
# picocom --noinit --noreset /dev/ttyACM0
Скорость и всё такое - по барабану. Это USB. Ну и можно поэкспериментировать с командами.

Выход из терминала - Ctrl+A, Ctrl+X

Перезапустить pppd, чтобы снова получать инет можно командой
# pppd call skylink nodetach > /dev/null 2>& &
(nodetach здесь нужен чтобы pppd не пытался форкнуться, т.к. форка в системе нет.)

Второй интерфейс - /dev/ttyUSB0 - это что-то для контроля и управления модемом без отрыва от производства, так сказать. В оригинальной прошивке нём висит проприетарная софтина qualcomm_dm, которая периодически обновляет в кэше nvram данные об уровне сигнала и всё такое. Может и ещё что-то делает. В принципе всё прекрасно работает и без неё, разве что вебморда не показывает уровни сигнала в реальном времени.

В текущей прошивке этой утилиты нет, по причине её возможной проприетарности и лицензионных ограничений. Однако, можно выдернуть утилиту из родной прошивки, загрузить при помощи tftp в /tmp, и запустить как
# /tmp/qualcomm_dm > /dev/null 2>&1 &
Питанием модема управляет вывод GPIO0 SoC S3C2150A.

Для управления GPIO написал утилитку - так и называется gpio модем включается
# gpio -s 0
выключается
# gpio -c 0
Посмотреть включёно или выключено питание модема можно командой
# gpio -g 0
Это можно использовать для жёсткого ресета модема (аналогично отключению и подключению обычного USB модема, просто без физических действий), хотя после установки данной прошивки мне это ни разу не понадобилось - всё работает без сбоев и модем не виснет.

про остальные выводы GPIO мне ничего не известно.

Следует учесть, что светодиод "Соединение" на CNU-550pro может самопроизвольно гаснуть ненадолго во время установленного соединения. На самом деле это ничего не значит - соединение при этом не рвётся. Смотрите Syslog в вебморде - там случаи разрыва соединения будут отображены, если такие случатся.

Светодиоды "Соединение" и "Сигнал сети" подключёны напрямую к модулю модема CNE-550 и контролировать их нет возможности (если только есть какие-то AT-команды для этого).

Отладка софта без перепрошивки

В прошивке есть команда tftp - tftp клиент. С её помощью можно быстро отлаживать софт - загрузить собранный бинарник куда-нибудь в /tmp ,

# cd /tmp # tftp -g -r filename server_address
сделать его исполняемым
# chmod +x filename
И попробовать запустить
# ./filename
Таким образом я отлаживал siproxd, например.

Кое-что о настройках CNU-550pro которые надо выставить до перепрошивки:

  1. Желательно чтобы был прописан статический IP адрес
  2. Запрос пина должен быть отключен
  3. Желательно выключить все ненужные сервисы - VRRP и всё такое. Вполне возможно они работают - просто я не проверял, и не знаю что будет если оставить их включенными.

После прошивки логин-пароль на вебморду будет подходить для рутового telnet Стандартного входа root:inewdc больше нет.

Заливайте эту прошивку только в следующих случаях:

  1. Родная прошивка достала до безобразия, и нет другого выхода, кроме как рискнуть и попробовать сие творение
  2. Вам позарез нужно иметь прямо сейчас нормально работающую через Скайлинк SIP-телефонию.
  3. Вы прекрасно разбираетесь в Linux и хотите поэкспериментировать, или заняться написанием софта для CNU-NNNpro.

Если вы убъёте свой роутер или что-то перестанет работать - вы сами себе злобные буратины. Я предупреждал.

Версия 0.3 CNU-550pro-open-0.3-stanson.bin 3 Мб

В версии 0.3 есть возможность без пересборки прошивки добавить пользовательские команды, исполняемые при загрузке. Скрипт, который будет выполняться должен быть сохранён в переменной nvram user/startup, например:

# nvram -s 'user/startup = #!/bin/sh > /bin/iptables -t nat -A PREROUTING -p tcp --dport=22 -j DNAT --to-destination 192.168.255.11 > /bin/iptables -A FORWARD -p tcp --dport 139 -j DROP' # nvram -c
Этот скрипт выполнится при работе скрипта /etc/rc.local

В некоторых случаях модуль модема неадекватно реагирует на команду AT$$SIP_SET=0. Это можно увидеть в логах (в вебморде - лог задом наперёд, так что не удивляйтесь):

Jan 1 00:01:12 chat[205]: Failed (ERROR) Jan 1 00:01:12 chat[205]: -- failed Jan 1 00:01:12 chat[205]: ERROR Jan 1 00:01:12 chat[205]: AT$$SIP_SET=0^M^M Jan 1 00:01:12 chat[205]: ^M Jan 1 00:01:12 chat[205]: expect (OK) Jan 1 00:01:12 chat[205]: send (AT$$SIP_SET=0^M)
В этом случае следует использовать прошивку с nosipset в названии. CNU-550pro-open-0.3-nosipset-stanson.bin Там просто из скрипта chat удалена эта команда.

Версия 0.2 (устарело, используйте 0.3)

Добавлено чтение СМС (Вебморда->Status->SMS) Сделано очень просто - в качестве скрипта init pppd используется chat со скриптом который достаёт СМС из памяти модема и выводит на stderr (ECHO ON). stderr перенаправляется в /var/www/sms.txt. sms.txt потом просто включается с помощью SSI в веб-страничку sms.shtml при просмотре. Скрипт для chat - /var/etc/skylink-sms (просто cкопированный при загрузке /etc/ppp/peers/skylink-sms)

SMS-ки выглядят так:

$$RDAUSMS: 29,I,O,20090517142848,89015167055,4098,2,Остаток на л/с XXXXXX 323.64 р. на 17.05.2009. Предполагаемая дата отключения 18.05.2009. $$RDAUSMS: - AT-команда которой были извлечены СМС 29 - номер ячейки памяти I,O - пока не известно что за флаги 20090517142848 - дата и время СМС (2009 г. май, 17 число, 14 часов 28 мин. 48 сек.) 89015167055 - номер отправителя СМС 4098,2 - тоже неизвестно далее идёт текст СМС
Если у кого-нибудь есть документация на AT-команды модемов Cmotech - поделитесь.

К сожалению, СМС отсылаемые Скайлинком приходят в кодировке CP1251, а пришедшие от прочих операторов - в UNICODE. chat не очень адекватно воспринимает байты в символах UNICODE, поэтому пока с чтением СМС в UNICODE проблемы. Не очень здорово, но сейчас хотя бы имеется возможность получать и читать СМС от Скайлинка о состоянии счёта. СМС считываются из модема в момент пересоединения pppd скриптом указанным в опции init. Если нужно посмотреть последние СМС то можно заставить pppd переконнектится и заодно забрать СМСки:
# killall -HUP pppd
Вполне возможно, что то же самое можно делать без пересоединения, через 2-й последовательный (контрольный?) интерфейс модема, но мне об этом мне ничего неизвестно.

В pppd добавлена опция конфига reset - запуск скрипта сброса модема в момент пересоединения при ошибках открытия /dev/ttyACM0 и при ошибке скрипта connect Скрипт /bin/reset_modem выключает питание модема, включает его обратно и ждёт когда в /proc/tty/driver/acm появится строка содержащая текст ttyACM0

Note: изредка наблюдается странная картина - питание модема выключено, однако ядро почему-то не убирает устройство. Не происходит usb_deregister. После включения питания ttyACM0 всё равно остаётся мёртвым. Как из такой ситуации выходить автоматически я пока не знаю.
Перезагрузка помогает, но ведь это не метод...
Кроме того, случается это довольно редко, и поймать довольно сложно.

Ещё теперь нормально работают установки lcp-echo-interval и lcp-echo-failure в вебморде. Я рекомендую установить lcp-echo-interval 15, lcp-echo-failure 10 Это заставит pppd переустанавливать соединение, если по каким-то причинам соединение не разорвалось, сеть есть но пакеты данных перестали ходить. Такое бывает, и видимо связано либо с глюками самого модуля модема, либо с глюками оборудования Скайлинк. pppd будет раз в 15 секунд посылать lcp-echo пакет, и если на 10 пакетов он не получит ни одного ответа то pppd попытается пересоединиться.

Внимание! Если стояла прошивка 0.8.0, в вебморде в разделе Mode нет ничего про LCP echo, и интернет не появляется, то нужно через telnet сделать следующее:

# nvram -s ppp0/lcpechointerval=15 # nvram -s ppp0/lcpechofailure=10 # nvram -c # reboot
После перезагрузки в вебморде должны появиться поля для lcp-echo-interval и lcp-echo-failure и интернет должен заработать нормально.

Версия 0.1 (устарело, используйте 0.3)

  • pppd-2.4.4 - не виснет и держит соединение как штык. Время восстановления соединения при обрыве связи (при нормальном уровне сигнала) - 10 секунд.
  • busybox с кучей утилит
  • siproxd - SIP прокси, который позволяет нормально работать куче SIP телефонов через один CNU-550pro. Звонки снаружи приходят на соответствующие телефоны, локальные звонки идут по локалу.
  • bwm - маленький консольный трафикометр
  • picocom - терминалка для прямого общения с модемом. С её помощью я уже выяснил как читать принятые модемом СМС.

Кое-какой feedback на всё это дело в инете: PC Magazine

 
 

©2005 Illegal Systems Corp. Designed by Stanson.