?

Log in

No account? Create an account
Previous Entry Share Next Entry
Прошиваем OpenWRT на Asus WL520GU
djnewborn
Как-то давно собирался сделать девайс для удалённого воспроизведения сетевого mp3(/ogg/aac+) потока. В частности, для использования в составе пиратского FM-передатчика, но и необязательно только для него.



Пошукав инторнеты, наткнулся на уже готовый проект http://mightyohm.com/blog/2008/10/building-a-wifi-radio-part-3-hacking-the-asus-wl-520gu/
Там в общем-то всё детально расписано, поэтому его я использовал как основу для реализации своей задачи. Но, инфа, которая там представлена, либо недописана либо протухла на текущий момент. Поэтому пришлось во всё вникать и, как обычно, действовать экспериментальным путём.

Сам девайс уже давно снят с производства, и в продаже вы его не найдёте. В поиск - либо всячески молотки.ру-авиты, либо, как в моём случае - ebay.
Я купил 2 шт. К слову, по архитектуре он довольно тормозной и древний, поэтому лучше поискать более мощный подходящий роутер (в этом можно убедиться, прочитав пост до конца. Но всё зависит от поставленных задач). Чтобы крутить mp3 поток, вполне достаточно подобного девайса. Как вариант замены, предлагают Asus RT-N10U, который я тоже заказал. Как приедет - буду тестировать его. По железу он обещает быть лучше, чем 520й. Главное, что там 8 Мб флеша, вместо 4х, что важно в нашем случае. Оперативки также в 2 раза больше (32 против 16 Мб). Более быстрый USB (2.0). Более свежая прошивка (ядро).

В принципе, для начала, 520й - весьма неплохой девайс, и довольно распространённый.

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



Тут будет пошагово описан процесс установки.

Для начала, прочитайте статьи на mightyohm по ссылке, приведённой выше. Прочитав, понимаем, что для успешного хакинга роутера потребуется паяльник и кабель FTDI-USB (или FTDI-RS232). В общем, конвертер из лог. уровней COM-порта в ТТЛ-уровни 0+3В. В принципе, прошить роутер можно без припаивания консольного кабеля. Но как поменять рутовый пароль после прошивки, если выпилена веб-морда, я не понял. В любом случае, для дебагинга, консольный порт всё равно лучше иметь.
Паяльник, разумеется, у меня уже был, а кабель USB-FTDI приобрёл также на ebay. Желающие могут спаять его самостоятельно на мелкосхеме MAX232 или аналогичных, схем в сети навалом.
Ну и для прошивки потребуется комп с Linux. Я использовал CentOS 6.2 i386 с последними обновлениями.
Также стоит сразу определиться с устройствами, которые вы хотите подключить. Поскольку порт всего один, потребуется USB-хаб. Этот вариант я еще не прорабатывал.
В качестве звуковой карты я взял Creative X-Fi Go! http://www.ixbt.com/multimedia/creative-xfi-go.shtml Этот свисток примечателен тем, что содержит в себе флешку на 1 Гб. Что нам очень и очень потребуется, ибо встроенной флеш-памяти в роутере для всего не хватит.

Вскрываем роутер (винты находятся под резиновыми ножками в том числе).
По-хорошему, надо напаять на плату "гребёнку" из 4х контактов. Такой у меня под рукой не оказалось, поэтому просто напаял сверху отрезки провода. Припой тугоплавкий (бессвинцовый, судя по всему), поэтому паяльник надо разогревать на 400+ градусов (У меня паяльная станция).
Подключаем кабель FTDI. Распиновку ищите в даташитах, распиновка контактов на роутере - (сверху вниз на фото) - GND, TX, RX, 3.3V. Соответственно, надо соединить землю, и RX-TX - TX-RX кабеля и роутера. 4й контакт 3.3 В подсоединять не надо.



Запускаем этот ваш любимый терминальный клиент. Я использовал PuTTY. Скорость порта нужно выставить 115200, иначе будут кракозябры вместо текста.
Если руки не слишком кривые, и все подключено верно, вы увидите окно терминала и процесс загрузки. Итак, первый этап, можно сказать, успешно пройден. Роутер не убит, COM-порт тожё, всё работает. Если загрузка всё же не идет - проверяйте настройки терминальника, либо корректность подключения кабеля. В принципе, если не так подсоедините RX-TX, ничего страшного не произойдет.



Далее, собственно про OpenWRT. Идём и вкуриваем сюда: http://wiki.openwrt.org/toh/asus/wl520gu
К сожалению, из-за древней архитектуры чипа, как и писал выше, в роутер можно прошить только ядро 2.4. Со всеми вытекающими отсюда последствиями, таковыми как трудность или невозможность компиляции современных версий пакетов под данное ядро, и тд и тп.
Прошить 2.6 вроде бы можно, но, читайте по ссылке - не будет работать WiFi, а также глюки и нестабильная работа вам обеспечены. В общем, для нормальной работы нужно 2.4 ядро.
Теперь приступим к подготовке файла прошивки.
Есть несколько способов: скачать уже готовый файл, напиханный какими-то базовыми пакетами, скомпилировать из исходников самостоятельно, либо использовать Image Generator. http://wiki.openwrt.org/doc/howto/obtain.firmware.generate
Я решил использовать последний способ, как наиболее рациональный. Убивать время на компиляцию с нуля как-то не хочется, а скачав готовый образ, потом придётся вычищать его от ненужных пакетов.

Идём по ссылке (актуально на 06.2012) http://downloads.openwrt.org/kamikaze/8.09.2/brcm-2.4/
И качаем тот самый Image Builder.
Распаковываем скачанный .tar.gz куда-либо, и теперь начинаем кастомизировать.

В принципе, по ссылке http://wiki.openwrt.org/doc/howto/obtain.firmware.generate всё достаточно хорошо описано, но чтобы не грузить вас деталями, сразу напишу, что мы меняем/добавляем.

В распакованном каталоге видим files/. Это та папка, поместив файлы в которую, мы увидим их в файловой системе на устройстве, после прошивки. Если существующие файлы уже есть в образе, они будут перезаписаны.
Таким образом, можно подменить заранее любые конфиг - и не только - файлы, что нам нужны.
Универсального совета тут не будет. Принцип таков - либо читайте доку, и подсовывайте заранее те файлы, что считаете нужными, либо берите уже настроенные конфиги из роутера, и копируйте их через scp или ещё как в эту папку. Это нужно, чтобы не похерить уже созданные файлы после перепрошивки, либо для тиражирования кастомной прошивки)

Теперь про кастомизацию пакетов.
Топаем в OpenWrt-ImageBuilder-brcm-2.4-for-Linux-i686/target/linux/brcm-2.4 и видим папку profiles. Либо копируем её, либо удаляем всё оттуда. Можно создать полностью свой файл, я использовал USBGeneric.mk как наиболее близкий. Приведу на всякий случай его вывод:

[root@localhost profiles]# cat USBGeneric.mk
#
# Copyright (C) 2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

define Profile/USBGeneric
NAME:=Generic USB
PACKAGES:=kmod-brcm-wl kmod-usb-core kmod-usb-ohci kmod-usb2 wlc nas kmod-wlcompat kmod-usb-storage kmod-fs-ext3 kmod-scsi-generic kmod-nls-cp1251 kmod-nls-utf8 kmod-usb-audio kmod-sound-core kmod-alsa ntpclient
endef

define Profile/USBGeneric/Description
Package set with for Broadcom routers with USB/USB2 (OHCI/EHCI) support.
Includes the WRTSL54GS, WL-520gU, WL-500gP v2, any other BCM5354 routers
with USB.
endef
$(eval $(call Profile,USBGeneric))

Собственно говоря, в ту строку PACKAGES: вписываем имена всех тех пакетов, что нам нужны после установки. Отмечу ещё раз, что все пихать сюда не стоит - не хватит места на встроенной флеш-памяти. Однако модули ядра придется ставить на встроенную память. С USB флешки могут и не загрузиться. В общем, тут только эксперимент. Названия (и собственно список) пакетов тут: OpenWrt-ImageBuilder-brcm-2.4-for-Linux-i686/packages

На этом кастомизация прошивки, в принципе завершена. Тут всё зависит от того, что вам нужно получить. Читайте документацию :)

Идём в "корень" и запускаем:
[root@localhost OpenWrt-ImageBuilder-brcm-2.4-for-Linux-i686]# make image PROFILE=USBGeneric FILES=files/

Перед этим желательно очистить папку OpenWrt-ImageBuilder-brcm-2.4-for-Linux-i686/bin

PROFILE=USBGeneric как раз указывает на файл USBGeneric.mk

Дальше наблюдаем занимательный процесс сборки, тут всё зависит от скорости вашей Linux-машины.

Переходим в OpenWrt-ImageBuilder-brcm-2.4-for-Linux-i686/bin и видим готовые файлы прошивок.

Включаем наш роутер, удёрживая кнопку Reset. Дожидаемся ровного мигания индикатора Power, при этом в консоле можно наблюдать следующее:

Null Rescue Flag.
Hello!! Enter Rescue Mode: (by Force)

Reading :: TFTP Server.
Failed.: Timeout occurred
Reading :: TFTP Server.
Failed.: Timeout occurred
Reading :: TFTP Server.
Failed.: Timeout occurred
Reading :: TFTP Server.

Всё ок. Возвращаемся к Linux машине, и меняем сетевые настройки так, чтобы мы оказались в сети 192.168.1.0/24 (адрес 1.1 занят роутером, так что возьмите, например 1.10)

Находясь в bin/, вбиваем команду:

[root@localhost bin]# atftp --trace --option "timeout 1" --option "mode octet" --put --local-file ~/openwrt-brcm-2.4-squashfs.trx 192.168.1.1

И в консоли видим процесс прошивки:
TFTP_BLKLEN!!
Done. 2101248 bytes read
Download of 0x201000 bytes completed
Write kernel and filesystem binary to FLASH (0xbfc20000)
Programming...

Нужно дождаться надписи окончания прошивки:
copysize=2101248, amtcopy=2101248
done. 2101248 bytes written

Всё, теперь перезагружаем роутер и пялимся в консоль.

Первый раз загрузка идёт долго, т.к. идёт первоначальная инициализация конфигов и форматирование встроенного flash-хранилища.

Вот теперь вроде бы готово:
jffs2_scan_eraseblock(): End of filesystem marker found at 0x0
jffs2_build_filesystem(): unlocking the mtd device... done.
jffs2_build_filesystem(): erasing all blocks after the end marker... done.
mini_fo: using base directory: /
mini_fo: using storage directory: /jffs

Жмём Enter и видим приглашение консоли:




BusyBox v1.11.2 (2009-12-02 06:19:32 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
KAMIKAZE (8.09.2, r18961) -------------------------
* 10 oz Vodka Shake well with ice and strain
* 10 oz Triple sec mixture into 10 shot glasses.
* 10 oz lime juice Salute!
---------------------------------------------------
root@OpenWrt:/#


Первым делом, наверное, стоит поменять пароль рута :)

Ну а дальше начинаем подготовку flash-накопителя 1 Гб, который содержится в нашей звуковухе.

Сначала убеждаемся, что сеть работает:

root@OpenWrt:/# ifconfig
br-lan Link encap:Ethernet HWaddr 00:1D:60:19:C6:43
inet addr:192.168.10.220 Bcast:192.168.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:850 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:59784 (58.3 KiB) TX bytes:2018 (1.9 KiB)

eth0 Link encap:Ethernet HWaddr 00:1D:60:19:C6:43
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:854 errors:0 dropped:0 overruns:0 frame:0
TX packets:69 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:78766 (76.9 KiB) TX bytes:26316 (25.6 KiB)
Interrupt:4

eth0.0 Link encap:Ethernet HWaddr 00:1D:60:19:C6:43
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:850 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:63184 (61.7 KiB) TX bytes:2058 (2.0 KiB)

eth0.1 Link encap:Ethernet HWaddr 00:1D:60:19:C6:43
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:23954 (23.3 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

root@OpenWrt:/#

Если нет, идем и копаем /etc/config/network либо /etc/config/wireless в случае коннекта по WiFi. К счастью, наш броадкомовский чип умеет поднимать WLAN в режиме моста, что весьма неплохо - получаем IP-адрес также, как в случае проводного подключения, никакого NAT не нужно.

ОК, сеть заработала, значит можно что-нибудь доставить:

Обновляем репозитарий:
root@OpenWrt:~# opkg update

Ставим утилиты, необходимые для работы с накопителями:
root@OpenWrt:~# opkg install fdisk e2fsprogs

Стираем всё, что есть на флешке:
root@OpenWrt:~# dd if=/dev/zero of=/dev/scsi/host0/bus0/target0/lun0/disc bs=1K count=1

Смотрим:
root@OpenWrt:~# fdisk -l

Disk /dev/scsi/host0/bus0/target0/lun0/disc: 1008 MB, 1008730112 bytes
32 heads, 61 sectors/track, 1009 cylinders
Units = cylinders of 1952 * 512 = 999424 bytes
Disk identifier: 0x00000000

Disk /dev/scsi/host0/bus0/target0/lun0/disc doesn't contain a valid partition table

Оок! Видно флешку.

Запускаем fdisk и создаем primary partition
root@OpenWrt:~# fdisk -u /dev/scsi/host0/bus0/target0/lun0/disc

Можно разбить 1 Гб на отдельные разделы, это по вашему же желанию.

Создаём файловую систему:
root@OpenWrt:~# mkfs.ext3 /dev/scsi/host0/bus0/target0/lun0/part1
root@OpenWrt:~# mkfs.ext3 /dev/scsi/host0/bus0/target0/lun0/part2

Тормозим fstab:
root@OpenWrt:~# /etc/init.d/fstab stop

Тут будут монтироваться наши разделы (вообще шаг можно пропустить)
root@OpenWrt:~# mkdir -p /mnt/usbdisk0
root@OpenWrt:~# mkdir -p /mnt/usbdisk1

И добавляем новую точку монтирования:
root@OpenWrt:~# uci add fstab mount
root@OpenWrt:~# uci set fstab.@mount[-1].device=/dev/sda1
root@OpenWrt:~# uci set fstab.@mount[-1].options=rw,sync
root@OpenWrt:~# uci set fstab.@mount[-1].enabled_fsck=0
root@OpenWrt:~# uci set fstab.@mount[-1].enabled=1
root@OpenWrt:~# uci set fstab.@mount[-1].target=/mnt/share
root@OpenWrt:~# uci commit fstab
root@OpenWrt:~# /etc/init.d/fstab start

Все это хранится в /etc/config/fstab
Так что если вы заранее его подсунули при компиляции образа, нужно только отредактировать файл, задействовав шару.

Стартуем:
root@OpenWrt:~# /etc/init.d/fstab start

И убеждаемся, что всё примонтировалось:

root@OpenWrt:/# df -h
Filesystem Size Used Available Use% Mounted on
rootfs 1.4M 1.4M 0 100% /
/dev/root 1.4M 1.4M 0 100% /rom
tmpfs 7.0M 696.0k 6.3M 10% /tmp
mini_fo:/tmp/root 1.4M 1.4M 0 100% /tmp/root
/dev/mtdblock/4 1.9M 780.0k 1.1M 41% /jffs
mini_fo:/jffs 1.4M 1.4M 0 100% /
/dev/scsi/host0/bus0/target0/lun0/part1
118.2M 5.5M 106.6M 5% /mnt/usbdisk0
/dev/scsi/host0/bus0/target0/lun0/part2
826.7M 16.9M 767.8M 2% /mnt/usbdisk1


Теперь пора отредактировать opkg.conf, чтобы получить возможность ставить пакеты на нашу флешку:

root@OpenWrt:~# vi /etc/opkg.conf

Дописываем строку:
dest usb0 /mnt/usbdisk0


Двигаем подальше fstab - у меня были проблемы с тем, что разделы на флешки не монтировались при перезагрузке.
root@OpenWrt:~# rm -f /etc/rc.d/S20fstab
root@OpenWrt:~# ln -s /etc/init.d/fstab /etc/rc.d/S42fstab

Заодно, уберем файл, отвечающий за обнаружение аудиокарт - он нам будет мешать:
root@OpenWrt:~# mv /etc/modules.d/60-usb-audio ~/

-- тут можно перезагрузить роутер --

После перезагрузки убеждаемся, что всё подмонтировалось, и сеть работает.

Для воспроизведения музыки, нам потребуются библиотеки alsa и демоны mpc + mpd.

mpd пришлось качать патченный, так как родной не воспринимал http ссылки. вот вам и очередной минус ядра 2.4. в 2.6 это уже все поправлено.

Создадим папку, куда будем качать дистрибутивы (хотя , можно хоть в /tmp)

root@OpenWrt:~# mkdir /mnt/usbdisk1/root
root@OpenWrt:~# cd /mnt/usbdisk1/root

Качаем и ставим недостающие пакеты, указав в качестве назначения внешний раздел на флешке:
root@OpenWrt:~# wget http://www.liacs.nl/~jwitteve/openwrt/8.09/brcm47xx/packages/mpd_0.14.2-1_mipsel.ipk
root@OpenWrt:~# opkg update && opkg -dest usb0 install mpd_0.14.2-1_mipsel.ipk mpc alsa-lib alsa-utils faad2

Поскольку поставили мы все в альтернативный раздел, а не в рутовый, придется создать некоторое количетво символических ссылок:
root@OpenWrt:~# ln -s /mnt/usbdisk0/usr/share/alsa/ /usr/share/ && ln -s /mnt/usbdisk0/usr/share/terminfo/ /usr/share/
root@OpenWrt:~# ln -s /mnt/usbdisk0/usr/bin/mpc /usr/bin/mpc && ln -s /mnt/usbdisk0/usr/bin/mpd /usr/bin/mpd

Создаем нужные для работы mpd подкаталоги и бекапим настройки:

root@OpenWrt:~# mkdir -p ~/music ~/.mpd/playlists && ln -s /mnt/usbdisk0/etc/mpd.conf /etc/mpd.conf.ex && ln -s /mnt/usbdisk0/etc/init.d/mpd /etc/init.d/mpd.ex

-- тут можно перезагрузить роутер --


Запускаем mpd:

root@OpenWrt:/# mpd
No "audio_output" defined in config file
Attempt to detect audio output device
Attempting to detect a alsa audio device
Successfully detected a alsa audio device
root@OpenWrt:/#


Если матерится на ошибки в библиотеках - попробуйте ещё раз ребутнуть роутер.

Ну а дальше просто добавляете ссылку на интернет-станцию, и запускаете воспроизведение:

mpc add http://~~~ && mpc play



------------

Несколько замечаний: поскольку карта полу-софтовая, то на воспроизведение звука тратится ресурс CPU роутера. Для качественного воспроизведения лучше поискать карту получше.
Поток лучше подавать в 48 кГц, а не 44.1. Так звучание на этой звуковой карте получается более насыщенным.

Во время воспроизведения можно заметить небольшие попердывания/искажения звука. Тут либо проц захлебывается, либо не хватает пропускной способности USB шины.
ААС+ у меня не получилось воспроизвести, OGG не проверял. В любом случае, надо мигрировать на ядро 2.6 и пробовать более свежую версию mpd.

Можно загрузить .m3u плейлист, насовав туда нужных станций.
Управление mpd возможно как с ПК, так и с мобильных устройств, что удобно. Под Android мне понравился BitMpc.

-----

Не удалось поставить mpd в автозапуск устройства - чего-то не хватает.
Также, в BitMPC и аналогичных программах, не отображается исполнитель/название песни.



  • 1
ого, вот это подробности )

Надо же всё куда-то залогировать, делал неделю назад, вот пока писал пост уже часть забыл, пришлось на ходу вспоминать.

Зато теперь инет радио на центре можно слушать при выключенном ПК, что дает ++++++ к шуму и +++++++ к энергопотреблению.

(Deleted comment)
Приехал, но я его не расковырял ещё.

  • 1