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
Скачано: 66, размер: 55.8 KB, дата: 03.Апр.2017

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
Скачано: 49, размер: 5.3 MB, дата: 03.Апр.2017

Особенности загрузчика 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
Скачано: 56, размер: 128.1 KB, дата: 03.Апр.2017

Если скрипт для загрузки с 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

  1. viron пишет:

    Надо же, что у меня в закромах лежало

  2. Владимир пишет:

    С этим ядром не работает клавиатура, тачпад и подсветка. Зато как я понял начиная с ядра 3.18 есть поддержка звука ES8328, но похоже тут его поддержка не включена

    • viron пишет:

      Поддержка железа в Mainline по минимуму. ES8328 нет, как и всей подсистемы ASoC для vt8500, даже в 4-м ядре, даже в каком-либо черновом варианте. Сейчас пытаемся хотя бы изменения для активации тачпада и клавиатуры протолкнуть. Подсветка там работает, но по неизвестной причине в DTS стоит неправильное значение, и подсветка на минимальной яркости (какое-то обсуждение было в vt8500 гуглогруппе). Решается правкой DTS файла.

  3. Роман пишет:

    Автор, очень хорошая статья) вы не могли бы мне написать на почту? хочу с вами пообщаться ***@ya.ru

  4. Аноним пишет:

    Здравствуйте!
    Подскажите, пожалуйста, как собрать ядро для wm8650 на Ubuntu 14.04.
    Пробовал собирать с помощью тулчейна arm-linux-gnueabi ( Linaro 4.8.2). Загрузка не происходит. Все замирает. Конфиг по мануалу https://github.com/linux-wmt/linux-vtwm/wiki/Build-the-source
    Собрать с arm-none-eabi (4.8.2-14ubuntu1+6) не получается, пишет про плохой компилер.
    CC arch/arm/kernel/asm-offsets.s
    arch/arm/kernel/asm-offsets.c:54:2: error: #error Your compiler is too buggy; it is known to miscompile kernels
    #error Your compiler is too buggy; it is known to miscompile kernels
    ^
    arch/arm/kernel/asm-offsets.c:55:2: error: #error and result in filesystem corruption and oopses.
    #error and result in filesystem corruption and oopses.
    ^
    make[1]: *** [arch/arm/kernel/asm-offsets.s] Ошибка 1

    Насколько я понимаю, придется собирать тулчейн вручную?

    • viron пишет:

      У меня такой: arm-none-eabi-gcc (Arch User Repository) 4.9.2 20140904 (prerelease)
      Советую действительно взять версию поновее, некоторые компиляторы выдают испорченный бинарник.
      В Linux можно сделать контейнер под rootfs какого-нибудь archlinux, я вышеуказанный компилер взял из репозитория, ничего компилировать не надо. Еще обратите внимание на 0x8000 смещение, когда делаете mkimage. Ну и прицепить DTB файл в конец zImage.

      • Аноним пишет:

        Я разобрался. Похоже ядро не работало из-за превышения размера. Собрал минималистично и загрузился. Тулчейном linaro. Ядро ванильное 4.6.

        С поддержкой устройств каких бед ждать?

        • viron пишет:

          Железа поддерживается меньше, но оно хотя бы работает более менее стабильно. Под мини сервак самое то.
          Судя по вашей ссылке, вы взяли ядро Tony Prisk’а. Там есть большое кол-во кода, которое не попало в Mainline. Ценой этого лишаетесь возможности обновлять версию.
          USB тупит иногда и WiFi адаптеры, если выдёргивать во время работы. Ethernet китайский и не со всеми свитчами дружит.
          Больше никаких проблем не замечал.

  5. Гена пишет:

    Здравствуйте Роман.
    Подскажите, где скачать ваш патч на клавиатуру? На сайте и хитхабе не нашел. Спасибо.

    • viron пишет:

      Добрый день,
      На гитхабе есть репозиторий mainline ядра, в нём бренчи. Можно переключиться на бренч и сделать git format-patch.
      Ещё в LKML они лежат, можно их оттуда вытащить.

  6. Дима пишет:

    Здравствуйте!
    Делаю компиляцию ядра компиляторами начиная с версии gcc 4.7.2. Компиляция ядра и модулей проходит без ошибок. Модули (папку lib) копирую в корень файловой системы. Подтверждаю замену. uImage собираю как написано у вас:
    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
    Но девайс не стартует. Также не работает uImage c этой стати.
    Работает только от сюда http://v1ron.ru/obraz-debian-dlya-netbukov-na-baze-arm-chipseta-wm8505/. Какую версию компилятора вы использовали там?

    • viron пишет:

      Добрый день,
      WM8505\8650 между собой точно не перепутали? В scriptcmd точно uImage загружается? Сам scriptcmd правильный?
      Ещё бывает яркость экрана сбивается и еле видно, если приглядеться то видно консоль. После перезагрузки восстанавливается.
      Я тестировал у себя эти образы, работало…

      • Дима пишет:

        Приветствую,
        Не перепутал точно. Файл scriptcmd ваш и там я ничего не менял. Только заменял сам файл uImage (+ модули в корень фс копировал). Сбой яркости при попытке использовать uImage с ядром 3.18.1 наблюдалось, а также не рабочая клавиатура и я воспринял это как не работающее ядро. Доходило ввода логина и пароля, и на этом все.

        • viron пишет:

          Это тестовые образы, просто для проверки, что загружается. Видимо патч на клавиатуру не был включён (там эмуляция i8042). Собрать mainline не сложно, по сравнению с китайскими поделками. Компилятор обычный берёте, что из репозиториев, arm-none-eabi- работает без проблем на ArchLinux. Патч на клавиатуру нужно накатить самостоятельно, яркость менятся правкой DTS файла.

          • Дима пишет:

            Компиляторы брал от сюда — https://archlinuxarm.org/builder/xtools/
            Самое странное, что не один образ скомпилированный мной не дает реакции. Просто висит надпись Loading Live CD…

          • viron пишет:

            Значит действительно образ неправильно собран. Нужен armv5 тулчейн, armhf не будет работать. https://archlinuxarm.org/builder/xtools/4.7.2/x-tools.tar.xz должен подойти, там ещё лежат armv6 и armv7. Ну и если DTB файл не в конец образа, а в начало прилепишь, то тоже не загрузится. Конфиг нужно проверить как следует, точно ли включен драйвер дисплея и т.п. (framebuffer). Просто для примера, какие ошибки бывают.
            make ARCH=arm CROSS_COMPILE=arm-none-eabi- не забыть

          • Вадим пишет:

            Использовал именно armv5 тулчейн. Компиляцию запускал с этими флагами ARCH=arm CROSS_COMPILE=arm-none-eabi-. Можно попросить уточнить по поводу: «ну и если DTB файл не в конец образа, а в начало прилепишь, то тоже не загрузится.» что вы имели виду? Как прилепить его в конец?

          • viron пишет:

            Если примеры из статьи брали (команда cat), то всё прилепится как надо. Читаю комментарии, у кого-то из-за размера не загрузилось, я с таким сам не сталкивался. Один раз было, в scriptcmd вместо uImage написал /uImage, и не загружался (из-за лишнего слеша…). Короче, много причин может быть.

          • Вадим пишет:

            У меня такая же проблема с образами uImage. Не запускаются. Конфиг настраивал стандартный, добавляя нужные драйвера.

          • Дима пишет:

            Я взял конфиг от вашей тестовой сборки и скорректировал его. Достал патч на клавиатуру и успешно наложил его. Файл DTS настроить не смог — яркости нету. Видать опыта мало =) в итоге пропала поддержка gpio(нету каталога /sys/class/gpio). Драйвер на ethernet(VIA) не завелся. Но радует, что образ запустился.

          • viron пишет:

            Вот, уже прогресс :) Яркость в исходниках надо поменять, где-то в конце /drivers/video/fbdev/wm8505fb.c есть wm8505_probe, а в ней fbi->contrast = 0x10. Надо поменять на 0x80. Не знаю, почему по умолчанию такое маленькое значение.

          • Дима пишет:

            Пришлось разобрать девайс, чтобы установить модели чипов на звук, ethernet, внутреннюю память (флешка или NAND стоить).
            Sound — VIA Vinyl VT1613 (в ядре инфы нет)
            Ethernet — VIA VT6113 (в ядре инфы нет. К моделям Rhine и Velocity не относится)
            Внутренняя память — NAND 2Гб(что очень хорошо) и нужно как-то сделать с нее загрузку.

          • viron пишет:

            Ага, так обычно и делают, ибо понять что там вообще находится по-другому затруднительно. В mainline нет ни звука, ни NAND, желающие сами могут допилить :) Странно, что Ethernet другой, ни разу не встречал что-то кроме Rhine и Velocity.

  7. Дима пишет:

    Разобрался в чем там дело с GPIO. Не внимательно редактировал конфиг. Там есть раздел, где добавить можно /sys/class/gpio. А вот яркостю беда пока что

  8. Аноним пишет:

    Собрал актуальное ядро и поставил дебиан. Попытался установить LXDE.

    В иксах не работает клавиатура и тачпад. Можно ли что-то с этим сделать?
    /proc/bus/input/devices http://pastebin.com/WWSWbzxj
    В консоли клавиатура работает.

  9. Аноним пишет:

    Шпаргалка по сборке ядра для wm8650. Была полезна.
    https://sites.google.com/site/basile/linux/otros/android/wm8505—sd

    Мой конфиг ядра, составленный вручную из allnoconfig
    http://pastebin.com/HqnNQCaN
    Работает сеть и wifi. У меня нетбук на wm8650.

    • viron пишет:

      Спасибо за ссылки. По клавиатуре с тачпадом не припоминаю проблем, оно работало из коробки. Только с framebuffer были проблемы, решались конфигом Xorg. Там обычный PS/2 драйвер, если работает консоль, значит драйверы есть. Надо смотреть лог xorg, проверять конфиг (есть смысл удалить его временно, т.к. устройства в Xorg могут найтись автоматически).

      • Аноним пишет:

        Без конфига не работает. С конфигами тоже.
        Лог http://pastebin.com/MHCtnnbQ
        С фреймбуфером проблем вроде нет, изображение в норме.

        Не могли бы вы дать рабочий конфиг посмотреть?

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

Ваш e-mail не будет опубликован.