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

heltck63fkf1jc9q6xwuul0lveq.jpeg

Достаточно давно я мечтаю об устройстве, которое на своём борту будет иметь экран с тачскрином, аппаратные кнопки, и на котором без особых проблем будет работать 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). Поскольку есть некислый шанс, что под одним названием может скрываться несколько различных устройств, привожу фотографии и описание того как он выглядит и как определить что это именно то устройство, которое вам нужно.
cgmm9dozitvftdrv577qjj9lg6y.jpeg

qus_v0ouj-dixlzgyd1lyrgaoik.jpeg

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

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

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

Подготовка к установке 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.git
cd mfgtools
sudo 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 update
sudo apt-get install cmake

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

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

Проверяем, что всё работает и едем дальше.
uuu -h
uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.4.69-0-g63b1d3c

uuu [-d -m -v -V] 

    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
....

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


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

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

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

wqq5csa2qaghrxpp8pidjpi1ljg.jpeg

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

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

deuqqyz1afakz4cvhp2vqlbcx0m.jpeg

Недра.

У меня практически всё готово, для запуска linux на данном калькуляторе. Но есть нюанс ©. Для первичного запуска необходимо закоротить два пада. Как рекомендует автор:

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

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

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

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

Обращаю внимание, что кнопка нужна только если вы не хотите стирать содержимое калькулятора и готовы разово запустить 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 раздел. Калькулятор теперь никогда не будет калькулятором…
yvxqcw5fu2csh0bhe7q7c_-lj8g.jpeg

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

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

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

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

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

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

Запускаю:

sudo uuu run_linux_in_ram.uu

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

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

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

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

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


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

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

oug5kh6sjydt9llengsiebnp40w.png

© Habrahabr.ru