Русский
Русский
English
Статистика
Реклама

Портирование linux

Установка Linux на калькулятор

15.02.2021 12:06:03 | Автор: admin


Достаточно давно я мечтаю об устройстве, которое на своём борту будет иметь экран с тачскрином, аппаратные кнопки, и на котором без особых проблем будет работать linux. Ну и конечно же у неё будет достаточное количество интерфейсов. В своё время, надежды подавал проект Vogue, но сегодня я нашел его идеальное устройство для карманного ношения, с мощным процессором и linux на борту. Итак, это калькулятор HP Prime G2. Там стоит шикарный процессор i.mx6ull, с которым у меня достаточно богатый опыт работы, поэтому портирование linux не казалось слишком сложной задачей. Однако, как обычно, дьявол кроется в мелочах.

Хочу поведать вам о своём тернистом пути установки Linux на калькулятор, что из этого получилось, а что нет, судить вам!

Проект Linux for HP Prime G2


Несмотря на то, что я достаточно много провозился с данным проектом, и в целом даже внёс собственный вклад в его развитие, всё же основной веткой проекта, с которой всё началось, следует считать Linux for HP Prime G2 от zephray. Но, как обычно, бывает в подобных проектах, если попробовать всё повторить по инструкции, то нифига работать не будет, и ты соберёшь тысячи граблей, которые автор по тем или иным причинам забыл упомянуть. Поэтому, в данной статье, я постараюсь обратить ваше внимание на эти нестыковки, расскажу как их обойти, а также выложу заведомо рабочие сборки ядра и rootfs.

Следует понимать, что я ничуть не хочу бросить какую либо тень на zephray. Это человек-титан, который заслуживает настоящего восхищения. Он проделал поистине титаническую работу по портированию этого добра на калькулятор. По сути, как это обычно бывает, он адаптировал конфиги отладочной платы под текущее устройство. А также, там был написан драйвер дисплея, правильно сконфигурирован загрузчик u-boot, корректно составлен dts-файл (файл дерева устройств), куча кода в самом ядре. Не стоит забывать, что всё это было проделано без схемы и документации, так что количество проделанной работы просто захватывает дух, и всё это на голом энтузиазме. К сожалению, объём и формат статьи не позволит мне подробно пройтись по коду, хотя там в действительности есть на что посмотреть, и где снять шляпу в восхищении!

Но уж больно много кода, как в ядре, загрузчике, так и в дереве устройств. Закончу главу цитатой с Баша:

callidus77:
Помница в нашей сетке монтажники подключали абонента. Пришли, воткнули сетевуху, а у него Фря и дров нету. Почесали головы и ушли. Чел через три недели наконец-то коннектится.
Грят: Долго ж ты искал дрова.
Он: Я не искал. Я их сам написал.

Как оказалось, установка линукс на калькулятор превратилась из приятной прогулки на пол часика, в настоящий квест на пару недель.

Подопытный кролик


Для старта нам понадобится калькулятор HP Prime G2 (2AP18AA). Поскольку есть некислый шанс, что под одним названием может скрываться несколько различных устройств, привожу фотографии и описание того как он выглядит и как определить что это именно то устройство, которое вам нужно.



Для того, чтобы убедиться, что это именно наш калькулятор, надо открыть помощь (кнопка Help) и там открыть раздел о калькуляторе (Вторая строка сверху в меню). У вас должно быть что-то типа этого.


О калькуляторе.

Скажу сразу, в нашей стране только одна компания продаёт данные калькуляторы (по крайне мере других я не нашёл), так что не должно возникнуть проблем с покупкой, разве что, кроме его цены. Но всё это стоит того!

Подготовка к установке Linux на калькулятор


Для старта нам понадобится сделать некоторые мероприятия. для установки Linux в Nand или запуск этой ОС в RAM необходимо снять заднюю крышку калькулятора, что по определению сразу лишит вас гарантии (помните об этом перед началом работы). Все манипуляции выполнялись в linux mint 18.2 (всё аналогично должно работать в Ubuntu 18.04).
Потребуется:

  • калькулятор HP Prime G2 (2AP18AA);
  • кабель USB (USB A Micro B) для соединения Prime с ПК;
  • отвертка;
  • пинцет (токопроводящий или с перемычкой), либо кнопка на проводах;
  • ПК на Linux или Windows 7+;
  • дистрибутив HP-Prime-Linux (далее я дам чуть другую ссылку, по данной он не совсем корректно работает).
  • Утилита uuu (Universal Update Utility), воходящая в пакет mfgtools 3.0 .https://github.com/NXPmicro/mfgtools .

Ставим необходимый софт


Для начала, подготовим программный плацдарм и убедимся, что он работает. Для начала соберём утилиту uuu.

git clone https://github.com/NXPmicro/mfgtools.gitcd mfgtoolssudo apt-get install libusb-1.0-0-dev libzip-dev libbz2-dev pkg-config cmake libssl-dev g++cmake . && make

И тут я получил ошибку cmake В результате, пришлось обновлять утилиту cmake. Для этого, я выполнил следующие команды:

wget -qO - https://apt.kitware.com/keys/kitware-archive-latest.asc |    sudo apt-key add -sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'sudo apt-get updatesudo apt-get install cmake

После успешной сборки, я решил установить пакет., но поскольку нам бьют по рукам, когда мы делаем make install, сделаем по науке и установим с помощью утилиты checkinstall.

sudo checkinstall

В результате мы имеем установленный пакет mfgtools, который в случае нужды можно удалить командой

dpkg -r mfgtools

Проверяем, что всё работает и едем дальше.

uuu -huuu (Universal Update Utility) for nxp imx chips -- libuuu_1.4.69-0-g63b1d3cuuu [-d -m -v -V] <bootloader|cmdlists|cmd>    bootloader  download bootloader to board by usb    cmdlist     run all commands in cmdlist file                If it is path, search uuu.auto in dir                If it is zip, search uuu.auto in zip    cmd         Run one command, use -H see detail....

Аппаратная подготовка


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


Снимаем аккумулятор.

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


Вскрываем пластиковый корпус.

После всех действий, мне предстали недра калькулятора и теперь, я почти готов к самым варварским экспериментам.


Недра.

У меня практически всё готово, для запуска linux на данном калькуляторе. Но есть нюанс (с). Для первичного запуска необходимо закоротить два пада. Как рекомендует автор:
Откройте корпус калькулятора, соедините его USB кабелем с ПК и запустите.
Предупреждение: будьте осторожны. Замыкание не тех контактов может вызвать необратимое повреждение оборудования калькулятора.
При включенном калькуляторе с помощью пинцета замкните две показанные на фото контактные площадки и нажмите кнопку Reset (находится с задней стороны панели клавиш). На ПК должно отобразиться новое USB-устройство SE Blank 6ULL. (Пользователи Linux могут проверить подключение нового Feescale USB-устройства с помощью lsusb)


Внимание: вы замыкаете контакт Boot Mode на землю. По умолчанию этот контакт подключен к 3.3В через подтягивающий резистор 10кОм.
Далее, вам будет доступно два варианта. При этом, вы сможете поочередно выполнить ряд действий без перезагрузки калькулятора. Например, в одном из вариантов сначала сделать резервную копию памяти NAND, после чего прошить в нее ОС Linux, не прибегая к перезагрузке.

Я решил, что не готов дрожащей рукой закорачивать едва заметные пады для загрузки. Эта операция нам потребуется всего один раз (так что, конечно можно и рискнуть), поэтому я всё же решил обезопасить себя и припаял кнопку.


Кнопка для загрузки.

Обращаю внимание, что кнопка нужна только если вы не хотите стирать содержимое калькулятора и готовы разово запустить linux в ОЗУ и успокоиться. В целом, при прямых руках и уверенности в завтрашнем дне, можно обойтись одним пинцетом.
Всё, мы практически одной ногой готовы к запуску линукс, но у нас ничего не получиться.

Установка Linux, хождение по граблям


Прежде, чем мы перейдём к реальной установке linux на калькулятор, ко всем возникшим сложностям, хочу обратить ваше внимание на одну деталь. Перед тем, как повторять чужие инструкции (в том числе и приведённые в этой статье), убедитесь, что все файлы, которые должны лежать в установочных архивах присутствуют, то что вы исполняете именно ту команду, которая нужна. Если вы выполняете чужой скрипт, проверьте содержимое этого скрипта. Если вам непонятно что там написано, то разберитесь что же там происходит, и тогда есть некислый шанс, что если уж не заработает всё, то вы хотя бы сможете уберечь своё оборудование от всяких неприятностей.

Но как вы понимаете, раз я написал подобный абзац, то я не следовал этому пути. Как говорится, русский читает инструкцию со словами: блин, уже сломал. Вот я примерно так же действовал, и тернист был мой путь. Для того, чтобы сделать бекап прошивки, запустить и/или установить linux, вам понадобиться скачать архив flash_utility.tar.gz отсюда. Прежде, чем мы поедем дальше, забегая вперёд, скажу, что этот архив не содержит rootfs.tar.bz2, необходимую для прошивки на nand (хотя имеется её вызов в скрипте flash_linux_to_nand.uu ), initramfs, которая позволяет запускать linux без установки, не работает и установка linux на nand завершается с ошибкой. В результате вы получаете кирпич, на самом деле нет. Обо всём этом я не знал, и с этого момента установка linux оказалась для меня настоящим квестом.
Для того, чтобы мы могли двигаться дальше, я процитирую инструкцию, по пользованию данной утилитой.

2.2 Резервная копия NAND


Предупреждение: при резервном копировании NAND вместо задействования ECC делается бэкап OOB-данных, включая битые сектора. Такой подход избавляет от необходимости обработки этих битых секторов в ECC. Это означает, что вы не сможете восстановить резервную копию в случае износа flash-памяти (появления множества битых секторов, битовых ошибок и т.д.) через какое-то время. К тому же, вы можете использовать только собственную резервную копию, так как копии, сделанные на других калькуляторах, могут не заработать на вашем. Проще говоря, сильно, на созданный бэкап не полагайтесь, так как надежность этого метода я гарантировать не могу.

Чтобы сделать резервную копию нужно перевести калькулятор в режим SDP. Откройте командную строку и перейдите в каталог flash_utility и выполните:
В Windows:

uuu backup_nand.uu

В Linux:

sudo ./uuu backup_nand.uu

По завершении, резервная копия NAND будет находится в каталоге backup.

2.3 Восстановление NAND


Для этого у вас должна быть резервная копия NAND в каталоге backup.
Для начала восстановления переведите калькулятор в режим SDP. Откройте командную строку и перейдите в каталог flash_utility, откуда выполните:
В Windows:

uuu restore_nand.uu

В Linux:

sudo ./uuu restore_nand.uu

2.4 Запуск Linux в RAM


Вы можете запустить ОС Linux без перезаписывания NAND. Но в этом случае при каждом использовании Linux потребуется входить в режим SDP и выполнять внешнюю загрузку всего через USB.

Предупреждение: это не должно навредить вашей исходной ОС, но при этом может нанести непоправимый вред оборудованию из-за возможных ошибок кода.

Внимание: при запуске в RAM размер образа корневой файловой системы не должен превышать ~15Мб. В противном случае загружаться она не будет.

Переведите калькулятор в режим SDP, откройте командную строку и, сменив каталог на flash_utility, выполните:
В Windows:

uuu run_linux_in_ram.uu

В Linux:

sudo ./uuu run_linux_in_ram.uu

Теперь калькулятор должен загрузить Linux. Для авторизации используйте логин root.

2.5 Запись Linux в NAND


Предупреждение: прежде чем продолжать, обязательно подготовьте резервную копию NAND. Однако при этом нет гарантии, что вам всегда удастся восстановить эту резервную копию, о чем было сказано выше в разделе 2.3.

Предупреждение: дальнейшие действия могут привести к необратимому повреждению оборудования ввиду возможных ошибок в коде.

Для записи Linux в NAND переведите калькулятор в режим SDP, откройте командную строку и, перейдя в каталог flash_utility, выполните:

В Windows:

uuu flash_linux_to_nand.uu

В Linux:

sudo ./uuu flash_linux_to_nand.uu

Процесс займет несколько минут. По его завершению, перезапустите (Reset) калькулятор, после чего он должен загрузиться в Linux. Загрузка займет около 15 секунд. Для авторизации используйте логин root.

Я умышленно привёл этот перевод тут, чтобы он не потерялся в будущем.

Логика подсказывает, что надо сделать бекап nand-flash и далее проводить эксперименты. Для этого, я зажал кнопку, вставил USB-шнурок в калькулятор и выполнил:

sudo uuu restore_nand.uu

Внимание: в команде выше ошибка, на этом этапе её выполнять нельзя!!! Вас ничего не смущает в данной команде? Меня тоже поначалу ничего не смутило Но я, этой командой не сделал бекап калькулятора, а стёр свою nand-flash, забив ещё ненужным мусором, и угробив ECC раздел. Калькулятор теперь никогда не будет калькулятором


Вечер был томным, хотелось попробовать, я затупил и перепутал команды. Ладно, подумал я, была-не была, попробую прошить linux на flash, всё равно флешка уже стёрта, и терять нечего. Точно так же отключил USB, зажал кнопку и выполнил:

sudo uuu flash_linux_to_nand.uu

И в результате получил такую вот ошибку:


Тогда, я ещё не знал, что если бы этой ошибки не было, то я всё равно не смог бы прошить свой калькулятор, так как в списке файлов отсутствовал архив самой rootfs, и я выпал бы с ошибкой через несколько строк ниже.

К сожалению, мне так и не удалось победить эту ошибку далее, эта команда осуществляет прошивку u-boot в nand-флеш. Почему-то её выполнение падает с ошибкой создания временного файла (это уже потом я узнал с подключением UART).

Хорошим результатом выполнения этой команды стало то, что теперь не требуется нажимать кнопку. И она нам стала не нужна, её можно теперь отпаять.

Так Флешку угробил, linux поставить не могу, ну может быть хотя бы в оперативной памяти удастся его запустить?

Запускаю:

sudo uuu run_linux_in_ram.uu

Подключаю USB к целевому устройству и команда с успехом проходит. И, о чудо, идёт загрузка linux! Но Но до логина мы так и не доходим.


Зависаем на этом этапе...

Хороший результат: загрузчик, ядро, дисплей, система перепрошивки в целом работает. Плохой результат: linux фактически не работает.

В результате, нам надо: подключить аппаратный UART, чтобы видеть что происходит, и пересобрать ядро (в первую очередь для драйверов) и заново собрать rootfs, чтобы добиться её работоспособности.

Заключение первой части


Статья разрослась просто до неприличных размеров, поэтому принято непростое решение разбить её на две.

Как вы поняли, вот так нахрапом линукс поставить мне не удалось. И поэтому придётся подключать тяжёлую артиллерию: греть паяльник, влезать в аппаратную начинку и ковыряться в коде. Обо всём этом вы сможете прочитать во второй части этой эпопеи.

Подробнее..

Установка Linux на калькулятор. Часть II

17.02.2021 12:10:47 | Автор: admin


Как вы помните, в прошлой статье мне удалось стартануть linux на калькуляторе. Однако, работать на нём было невозможно, и я считаю это незачётом. Тогда я понял, что кроличья нора достаточно глубока и придётся полностью пересобирать всю систему, разбираясь с кодом.В результате, я кратко прошёлся по всем этапам, которые описывал автор проекта. И результат полностью того стоит. Итак, поехали!

Аппаратные доработки: подключаем UART


Я написал обо всех моих бедах создателю этого linux, заодно попросив прислать мне бекап его прошивки (хотя его лучше, не заливать). И спросил, как же мне подключить UART к моему калькулятору? На что он мне прислал следующую картинку, и сказал: ищи это на другой стороне платы.


В результате, мне предстоял сложный квест отклеить плату от дисплея, не расколов дисплей и не сломав плату. Пихая туда все возможные металлические предметы, очень аккуратно, в течении часа мне удалось её отделить. Самое сложное было не оборвать тончайшие шлейфы.


Отделяем плату.

Наконец-то, нашему вниманию представляется просто невероятный зоопарк тестовых падов, выводы JTAG и, по моему, SPI, интерфейс SD. Но, самое главное, наш отладочный UART.



Скорее всего там использована логика 1,8 В, но у меня не было такого адаптера, и я решил рискнуть и использовать адаптер с логикой 3,3 В (вам же настоятельно рекомендую использовать 1,8). Попытка, заставить мой адаптер работать на напряжении 1,8 вольта, не увенчалась успехом. Таким образом, я вывел сигналы на гребёнку, в т.ч. опорные 1,8 вольта (но они не пригодились).


Можно приклеивать плату обратно и продолжать работать.

Давайте сразу посмотрим, почему же у нас не запускается система, при загрузке в ОЗУ? Хотя вроде всё работает. Во-первых, давайте глянем скрипт запуска. Содержимое файла run_linux_in_ram.uu:

uuu_version 1.2.135# This script allows you to run the Linux OS in the RAM without altering the NAND FlashSDP: boot -f boot/u-boot-dtb.imx -nojumpSDP: write -f firmware/zImage -addr 0x80800000SDP: write -f firmware/imx6ull-14x14-prime.dtb -addr 0x83000000SDP: write -f firmware/rootfs.cpio.uboot -addr 0x86800000SDP: jump -f boot/u-boot-dtb.imx -ivtSDP: done

Загружаем в память загрузчик u-boot, ядро, dts (точнее, скомпилированный бинарник dtb), initramfs и передаём управление загрузчику, после чего с успехом завершаем приложение uuu.
По логам всё идёт отлично, до момента окончательной загрузки ядра, а там начинается вот такая петрушка.

clk: Not disabling unused clocksALSA device list:  No soundcards found.Freeing unused kernel memory: 1024Kcan't open /dev/null: No such file or directory...can't open /dev/null: No such file or directoryStarting syslogd: OKStarting klogd: OKStarting network: OKStarting Xorg: OKcan't open /dev/ttymxc0: No such file or directory....can't open /dev/ttymxc0: No such file or directoryimx-sdma 20ec000.sdma: external firmware not found, using ROM firmwareinput: Goodix Capacitive TouchScreen as /devices/soc0/soc/2100000.aips-bus/21a4000.i2c/i2c-1/1-0014/input/input3

И так до посинения. Всё банально, /dev/ не создана. И проблема эта открылась позже, при конфигурировании rootfs. Шикарно, мы теперь имеем отличный инструмент отладки. Начнём всё собирать!

Сборка софта


Если вы дойдёте самостоятельно до этого этапа, то надеюсь у вас есть какой-никакой опыт сборки ядра, rootfs, конфигурирования через make menuconfig. Так как описывать весь необходимый список установочных пакетов мне уже лениво (надо установить как минимум кросскомпилятор arm-linux-gnueabihf-, ncurses и многое другое, у меня просто уже всё давно стоит). Будем считать, что вы всё умеете, я лишь заострю ваше внимание на некоторые моменты. Для начала процитирую, то как рекомендуется делать сборку на официальном сайте проекта, а потом я внесу некоторые комментарии.

4. Сборка из исходника


Этот процесс протестирован под Ubuntu 18.04 LTS. Рекомендуется делать сборку под Linux.

4.1 u-boot


Как правило, пересобирать u-boot вам не нужно, и нижеприведенные инструкции даются в качестве справочного материала.
Чтобы собрать u-boot из исходника:

git clone git://github.com/zephray/uboot.gitcd ubootgit checkout imx_v2018.03_4.14.98_2.0.0_gamake mx6ull_prime_defconfigARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make

В результате получится бинарный файл u-boot-dtb.imx.

4.2 Ядро


Для включения/отключения конкретных модулей драйверов/ядра потребуется пересобрать все ядро.

4.2.1 Компиляция с помощью Buildroot


buildroot соберет ядро автоматически. Конфигурацию же можно изменить с помощьюmake linux-menuconfig.

4.2.2 Сборка ядра вручную


git clone git://github.com/zephray/linux.gitcd linuxgit checkout imx_4.14.98_2.0.0_gaARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make hp_prime_defconfigARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make

В итоге будут собраны файлы arch/arm/boot/dts/imx6ull-14x14-prime.dts и arch/arm/boot/zImage.

4.3 Корневая файловая система (rootfs)


На данный момент hp-prime-linux использует для построения корневой файловой системы buildroot. Пакетного менеджера пока что нет, и если вам нужно добавить или удалить пакет, то потребуется пересобрать rootfs.

git clone git://git.buildroot.net/buildrootcd buildrootgit checkout 2019.02.4 make BR2_EXTERNAL=~/Prinux/buildroot prime_defconfigmake

Для установки модулей ядра в rootfs, перейдите в директорию ядра и выполните следующие команды:

INSTALL_MOD_PATH=~/buildroot/output/target ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make modules_install

После этого повторно сгенерируйте образы с помощью buildroot.

Для начала, я решил проверить, что, как минимум, всё это собирается из исходников, поэтому решил потренироваться на самом простом сборке u-boot. Это важно, так как бывает такой момент, что автор написал инструкцию по сборке и прошивке, а забыл закоммитить последние изменения, и в результате его инструкция оказывается бесполезным мусором.
U-boot собирается совершенно 1 в 1 по инструкции, без каких либо тонкостей. В корневой папке после компиляции, мы получим кучу файлов, но нас интересует файл u-boot-dtb.imx. Скопируем его в нашу флеш-утилиту (предварительно создав там папку my):

cp u-boot-dtb.imx /home/dlinyj/tmp/calc/flash_utility/my

И создадим там новый загрузочный скрипт, на котором всё и будем обкатывать:

uuu_version 1.2.135SDP: boot -f my/u-boot-dtb.imx -nojumpSDP: jump -f my/u-boot-dtb.imx -ivtSDP: done

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


Это полный успех, значит код рабочий и мы можем продолжать. Если вы дойдёте до сборки, то настоятельно рекомендую поглядеть git log и git diff между коммитами, чтобы оценить масштабы проделанной работы. Это восхищает и мотивирует!

Со сборкой ядра у меня тоже практически не возникло никаких проблем, разве что пришлось поставить дополнительный пакет lzop, чтобы ядро корректно сжалось. Протестировать можно точно так же (не забыв добавить загрузку dtb-файла, иначе ядро не стартанёт).

Самым сложным оказалась сборка rootfs, как оказалось, дефолтный конфиг мне не подойдёт для сборки. Для начала. делаем всё точно, как написано в инструкции:

git clone git://git.buildroot.net/buildrootcd buildrootgit checkout 2019.02.4 

А вот теперь начинается самое интересное, хождение по битым ссылкам :). В релизах, кроме flash_utility.tar.gz есть ещё файл Source code, который, совершенно неочевидным образом содержит в себе необходимые конфиги для сборки rootfs! Скачиваем файл prinux-0.1.zip и распаковываем его в удобное для нас место. Либо клонируем репозиторий. У меня это вышел путь /home/dlinyj/tmp/calc/prinux.
Там внутри есть папка buildroot это и есть внешние конфигурационные файлы для сборки buildroot! И вот этот путь, именно до этой папки указываем в следующей команде:

make BR2_EXTERNAL= /home/dlinyj/tmp/calc/prinux prime_defconfig

Допереть до этого самостоятельно было невозможно, покуда я не прошерстил вообще все репозитории, файлы и не прочитал как же собирается buildroot (к своему стыду, впервые собираю его вот так, с нуля).
Этой конфигурации мало, в целом можно конечно собрать, и даже попробовать запустить, но initramfs он будет слишком здоровым (там стоят Иксы), больше 25 МБ, и он не запуститься. А для прошивки на nand мы будем получать ту же самую проблему, как и в тесте загрузки в память: не будут созданы файл-устройства.
Первое, я отредактировал файл /home/dlinyj/tmp/calc/prinux/buildroot/configs/prime_defconfig и привёл его к виду:

BR2_arm=yBR2_cortex_a7=yBR2_ARM_FPU_NEON_VFPV4=yBR2_OPTIMIZE_3=yBR2_TOOLCHAIN_EXTERNAL=yBR2_TARGET_GENERIC_HOSTNAME="prinux"BR2_TARGET_GENERIC_ISSUE="Welcome to Prinux"BR2_INIT_SYSTEMD=yBR2_TARGET_GENERIC_GETTY_PORT="ttymxc0"BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_PRINUX_PATH)/board/prime/overlay/"BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_PRINUX_PATH)/board/prime/post_build.sh"BR2_TARGET_ROOTFS_TAR_BZIP2=yBR2_PACKAGE_HOST_UBOOT_TOOLS=y

Выкинув совершенно лишние на данный момент пакеты иксов (мне бы стартануть систему, а потом всё остальное).
Далее выполняю:

make BR2_EXTERNAL= /home/dlinyj/tmp/calc/prinux prime_defconfigmake menuconfig

В опции Filesystem images включаю:

[*] cpio the root filesystem (for use as an initial RAM filesystem)[*]   Create U-Boot image of the root filesystem 

Прохожусь по всем пакетам и отрубаю вообще всё, чтобы не было лишнего.
В разделе System configuration ставлю:

Init system (BusyBox)  /dev management (Static using device table)

Тем самым ещё более уменьшая образ, и наконец у нас будет корректно работать менеджер устройств!
Выходим и сохраняем. И собираем:

make

После успешной компиляции, топаем обратно в папку с собранным ядром и нам необходимо теперь установить модули ядра в нашу rootfs, для этого выполняем:

INSTALL_MOD_PATH=/home/dlinyj/tmp/calc/buildroot/output/target ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make modules_install

И возвращаемся в buildroot и вновь выполняем make. В результате мы получим собранные пакеты в папке /home/dlinyj/tmp/calc/buildroot/output/images:

  • rootfs.cpio.uboot это готовый initramfs
  • rootfs.tar.bz2 образ готовый для прошивки на nand.

Стартуем!


Переписываю готовые образы rootfs в папку my и не забываем переписать туда же свежесобранное ядро из папки /home/dlinyj/tmp/calc/linux/arch/arm/boot, файл zImage. Далее беру за основу скрипт прошивки на nand-флеш и привожу его к виду:
Скрипт для прошивки на nand-flash
uuu_version 1.2.135# This script allows you to flash the Linux OS into NAND Flash.# Boot into flash environmentSDP: boot -f boot/u-boot-dtb.imx -nojumpSDP: write -f boot/zImage -addr 0x80800000SDP: write -f boot/imx6ull-14x14-prime.dtb -addr 0x83000000SDP: write -f boot/fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot -addr 0x86800000SDP: jump -f boot/u-boot-dtb.imx -ivt# Flash kernelFBK: ucmd flash_erase /dev/mtd1 0 0FBK: ucp my/zImage t:/tmpFBK: ucmd nandwrite -p /dev/mtd1 /tmp/zImage# Flash device tree blobFBK: ucmd flash_erase /dev/mtd2 0 0FBK: ucp firmware/imx6ull-14x14-prime.dtb t:/tmpFBK: ucmd nandwrite -p /dev/mtd2 /tmp/imx6ull-14x14-prime.dtb# Flash rootfsFBK: ucmd flash_erase /dev/mtd4 0 0FBK: ucmd ubiformat /dev/mtd4FBK: ucmd ubiattach /dev/ubi_ctrl -m 4FBK: ucmd ubimkvol /dev/ubi0 -Nrootfs -mFBK: ucmd mkdir -p /mnt/mtdFBK: ucmd mount -t ubifs ubi0:rootfs /mnt/mtdFBK: acmd export EXTRACT_UNSAFE_SYMLINKS=1; tar -jx -C /mnt/mtdFBK: ucp my/rootfs.tar.bz2 t:-FBK: syncFBK: ucmd umount /mnt/mtd# DoneFBK: done

Обращаю внимание, что у нас используется специальный образ rootfs для прошивки nand-флеш. Я выкинул прошивку u-boot (так и не понял в чём проблема, и пока не смог победить). device tree blob загружается из другой папки, но никто не мешает его собранный так же переписать либо из u-boot, либо из папки с ядром.
Запускаем этот скрипт, и у нас успешно прошивается nand-флеш. Поскольку загрузчик у нас не прошит, при подаче питания linux не стартанёт. Поэтому вновь правим (или пишем новый скрипт) для загрузки u-boot:

uuu_version 1.2.135SDP: boot -f my/u-boot-dtb.imx -nojumpSDP: jump -f my/u-boot-dtb.imx -ivtSDP: done

Запускаем этот скрипт, и шалость удалась!


К сожалению, мне удалось успешно загрузиться на nand только один раз, потом я решил поправить один файл и у меня уже сыпалось всё с паникой ядра. Чуть ниже расскажу о проблемах.

А как на счёт логина с клавиатуры калькулятора и работы экрана?


А, вы хотите нормальной работы калькулятора, прям как настоящего компьютера? Независимо от большого ПК, не работая через консоль? Да?
Да ладно. Их есть у меня, пожалуйста. Для этого, согласно той же инструкции надо поправить один файл. Цитирую:

5.3.1 Активация консоли VT


В данном релизе она активна по умолчанию.

vi ~/buildroot/output/target/etc/inittab

Введите следующее:
tty0::respawn:/sbin/getty -L tty0 0 vt100 # VT

Хочу обратить внимание, что в оригинальной статье ошибка (забыт нолик), в этой цитате я исправил данную команду. Вписываем эту строку, и перекомпилируем снова rootfs.
Далее пишем загрузочный скрипт, для загрузки нашей сборки initramfs:

uuu_version 1.2.135# This script allows you to run the Linux OS in the RAM without altering the NAND FlashSDP: boot -f my/u-boot-dtb.imx -nojumpSDP: write -f my/zImage -addr 0x80800000SDP: write -f firmware/imx6ull-14x14-prime.dtb -addr 0x83000000SDP: write -f my/rootfs.cpio.uboot -addr 0x86800000SDP: jump -f my/u-boot-dtb.imx -ivtSDP: done

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


После чего я немного разошёлся, и накидал ещё в /root несколько графических файлов, и вывел их с помощью программы fbi (вы их видели в заходниках статей).

Итого



Фух, была проделана громадная работа, растянувшаяся на две недели, но оно того по настоящему стоило!

Если, вы вдруг имеете подобный калькулятор, то вполне можете повторить запуск линукс (как минимум в ОЗУ), с помощью обновленной утилиты, которую можете скачать вот тут.
flash_utility.tar.gz.

К сожалению, с nand-флеш мне не удалось подружиться. После редактирования файлика, и дальнейшей перезагрузки, я получил вот такое сообщение.


Я так и не понял почему так получается, как я не бился, второй раз загрузиться на nand-флеш мне не удалось. Скорее всего, это связанно с тем, что я затёр вспомогательные области nand-флеша, и где-то rootfs и u-boot попадает на эти битые сектора, которые я варварским образом перемаркировал в нормальные. Уже буквально в ночи, перед выходом данной статьи решил собрать initramfs с утилитами mtd и nand и посмотреть, что же происходит. А происходит весьма любопытная петрушка. При загрузке ядро у меня выдаёт.

gpmi-nand 1806000.gpmi-nand: mode:4 ,failed in set feature.Bad block table found at page 262080, version 0x01Bad block table found at page 262016, version 0x01nand_read_bbt: bad block at 0x000000000000nand_read_bbt: bad block at 0x000000020000nand_read_bbt: bad block at 0x000000040000nand_read_bbt: bad block at 0x000000060000nand_read_bbt: bad block at 0x0000012c0000nand_read_bbt: bad block at 0x000004e20000nand_read_bbt: bad block at 0x000005280000nand_read_bbt: bad block at 0x0000094c0000nand_read_bbt: bad block at 0x000017b200005 cmdlinepart partitions found on MTD device gpmi-nandCreating 5 MTD partitions on "gpmi-nand":0x000000000000-0x000000400000 : "boot"0x000000400000-0x000000c00000 : "kernel"0x000000c00000-0x000000d00000 : "dtb"0x000000d00000-0x000000e00000 : "misc"0x000000e00000-0x000020000000 : "rootfs"gpmi-nand 1806000.gpmi-nand: driver registered.

Но при этом в системе пятый раздел, на котором собственно и находится rootfs после загрузки отсутствует. Ошибок в логе загрузки нет:

# mtdinfo Count of MTD devices:           5libmtd: error!: cannot open "/dev/mtd4"        error 2 (No such file or directory)Present MTD devices:            mtd0, mtd1, mtd2, mtd3, mtd4Sysfs interface supported:      yes# ls -la /dev/mtd*crw-r-----    1 root     root       90,   0 Feb 16  2021 /dev/mtd0crw-r-----    1 root     root       90,   2 Feb 16  2021 /dev/mtd1crw-r-----    1 root     root       90,   4 Feb 16  2021 /dev/mtd2crw-r-----    1 root     root       90,   6 Feb 16  2021 /dev/mtd3brw-r-----    1 root     root       31,   0 Feb 16  2021 /dev/mtdblock0brw-r-----    1 root     root       31,   1 Feb 16  2021 /dev/mtdblock1brw-r-----    1 root     root       31,   2 Feb 16  2021 /dev/mtdblock2brw-r-----    1 root     root       31,   3 Feb 16  2021 /dev/mtdblock3

Странная, пока непонятная мистика, куда подевался раздел.
Точно так же, мне не удалось прошить u-boot на nand. При прошивке командой:

kobs-ng init -x -v --chip_0_device_path=/dev/mtd0 /tmp/u-boot-dtb.imx

Происходит следующая ошибка:

WOpen:/tmpWOpen:/tmp/u-boot-dtb.imxrun shell cmd: kobs-ng init -x -v --chip_0_device_path=/dev/mtd0 /tmp/u-boot-dtb.imxunable to create a temporary file

Это всё, что удалось поймать по UART. Я уже и в исходниках kobs-ng поковырялся, но всё бестолку. Пока непонятно как разрешить этот вопрос.

Вопросы к сообществу


  • Кто-нибудь сталкивался с проблемой перепрошивки с помощью утилиты kobs-ng?

Благодарности


  • Выражаю огромную благодарность создателю данного проекта ZephRay, без него бы этой статьи бы не было. Это невероятный и очень крутой труд.
  • Выражаю благодарность Bright_Translate за помощь с переводом инструкции по установке.
  • Главная благодарность моей жене, которая вычитывала этот труд и искала в нём ошибки и опечатки.

Ссылки


  1. Основной проект.
  2. Файлы для сборки rootfs и скрипты прошивальщика.
  3. Обновлённая мной рабочая прошивка для калькулятора.


Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru