Используем spi-flash для восстановления Orange Pi PC

Инструкция как восстановить Orange Pi PC, если сломался слот SD-карт

Предыстория

У меня имеется Orange Pi PC (далее - плата), уже пару лет. Мощное железо, 1 ГБ ОЗУ, 1 ГБит/с Ethernet порт. Для домашних задач подходит. В последнее время работала как шлюз для 3д-принтера. Но в какой-то момент, уже в апреле 2019 года, перестал работать слот SD-карт и система перестала грузится.

Update

TODO

  • Не работает загрузка по сети.

Чего я не знал

Различные режимы загрузки Orange Pi PC

Плата имеет различные режимы загрузки. Основные - загрузка с SD-карты, MMC, SPI-Flash.

Режим sunxi-fel

Существует специальный режим платы - sunxi-fel. Нужно отключить от платы sd-карту, подключить micro-usb кабель к плате, второй конец к компьютеру, желательно, под Linux. В этом режиме можно управлять платой, в частности, можно записывать образ u-boot на установленную на плате spi-flash и (или) удаленно загрузить образ U-boot в память и загрузить плату.

Проект с ЛОРа

Летом нашел проект на Linux.Org.Ru с простой платой-переходником, чтобы удобно было припаять spi-flash (sop8) на переходник и затем подключать ее к плате. Автор выложил проект на github, я сделал fork и дополнительно добавил файлы в Gerber, чтобы можно было заказать на китайских фабриках.

Что нам нужно

Сборка пакетов.

Необходимо собрать ARM Trusted Firmware.

Перед сборкой проверим систему:

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf bison flex swig

Затем нужно собрать U-boot, для Orange Pi PC команды следующие:

cd
git clone https://github.com/u-boot/u-boot
cd u-boot
make distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_pc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

Эти файлы нужно изменить, чтобы включить загрузку u-boot через spi-flash

DTS-файл

--- ./o/u-boot/arch/arm/dts/sun8i-h3-orangepi-pc.dts  2019-12-09 14:16:34.638633856 +0300
+++ ./n/u-boot/arch/arm/dts/sun8i-h3-orangepi-pc.dts  2019-10-09 20:19:42.792490685 +0300
@@ -54,6 +54,7 @@
   aliases {
     ethernet0 = &emac;
     serial0 = &uart0;
+                spi0 = &spi0;
   };
 
   chosen {
@@ -140,6 +141,35 @@
   status = "okay";
 };
 
+&spi0 {
+        status = "okay";
+
+        flash@0 {
+                #address-cells = <1>;
+                #size-cells = <1>;
+                compatible = "mxicy,mx25l1606e", "winbond,w25q128";
+                reg = <0>;
+                spi-max-frequency = <40000000>;
+                partitions {
+                        compatible = "fixed-partitions";
+                        #address-cells = <1>;
+                        #size-cells = <1>;
+
+                        qspi_boot: partition@0 {
+                                label = "Boot and fpga data";
+                                reg = <0x0 0x4000000>;
+                        };
+
+                        qspi_rootfs: partition@4000000 {
+                                label = "Root Filesystem - JFFS2";
+                                reg = <0x4000000 0x4000000>;
+                        };
+                };
+        };
+};
+
+
+
 &hdmi {
   status = "okay";
 };

Config-файл

CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_NR_DRAM_BANKS=1
CONFIG_SPL=y
CONFIG_MACH_SUN8I_H3=y
CONFIG_DRAM_CLK=624
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
CONFIG_USE_PREBOOT=y
CONFIG_SPL_I2C_SUPPORT=y
CONFIG_SPL_SPI_SUNXI=y
# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set
CONFIG_USE_PREBOOT=y
CONFIG_SYS_SPI_U_BOOT_OFFS=0x8000
# CONFIG_CMD_FLASH is not set
# CONFIG_SPL_DOS_PARTITION is not set
# CONFIG_SPL_EFI_PARTITION is not set
CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-orangepi-pc"
CONFIG_SUN8I_EMAC=y
CONFIG_SY8106A_POWER=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y

После сборки у вас должен появится файл u-boot-sunxi-with-spl.bin. Этот файл необходимо залить на флешку.

Загрузка образа на spi-флешку

Подключите плату к компьютеру с установленным ПО sunxi-fel

Проверим, что плата подключена и определяется программой sunxi-fel

sudo sunxi-fel sid

Проверим, что плата видит spi-flash

sudo sunxi-fel spiflash-info

Записываем образ на флешку

sudo sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin

Проверяем записанный образ

sudo sunxi-fel -p spiflash-read 0 `stat -c %s u-boot-sunxi-with-spl.bin` spi-flash-read-data.bin
cmp -b u-boot-sunxi-with-spl.bin spi-flash-read-data.bin

Загрузка системы с USB-флешки.

  • Необходимо записать образ Armbian на флешку;
  • отключаем питание на плате;
  • подключаем usb-флешку к плате;
  • включаем плату и ждем когда плата запросит адрес по DHCP-протоколу.

В случае ошибок, необходимо подключиться к консоле, 3 пина между HDMI-портом и разьемом питания. От разъема питания к HDMI - Ground, RX, TX. Подключить через USB-TTL-serial (pl2102 и подобные)

sudo screen /dev/ttyUSBX 115200

Итог

Using username "nurmukhamed".
nurmukhamed@orangepipc's password:
  ___  ____  _   ____   ____
 / _ \|  _ \(_) |  _ \ / ___|
| | | | |_) | | | |_) | |
| |_| |  __/| | |  __/| |___
 \___/|_|   |_| |_|    \____|

Welcome to Armbian buster with Linux 5.4.8-sunxi

System load:   0.17 0.10 0.09   Up time:       1 day
Memory usage:  8 % of 998MB     IP:            192.168.1.231 192.168.1.115
CPU temp:      56°C
Usage of /:    14% of 7.2G

[ General system configuration (beta): armbian-config ]

Last login: Wed Jan 15 06:39:01 2020 from 192.168.1.201

nurmukhamed@orangepipc:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            432M     0  432M   0% /dev
tmpfs           100M  5.5M   95M   6% /run
/dev/sda1       7.2G  988M  6.1G  14% /
tmpfs           500M     0  500M   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           500M     0  500M   0% /sys/fs/cgroup
tmpfs           500M  4.0K  500M   1% /tmp
/dev/zram0       49M  2.2M   43M   5% /var/log
tmpfs           100M     0  100M   0% /run/user/1000
nurmukhamed@orangepipc:~$

Дополнение создал небольшой

comments powered by Disqus