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



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

Как вы помните, в последняя статья Мне удалось запустить Linux на калькуляторе.

Однако работать над этим было невозможно, и я считаю это провалом.

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

В итоге я вкратце прошёл все этапы, которые описал автор проекта.

И результат полностью того стоит. Итак, начнем!



Аппаратные улучшения: подключение UART

Обо всех своих бедах я написал создателю этого линукса, заодно попросив прислать мне бэкап его прошивки (хотя лучше его не выкладывать).

И он спросил, а как мне подключить UART к моему калькулятору? На что он прислал мне следующую картинку и сказал: ищи ее на другой стороне доски.



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

В итоге передо мной встал нелегкий квест - отклеить плату от дисплея, не расколов дисплей и не сломав плату.

Затолкав туда все возможные металлические предметы, очень осторожно, в течение часа мне удалось его отделить.

Сложнее всего было не сорваться с тончайшими шлейфами.



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

Мы отделяем плату.

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

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

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

Попытка заставить мой адаптер работать на 1,8 вольт не увенчалась успехом.

Таким образом я вывожу сигналы на гребенку, в т.ч.

опорные 1,8 вольта (но они не пригодились).



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

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

Давайте сразу разберемся, почему наша система не запускается при загрузке в оперативную память? Хотя вроде бы все работает. Для начала давайте посмотрим на скрипт запуска.

Содержимое файла 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 Flash SDP: boot -f boot/u-boot-dtb.imx -nojump SDP: write -f firmware/zImage -addr 0x80800000 SDP: write -f firmware/imx6ull-14x14-prime.dtb -addr 0x83000000 SDP: write -f firmware/rootfs.cpio.uboot -addr 0x86800000 SDP: jump -f boot/u-boot-dtb.imx -ivt SDP: done

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



clk: Not disabling unused clocks ALSA device list: No soundcards found. Freeing unused kernel memory: 1024K can't open /dev/null: No such file or directory .

can't open /dev/null: No such file or directory Starting syslogd: OK Starting klogd: OK Starting network: OK Starting Xorg: OK can't open /dev/ttymxc0: No such file or directory .

can't open /dev/ttymxc0: No such file or directory imx-sdma 20ec000.sdma: external firmware not found, using ROM firmware input: 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-загрузка

В общем, пересобирать u-boot не нужно, а инструкция ниже предоставлена в качестве руководства.

Чтобы собрать u-boot из исходного кода:

git clone git://github.com/zephray/uboot.git cd uboot git checkout imx_v2018.03_4.14.98_2.0.0_ga make mx6ull_prime_defconfig ARCH=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.git cd linux git checkout imx_4.14.98_2.0.0_ga ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make hp_prime_defconfig ARCH=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/buildroot cd buildroot git checkout 2019.02.4 make BR2_EXTERNAL=~/Prinux/buildroot prime_defconfig make

Чтобы установить модули ядра в 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.135 SDP: boot -f my/u-boot-dtb.imx -nojump SDP: jump -f my/u-boot-dtb.imx -ivt SDP: done

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

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

Это полный успех, а это значит, что код работает и мы можем продолжать.

Если вы приступите к сборке, я настоятельно рекомендую просмотреть журнал git и разницу между коммитами, чтобы оценить объем проделанной работы.

Это радует и мотивирует! Со сборкой ядра у меня тоже проблем практически не возникло, разве что пришлось установить дополнительный пакет lzop, чтобы ядро корректно сжималось.

Тестировать можно точно так же (не забудьте добавить загрузку файла dtb, иначе ядро не запустится).

Самое сложное было собрать rootfs; как оказалось конфиг по умолчанию мне не подошел для сборки.

Начать.

Делаем все точно так, как написано в инструкции:

git clone git://git.buildroot.net/buildroot cd buildroot git 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 Мб, и он не запустится.

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

Сначала я отредактировал файл /home/dlinyj/tmp/calc/prinux/buildroot/configs/prime_defconfig и довел его до этого:

BR2_arm=y BR2_cortex_a7=y BR2_ARM_FPU_NEON_VFPV4=y BR2_OPTIMIZE_3=y BR2_TOOLCHAIN_EXTERNAL=y BR2_TARGET_GENERIC_HOSTNAME="prinux" BR2_TARGET_GENERIC_ISSUE="Welcome to Prinux" BR2_INIT_SYSTEMD=y BR2_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=y BR2_PACKAGE_HOST_UBOOT_TOOLS=y

Выкидываем совершенно ненужные на данный момент Х-пакеты (хотелось бы запустить систему, а потом все остальное).

Дальше я делаю:

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

В опции «Образы файловой системы» я включаю:

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

Перебираю все пакеты и все обрубаю, чтобы не было лишнего.

В разделе «Конфигурация системы» я поставил:

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 — образ готов к прошивке на нанд.


Давайте начнем!

Готовые образы rootfs переписываю в папку my и не забываю скопировать туда свежесобранное ядро из папки /home/dlinyj/tmp/calc/linux/arch/arm/boot и файл zImage. Далее беру за основу скрипт прошивки для nand flash и привожу его в форму: Скрипт для прошивки на nand-flash

uuu_version 1.2.135 # This script allows you to flash the Linux OS into NAND Flash. # Boot into flash environment SDP: boot -f boot/u-boot-dtb.imx -nojump SDP: write -f boot/zImage -addr 0x80800000 SDP: write -f boot/imx6ull-14x14-prime.dtb -addr 0x83000000 SDP: write -f boot/fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot -addr 0x86800000 SDP: jump -f boot/u-boot-dtb.imx -ivt # Flash kernel FBK: ucmd flash_erase /dev/mtd1 0 0 FBK: ucp my/zImage t:/tmp FBK: ucmd nandwrite -p /dev/mtd1 /tmp/zImage # Flash device tree blob FBK: ucmd flash_erase /dev/mtd2 0 0 FBK: ucp firmware/imx6ull-14x14-prime.dtb t:/tmp FBK: ucmd nandwrite -p /dev/mtd2 /tmp/imx6ull-14x14-prime.dtb # Flash rootfs FBK: ucmd flash_erase /dev/mtd4 0 0 FBK: ucmd ubiformat /dev/mtd4 FBK: ucmd ubiattach /dev/ubi_ctrl -m 4 FBK: ucmd ubimkvol /dev/ubi0 -Nrootfs -m FBK: ucmd mkdir -p /mnt/mtd FBK: ucmd mount -t ubifs ubi0:rootfs /mnt/mtd FBK: acmd export EXTRACT_UNSAFE_SYMLINKS=1; tar -jx -C /mnt/mtd FBK: ucp my/rootfs.tar.bz2 t:- FBK: sync FBK: ucmd umount /mnt/mtd # Done FBK: done

Обратите внимание, что для прошивки nand flash мы используем специальный образ rootfs. Выкинул прошивку u-boot (так и не понял в чем проблема, и побороть ее пока не удалось).

blob дерева устройств загружается из другой папки, но никто не мешает собрать его таким же образом, либо из u-boot, либо из папки ядра.

Запускаем этот скрипт, и nand flash успешно прошивается.

Поскольку наш загрузчик не прошит, Linux не запустится при подаче питания.

Поэтому редактируем еще раз (или пишем новый скрипт) для загрузки u-boot:

uuu_version 1.2.135 SDP: boot -f my/u-boot-dtb.imx -nojump SDP: jump -f my/u-boot-dtb.imx -ivt SDP: done

Запускаем этот скрипт, и розыгрыш удался! К сожалению, мне удалось успешно загрузиться в nand только один раз, потом я решил починить один файл и все начало крашиться с паникой ядра.

О проблемах расскажу ниже.



А как насчет входа в систему с клавиатуры калькулятора и использования экрана?

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

Они у меня, пожалуйста.

Для этого по той же инструкции нужно исправить один файл.

Я цитирую:



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

В этом выпуске он включен по умолчанию.



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 Flash SDP: boot -f my/u-boot-dtb.imx -nojump SDP: write -f my/zImage -addr 0x80800000 SDP: write -f firmware/imx6ull-14x14-prime.dtb -addr 0x83000000 SDP: write -f my/rootfs.cpio.uboot -addr 0x86800000 SDP: jump -f my/u-boot-dtb.imx -ivt SDP: done

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

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



Общий



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

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

flash_utility.tar.gz .

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



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

Я до сих пор не понимаю, почему так происходит, как ни старался, второй раз загрузиться в нанд флеш не получилось.

Скорее всего, это связано с тем, что я стер вспомогательные области nand flash, и где-то 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 0x01 Bad block table found at page 262016, version 0x01 nand_read_bbt: bad block at 0x000000000000 nand_read_bbt: bad block at 0x000000020000 nand_read_bbt: bad block at 0x000000040000 nand_read_bbt: bad block at 0x000000060000 nand_read_bbt: bad block at 0x0000012c0000 nand_read_bbt: bad block at 0x000004e20000 nand_read_bbt: bad block at 0x000005280000 nand_read_bbt: bad block at 0x0000094c0000 nand_read_bbt: bad block at 0x000017b20000 5 cmdlinepart partitions found on MTD device gpmi-nand Creating 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: 5 libmtd: error!: cannot open "/dev/mtd4" error 2 (No such file or directory) Present MTD devices: mtd0, mtd1, mtd2, mtd3, mtd4 Sysfs interface supported: yes # ls -la /dev/mtd* crw-r----- 1 root root 90, 0 Feb 16 2021 /dev/mtd0 crw-r----- 1 root root 90, 2 Feb 16 2021 /dev/mtd1 crw-r----- 1 root root 90, 4 Feb 16 2021 /dev/mtd2 crw-r----- 1 root root 90, 6 Feb 16 2021 /dev/mtd3 brw-r----- 1 root root 31, 0 Feb 16 2021 /dev/mtdblock0 brw-r----- 1 root root 31, 1 Feb 16 2021 /dev/mtdblock1 brw-r----- 1 root root 31, 2 Feb 16 2021 /dev/mtdblock2 brw-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:/tmp WOpen:/tmp/u-boot-dtb.imx run shell cmd: kobs-ng init -x -v --chip_0_device_path=/dev/mtd0 /tmp/u-boot-dtb.imx unable to create a temporary file

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

Пока не ясно, как решить эту проблему.



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

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


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

  • Выражаю огромную благодарность создателю этого проекта ЗефРэй , без него этой статьи не было бы.

    Это невероятная и очень крутая работа.

  • Я выражаю свою благодарность Bright_Translate за помощь в переводе инструкций по установке.

  • Моя главная благодарность адресована моей жене, которая помогла мне в подготовке и оформлении этой статьи.

    А ещё она терпела мои ночные бдения за этим аппаратом.



Ссылки

  1. Основной проект.
  2. Файлы для сборки rootfs и скриптов флешера.

  3. Обновил рабочую прошивку калькулятора.



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

Теги: #Разработка для Linux #Компьютерное железо #Сделай сам или Сделай сам #ruvds_articles #ruvds_articles #калькулятор #устройства для компьютерных фанатов #портирование Linux #портирование Linux
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.