Как вы помните, в последняя статья Мне удалось запустить Linux на калькуляторе.
Однако работать над этим было невозможно, и я считаю это провалом.
Потом я понял, что кроличья нора достаточно глубока и мне придется полностью перестраивать всю систему, занимаясь кодом.
В итоге я вкратце прошёл все этапы, которые описал автор проекта.
И результат полностью того стоит. Итак, начнем!
Аппаратные улучшения: подключение UART
Обо всех своих бедах я написал создателю этого линукса, заодно попросив прислать мне бэкап его прошивки (хотя лучше его не выкладывать).И он спросил, а как мне подключить UART к моему калькулятору? На что он прислал мне следующую картинку и сказал: ищи ее на другой стороне доски.
В итоге передо мной встал нелегкий квест - отклеить плату от дисплея, не расколов дисплей и не сломав плату.
Затолкав туда все возможные металлические предметы, очень осторожно, в течение часа мне удалось его отделить.
Сложнее всего было не сорваться с тончайшими шлейфами.
Мы отделяем плату.
Наконец, нам представлен невероятный зоопарк тестовых площадок, контактов JTAG и, на мой взгляд, интерфейса SPI, SD. Но, самое главное, наш отладочный UART.
Скорее всего там используется логика 1,8 В, но у меня такого переходника не оказалось, и я решил рискнуть и использовать переходник с логикой 3,3 В (настоятельно рекомендую использовать 1,8).
Попытка заставить мой адаптер работать на 1,8 вольт не увенчалась успехом.
Таким образом я вывожу сигналы на гребенку, в т.ч.
опорные 1,8 вольта (но они не пригодились).
Можно приклеить доску обратно и продолжить работу.
Давайте сразу разберемся, почему наша система не запускается при загрузке в оперативную память? Хотя вроде бы все работает. Для начала давайте посмотрим на скрипт запуска.
Содержимое файла run_linux_in_ram.uu :
Загружаем в память загрузчик u-boot, ядро, dts (точнее, скомпилированный бинарник dtb), initramfs и передаем управление загрузчику, после чего успешно завершаем приложение uuu. По логам все идет нормально, пока ядро окончательно не загрузится, а потом начинается такая петрушка.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
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 и многое другое, просто у меня все уже давно есть) .Будем считать, что вы можете все, я просто остановлю ваше внимание на некоторых моментах.
Для начала процитирую, как рекомендуется производить сборку на официальном сайте проекта, а затем сделаю некоторые комментарии.
Для начала я решил проверить, что как минимум всё это собрано из исходников, поэтому решил потренироваться на самом простом — сборке u-boot. Это важно, так как есть момент, когда автор написал инструкцию по сборке и прошивке, но забыл зафиксировать последние изменения, и в результате его инструкции оказываются бесполезной фигней.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 собирается полностью 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. И в результате мы должны получить следующий результат.
Это полный успех, а это значит, что код работает и мы можем продолжать.
Если вы приступите к сборке, я настоятельно рекомендую просмотреть журнал 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 (хотя бы в оперативной памяти), воспользовавшись обновленной утилитой, скачать которую можно здесь.
К сожалению, мне не удалось подружить nand flash. После редактирования файла и дальнейшей перезагрузки я получил такое сообщение.
Я до сих пор не понимаю, почему так происходит, как ни старался, второй раз загрузиться в нанд флеш не получилось.
Скорее всего, это связано с тем, что я стер вспомогательные области 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 за помощь в переводе инструкций по установке.
- Моя главная благодарность адресована моей жене, которая помогла мне в подготовке и оформлении этой статьи.
А ещё она терпела мои ночные бдения за этим аппаратом.
Ссылки
Теги: #Разработка для Linux #Компьютерное железо #Сделай сам или Сделай сам #ruvds_articles #ruvds_articles #калькулятор #устройства для компьютерных фанатов #портирование Linux #портирование Linux
-
Oracle Erp Против Microsoft Erp
19 Oct, 24 -
Шайн, Григорий Абрамович.
19 Oct, 24 -
Облачная Статистика
19 Oct, 24 -
Tecart - Новая Тема Для Opencart
19 Oct, 24 -
Как Мы Попали На Android Market
19 Oct, 24