RTL8196 vs OpenWRT

Не так давно откопал валявшийся на даче edup’овский роутер и решил домучать. Купил хрень? Мучайся! Не то чтобы не было денег или возможности выкинуть и купить поддерживаемую железку. тут уж дело принципа.
Итак, внутри у него RTL8196C. Некоторое время у же проходил занимательный, познавательный и увлекательный квест по имени «собери все патчи и получи тулчейн«. Дальше от одного взгляда на BSP реалтека появилась депрессия, уныние, отчаяние, ощущение безысходности, тошнота и приступы агрессии… Если у Вас слабое здоровье — не смотрите их код…
Собственно, ниже привожу весь треш и угар, который откопал в их BSP.
Если это случаем читают программисты реалтека сделавшие такое нечто… Убейте себя. Спасите планету!
Итак, начнем с веселого.


necromant@ilwyn:/media/NC-OS/pocket_router/linux-2.6.30-veteran/arch/mips/rtl8196b$ ls -la
итого 64
drwxr-xr-x 2 necromant necromant 4096 2010-12-17 11:48 .
drwxr-xr-x 19 necromant necromant 4096 2010-12-17 11:48 ..
-rw-r--r-- 1 necromant necromant 6268 2010-02-22 05:35 int.c
-rw-r--r-- 1 necromant necromant 236 2010-02-22 05:35 Makefile
-rw-r--r-- 1 necromant necromant 2615 2010-02-22 05:35 mem.c
lrwxrwxrwx 1 necromant necromant 84 2011-08-21 14:14 pci.c -> /home/bo_zhao/8196/linux-2.6.19/linux-2.6.x/arch/mips/realtek/rtl8196b/pci-rtl8196.c
-rw-r--r-- 1 necromant necromant 1996 2010-02-22 05:35 pci.h
-rw-r--r-- 1 necromant necromant 14802 2010-02-22 05:35 pci-rtl8196.c
-rw-r--r-- 1 necromant necromant 1111 2010-02-22 05:35 printf.c
-rw-r--r-- 1 necromant necromant 4383 2010-02-22 05:35 setup.c
-rw-r--r-- 1 necromant necromant 2240 2010-02-22 05:35 timer.c

pci.c является симлинком в /home/%индуснейм%/…, а учитывая что %индуснейм% != necromant у меня оно бы не собралось. Просто чудо, что эти файлики оказались не сильно нужными/дублирующимися. Такое там в 5-6 местах и некоторые опции Kconfig’a явно приведут к фейлу при сборке по причине отсутствуюзих файлов.

Из ядра куча симлинков ведет наружу. Бордоспецифичная инициализаия тут не в mach-boardname.c, а целый каталог bsp ведущий симлинком во вне дерева ядра. И то, бордоспецифичного кода там ноль целых хрен десятых.

gpio для светодиодов и кнопочек сделан в виде char драйвера не совместимого ни с чем. Забудем про /sys/class/leds/, лед-триггеры и прочее — сделаем свой велосипед, с блэкджеком! Бордоспецифичные дефайны светодиодов находятся не в каталоге bsp, о котором я писал выше, а в нем самом. Привет программерам Трындец-Нета. Хотя… Их можно понять. Разбираться в дзене реалтековцев то еще удовольствие.

Для LexraCore (MIPS-инвалид без пятка инструкций) сделана отдельная архитектура rlx с большим количеством копипасты.

Makefile’ы ядра хакнуты, чтобы собиралось допотопным gcc версии 3.3х, местмами хакнуты чтобы утягивал объявление каталогов от билдсистемы bsp.

Извращенцы реалтека пишут camelCase’ом в ядре. Взять и расстрелять на месте!

комментарии в дмесг видавыглядят просто абзац, как информативно.

паковщик образов ядра rtkload впендюрен в дерево ядра, и вызывает cvimg, который собирается вместе с goahead (веб сервер, что ли?) запихнутым вместе с софтом корневой фс. Корневуха пришпандоревается к образу при момощи mgbin из той же задницы.

Драйвер mtd выставляет размеры разделов из Kconfig ядра. Никаких вам mach-%boardname%, %юзернейм%.

Если утилитам cvimg или mgbin передать достаточно длинное имя файла, то они с треском свалятся в корку, или размажут стек. Просто туда, куда делается strcpy из argv[1] не знает о том, что границы массивов надо проверять… И про strdup не знаем тоже.

Баудрейт для earlyprintk и настройки частоты оного запихнуты не в бордоспецифичную инициализацию, а в какую-то задницу.h (пардоньте мой френч) в arch/rlx/include. После всего вышеописанного это просто не смешно уже.

А многие и не знают, что на этом треше работает их шелезячка…

ДОПОЛНЕНИЕ
Из их драйвера GPIO:

 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
 kill_proc(1,SIGTERM,1);
 #else
...

Это было достойно занесения на govnokod.ru =))

P.S. начальный порт OpenWRT тут: http://invyl.ath.cx/cgit/cgit.cgi/openwrt/
Желающие рискнуть здоровьем и помочь в этом нелегком деле — стучитесь в почту.

Print Friendly

RTL8196 vs OpenWRT: 26 комментариев

  1. Привет! Имею железку NETGEAR JWNR2000 сделанную на этом железе. Хотел бы помочь в этом нелёгком деле, но знаний в данной области у меня мало. всё же может чем нибудь буду полезен?

  2. @Sergey: Пока единственное, чем можно помочь — это отклонить себе git репозиторий, и потихоньку разбираться что и как. До тестирования еще очень далеко.

  3. Немного позже, можно будет добавлять mach-имя_своей_шелезяки, с описанием кнопочек и диодов, но пока только так.

  4. Привет автору, купил я по дурости аналогичный роутер: https://www.dealextreme.com/p/wr-225n-802-11b-g-n-2-4ghz-300mbps-wireless-router-grey-91881
    Как я там отписался, это чудо имеет следующие особенности:
    — it have terrible ethernet-to-wifi perfomance (1.4MB/s max even when Windows shows 150Mb/s total connection speed)
    — it hangs on heavy loads (like torrents), so you have to go and press reset on the box
    — i tried to find any firmware for it, without any result
    — there are several hardware-like products on market (D-Link DIR-615 Ver.Fx, DIR-618 Ver.A1). I tried to load d-link firmware to this device with negative result.
    It is based on RTL8196B SoC with RTL8192SE, 2MB flash and 16MB RAM.

    Теперь думаю, в мусорку его отправить, или можно что-то сделать?
    Попутно нашел исходники от аналогичного роутера:
    http://www.hikerhauk.com/proj/jwnr2000/JWNR2000/JWNR2000.html

    1. @Rostislav: Я не раньше чем на след. неделе буду ковырять железку дальше. У меня внутрях RTL8196C, разницы я между ними по исходникам не нашел, наверное в кремнии где-то есть.

  5. Здесь код от аналогичного на OpenWRT:
    на Realtec 8196B (включая toolchain для 8196b)
    http://www.downloads.netgear.com/files/GPL/jwnr2000-V1.0.0.5_src.tar.bz2.zip
    и его более новая модель на Realtec 8196С (включая toolchain для 8196с)
    http://www.downloads.netgear.com/files/GPL/jwnr2000v2-V1.0.0.7_1.0.1_GPL.tar.bz2.zip.

    Тоже интересуют отличия между процами, ибо у меня сборка для первого получается, а второй не хочет собираться с toolchain’ом от первого (все ссылки заменил на старый тулчайн, сборка от JWNR2000v2 c поправленными конфигами под старый тулчайн идёт 90%, потом ругается на неизвестные переменные — т.е. разница в тулчайнах есть). Вот меня и интересует — может не мучаться и собрать прошивку для 8196В из прошивки 8196С, используя и тулчайн от 8196С ?)

  6. Попробовал я эти исходники от нетгеар скомпилить у себя на бубунте 10.04.
    Тулчейн по инструкции запустил собираться, оно мне выдало:
    extra/scripts/unifdef.c:209: error: conflicting types for ‘getline’
    Гугление по этой строке ввергает в уныние — походу надо патчить ядро.
    Нет, не мое это… 🙂

    Necromant, как дела?

  7. Хех.. нашел прошивку от Airlink 101 AR675W — вроде бы железо одно и то же.
    http://airlink101.com/products/ar675w.php
    А прошивка называется BR6428N_Phoebe_v1_19_upg.bin , что как бы намекает нам на роутер Edimax BR6428n.
    Прошился, получил кирпич 🙂
    Посмотрел в UART… тоска:

    Добро пожаловать в minicom 2.4

    ПАРАМЕТРЫ: I18n
    Дата компиляции Jan 25 2010, 06:49:09.
    Port /dev/ttyUSB1

    Нажмите CTRL-A Z для получения подсказки по клавишам

    mfid=c2 devid=2249
    Found 1 x 2M flash memory

    —RealTek(RTL8196B)at 2009.04.30-17:26+0800 version v1.4b [16bit](330MHz)
    sys checksum error at 10000!
    no sys signature at 20000!
    no sys signature at 30000!

    —Ethernet init Okay!
    help
    —————— COMMAND MODE HELP ——————
    HELP (?) : Print this help message
    D
    DB
    EW …
    EH …
    EB …
    EC …
    CMP: CMP
    IPCONFIG:
    AUTOBURN: 0/1
    LOADADDR:
    J: Jump to
    FLW: FLW
    FLR: FLR

  8. Прошивки надо было собирать в Fedora Core 7 и проверить что GCC version 3.4.6 и texinfo package V4.8. У меня легко собираются в конфигах есть выбор камня (в том числе и RTL8196В).

  9. А там оказывается Emergency Web Server еще живой на 192.168.0.1
    И я таки вынес китайцам мосх. Пусть новую прошивку мне рожают.

  10. Запорол я таки бутлоадер в своем чудо-девайсе.
    Подскажите на примере прошивки Netgear, как его скомпилить отдельно так, чтобы был образ, который можно зашить программатором во флэш?

  11. @Rostislav: RTL8196? Я делал дамп бутлоадыря на своей девайсине, как буду на даче захвачу и выложу тогда.

  12. RTL8196B, проблема таки в том, что бутлоадеры от разных девайсов слегка таки отличаются, как минимум адресами старта linux и rootfs, c чем я столкнулся когда запорол девайс чужой прошивкой.
    Поэтому у меня последняя «идея фикс» — взять заведомо безглючную вылизанную прошивку от полного железного аналога (в моем случае это http://airlink101.com/products/ar675w.php , там как раз лежит свежая прошивка). Собрать под нее бутлоадер с правильными адресами старта linux и rootfs (я уже столько пялился в разные прошивки в хекс-редакторе что знаю где какие маркеры и следующие за ними адреса, куда пихать образ) и залить его через jtag.
    После этого, соответственно, поднимется tftp и можно будет прошивку закинуть на роутер.
    Короче, взял я последнюю нетгеаровскую прошивку jwnr2000v2-V1.0.0.8_1.0.7_GPL.tar.bz2
    Там есть директория bootloader (пишу по памяти, в виртуальной Федоре лазил). Залез в нее и make menuconfig сделал. Настроил там все, потом make. И тут оно меня обломало, что-то там про ошибки в каком-то файле, связанном с tftp начало сыпать.

  13. [root@localhost bootloader]# make
    make -C boot boot JUMP_ADDR=0x80500000 RTL865X=1
    make[1]: Entering directory `/root/src/jwnr2000v2-V1.0.0.8_1.0.7_GPL/jwnr2000v2/bootloader/boot’
    mips-linux-gcc -c -march=4181 -g -fomit-frame-pointer -nostdinc -fno-pic -mno-abicalls -G 0 -I. -I./include -D__KERNEL__ -Dlinux -O -DCONFIG_POST_ENABLE -DJUMP_ADDR=0x80500000 -DRTL865X=1 -DCONFIG_RTL865X=y -DCONFIG_RTL865XC=1 -o ./Output/eth_tftpd.o ./init/eth_tftpd.c
    In file included from ./init/eth_tftpd.c:2:
    ./include/etherboot.h:622: warning: conflicting types for built-in function ‘putchar’
    ./init/eth_tftpd.c: In function `updateARPTable’:
    ./init/eth_tftpd.c:394: error: `rx’ undeclared (first use in this function)
    ./init/eth_tftpd.c:394: error: (Each undeclared identifier is reported only once
    ./init/eth_tftpd.c:394: error: for each function it appears in.)
    ./init/eth_tftpd.c: In function `setTFTP_RRQ’:
    ./init/eth_tftpd.c:457: error: `rx’ undeclared (first use in this function)
    ./init/eth_tftpd.c: At top level:
    ./init/eth_tftpd.c:876: error: syntax error before «bool»
    ./init/eth_tftpd.c: In function `checkAutoFlashing’:
    ./init/eth_tftpd.c:943: error: `len’ undeclared (first use in this function)
    ./init/eth_tftpd.c:945: error: `startAddr’ undeclared (first use in this function)
    ./init/eth_tftpd.c: In function `chk_ST_ID’:
    ./init/eth_tftpd.c:1160: warning: passing arg 1 of `memcmp’ makes pointer from integer without a cast
    ./init/eth_tftpd.c:1161: warning: passing arg 1 of `memcmp’ makes pointer from integer without a cast
    ./init/eth_tftpd.c: At top level:
    ./init/eth_tftpd.c:1167: error: syntax error before «bool»
    ./init/eth_tftpd.c: In function `FlashWriteStringTable’:
    ./init/eth_tftpd.c:1179: error: `STRING_TABLE1_ADDRESS’ undeclared (first use in this function)
    ./init/eth_tftpd.c:1181: error: `STRING_TABLE2_ADDRESS’ undeclared (first use in this function)
    ./init/eth_tftpd.c:1189: error: `StringTableStartAddr’ undeclared (first use in this function)
    ./init/eth_tftpd.c:1190: error: `file_size’ undeclared (first use in this function)
    ./init/eth_tftpd.c:1203: error: `from_NMRP’ undeclared (first use in this function)
    ./init/eth_tftpd.c:1204: error: `flash_write_string_table_ok’ undeclared (first use in this function)
    ./init/eth_tftpd.c:1209: error: `STRING_TABLE_SIZE’ undeclared (first use in this function)
    ./init/eth_tftpd.c: In function `prepareACK’:
    ./init/eth_tftpd.c:1485: error: `nmrp_tftp_runing’ undeclared (first use in this function)
    make[1]: *** [Output/eth_tftpd.o] Error 1
    make[1]: Leaving directory `/root/src/jwnr2000v2-V1.0.0.8_1.0.7_GPL/jwnr2000v2/bootloader/boot’
    make: *** [all] Error 2

  14. Я там случайно в английский блог запостил лог.
    Может нам пообщаться на каком-нить форуме на эту тему, где будет более удобно?

  15. @rostislav: дай ссылку на прошивку airlink (нет там её)-распотрошу (как и EDUP EP9501N-E) для просмотра…
    2. не помню точно, но вроде бы для изменения jwnr2000v2-V1.0.0.8_1.0.7_GPL/jwnr2000v2/bootloader требуется два установленных тулчайна рядом… (один для 8196В -берётся из src jwnr2000v1-v1.0.0.5 , другой -для 8196С)…

  16. VSG,

    Latest firmware 1.19 is now available. (High recommended for improving the wireless connection stability!)
    http://www.airlink101.com/LegacyFW/AR675W/BR6428N_Phoebe_v1_19_upg.bin
    Распотрошить ее не проблема, собрать назад не вышло. Тот сборщик crc не добавляет.
    Кстати, ее название нам намекает на роутер Edimax BR6428N, для которого тоже много добра выложено:
    http://www.edimax.com/images/Image/OpenSourceCode/Wireless/Router/BR-6228nS_C/Edimax_RTL8196C_GPL_20110916.zip
    Там кстати я нашел бинарники бутлоадера, которые пытался запихнуть в свой роутер, и доигрался.

  17. пришли, пожалуйста, мне на почту -по твоей ссылке я уже писал нет ничего…
    >Not Found
    >The requested document was not found on this server.
    >Web Server at airlink101.com
    по остальным ссылке спасибо, посмотрю…

  18. Господа, дико извиняюсь за некропостинг, но… в общем, нублю над трупом роутера WS-WN523N2. Подключившись через UART, с соплями и слезами получил приглашение вида

    rlx-linux login:

    все известные мне сочетания admin/admin, root/root, adminrlx/adminrlx и их сочетания залогиниться не позволили. Знает кто-нибудь волшебное слово?

Добавить комментарий