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/
Желающие рискнуть здоровьем и помочь в этом нелегком деле — стучитесь в почту.