sitelogo

By

Mainline Linux на китайских нетбуках WM8505/WM8650

Вот на дворе уже 2015-й, прошло примерно 4 года с момента появления в продаже китайских «нетбуков» на чипсетах WM8505\WM8650. К этому времени наверняка большинство уже раздолбало эти девайсы об стену, хотя ко мне в личку вконтакте ещё стучатся люди, которые с ними возятся. Так как использовать эти девайсы по назначению не слишком удобно, люди как правило хотят сделать из них мини сервер или Wifi точку доступа с плюшками в виде торрентов и прочих сервисов. На самом слабом WM8505 имеется 128 Мб памяти и встроенная флеш память, что в несколько раз больше, чем например, у роутеров D-Link.

У меня, как у коллекционера различных девайсов, давно валяются оба нетбука с WM8505 и WM8650 на борту, а также крутится упомянутая выше точка доступа, работающая месяцами без перезагрузки. К сожалению, эту статью я написал слишком поздно, ведь подобные девайсы «живут» на рынке не слишком долго.

Сборка ядра Linux

Некоторые считают, что китайское ядро от производителя, которое адаптировали под андроид, является лучшим выбором, так как в нём есть все необходимые драйверы. На самом деле, если мы не хотим бегать и перезагружать точку доступа каждый день, то ядро непременно нужно брать Mainline. То есть, последнее стабильное с kernel.org. Китайские ядра являются старым и убогим кошмаром, который в качестве фундамента для сервера не годится. Достаточно иметь хорошую поддержку USB, тогда отсутствующее встроенное оборудование легко заменяется внешним, как правило, более качественным.

Процесс сборки, к сожалению, как был, так и остается нетривиальным. Нужна рабочая система с Linux на борту и кросс-компилятором, правильный конфиг, и линуксоид с умением компилировать. Последние две вещи я и попытаюсь компенсировать.

Рабочий конфиг ядра 3.18.1 для WM8650/WM8505:

wm8505_wm8650_mainline_linux_3.18.1.config
Скачано: 199, размер: 57160, дата: 04.Апр.2015

WM8650 представляет собой WM8505 на стероидах (увеличили тактовую частоту), поэтому конфиг для них будет тот же самый. Разница будет только в Device Tree. Linux давно его использует для встраиваемых устройств, чтобы не перекомпилировать ядро по сто раз хотя бы в рамках аналогичных SoC.

Собирается ядро примерно следующим образом:

cd linux-x.y.z
export ARCH=arm
export CROSS_COMPILE=arm-none-eabi-
export INSTALL_MOD_PATH=./modules
make oldconfig
make
make modules_install
cat arch/arm/boot/zImage arch/arm/boot/dts/wm8505-ref.dtb > dtImage
mkimage -A arm -O linux -T kernel -C none -a 0x8000 -e 0x8000 -n "Linux-x.y.z" -d dtImage uImage

Этот пример подразумевает наличие .config файла в корневой директории с ядром (где папка Documentation), кросс-компилятора arm-none-eabi- (в ArchLinux даже не надо лезть в AUR), утилиты mkimage (пакет uboot-tools в ArchLinux). В итоге имеем каталог modules, содержимое которого будем копировать в rootfs, а также образ ядра, который нужно будет скопировать в загрузочный раздел uboot.

Cкомпилированный образ ядра 3.18.1 с модулями для тестов можно скачать ниже. У меня на github имеются патчи, активирующие SD контроллер для WM8650 и i8042 клавиатуру для WM8505. По каким-то причинам их пока не хотят брать в Mainline.

wm8505_wm8650_linux_mainline_kernel.tar.xz
Скачано: 194, размер: 5632676, дата: 04.Апр.2015

Особенности загрузчика WM8505/WM8650

U-Boot и W-Load находятся на внутреннем SPI флеше устройства. То есть, чтобы окончательно угробить девайс, нужно прошить U-Boot. Некоторые установщики Android или WinCE умеют это делать, эта флешка доступна для записи во время загрузки. Иногда прошить U-Boot становится необходимо, например, чтобы разрешить загрузку с USB (эти команды становятся доступны из скриптов U-Boot).

Все подобные устройства в первую очередь начинают загружаться с SD карты. WM8505 начинает исполнение скрипта /script/scriptcmd, а WM8650 /wmt_scriptcmd. Впрочем, всё зависит от содержимого переменных окружения U-Boot. Примеры загрузочных скриптов для помещения на SD карту имеются в архиве ниже. Также в этом архиве есть образ u-boot для WM8505 с поддержкой загрузки с USB.

wm8505_wm8650_boot.tar.xz
Скачано: 221, размер: 131208, дата: 04.Апр.2015

Если скрипт для загрузки с SD карты универсален, то скрипт для загрузки с внутренней флешки будет индивидуальным, в зависимости от способа её подключения. Флешка обычно подключается через USB или MTD, причем номера устройств на шине могут быть разными. То есть, писать скрипт для загрузки с внутренней флешки придется самому. Именно из-за подобного расхождения параметров железа в сети валяется куча разных прошивок, которые если и вообще установятся на девайс, будут поддерживать не всё оборудование. Создать какой-либо универсальный инсталлятор не представляется возможным.

На загрузочном диске должно быть два раздела: один FAT размером в несколько мегабайт (фактически — чтобы только поместилось ядро, 10 мегабайт хватит) и второй любой файловой системы, который занимает оставшееся место и хранит корневую файловую систему. Это относится к обычным секторным устройствам, MTD имеют особую разметку и файловые системы. В первый раздел копируется загрузочный скрипт и образ ядра, завёрнутый в формат U-Boot. Второй раздел форматируется в ФС вроде XFS, Ext4 или ReiserFS в случае использования Linux.

Linux Rootfs

После настройки загрузки (девайс загружает ядро в память, печатает процесс загрузки и вываливается в Kernel panic — not syncing), самое время заняться установкой корневой файловой системы Linux, то есть, установить дистрибутив. WM8505 и WM8650 оба относятся к пятой версии ARM, поэтому нужно искать armel порты дистрибутивов. Насколько мне известно, такие порты имеют как минимум ArchLinux и Debian.

У ArchLinux корневую систему можно взять здесь (ARM v5 Multiplatform). Для Debian лучше воспользоваться Debootstrap или найти готовый образ в Google.

Результат

На фото внизу мой запылившийся сервак, раздающий интернет. Благодаря netctl-auto умеет автоматически переключаться между различными WiFi сетями в случае отключения точки. Ну и всё такое прочее.

DSCN0048



30 Responses to Mainline Linux на китайских нетбуках WM8505/WM8650

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

Ваш адрес email не будет опубликован.