Ссылки:
1 2 3 4 5 6 7 |
https://github.com/b14esh/bash/blob/master/sdcard-builder/sdcard-builder.sh https://habr.com/ru/post/434942/ https://habr.com/ru/sandbox/132293/ ftp://ftp.denx.de/pub/u-boot/ - тут брать uboot https://u-boot.readthedocs.io/en/latest/ https://github.com/ARM-software/u-boot/blob/master/doc/README.memory-test https://ru.wikipedia.org/wiki/Dd |
Компиляция на примере debian 11:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
0. Скачиваем cd /opt #git clone https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot.git - офф nxp git #git clone https://github.com/u-boot/u-boot.git - офф реп u-boot #wget ftp://ftp.denx.de/pub/u-boot/u-boot-2023.04-rc4.tar.bz2 0.1 Распаковываем tar -xvf u-boot-2023.04-rc4.tar.bz2 0.2 Переходим в каталог cd u-boot-2023.04-rc4 0.3 использование git / git переключения веток git clone https://github.com/u-boot/u-boot.git cd u-boot git status git tag git checkout NAME_TAG 1. Готовимся к компиляции make help - получаем помощь если требуется make distclean 2. Смотрим что за что отвечает #make O=../olimex-uboot # адрес где будет лежать результат сборки # -j4 # количество потоков для сборки # ARCH=arm # тип архитектуры для которой собирается # CROSS_COMPILE=arm-linux-gnueabihf- # кросс компилятор нашего процессора # xconfig # команда запуска GUI конфигуратора 2.1 Собственно если мы не вызываем xconfig то нам надо перед компиляцией создать файл конфигурации !!! собственно тут веселье только начинается !!! возможно понадобятся обяз параметры #make oldconfig #make menuconfig #make xconfig Но не спешите это запускать!!! в каталоге ./configs/ есть готовые конфиги для оборудования 3. Приступаем к первой сборке #apt-get install gcc-aarch64-linux-gnu #make O=../me-uboot -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- #make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- #make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_zero_defconfig #export ARCH=arm64 # файл some_board_defconfig соответствует имени в каталоге .config # ls1046afrwy_tfa_defconfig или вот это orangepi_zero_defconfig #make some_board_defconfig #make CROSS_COMPILE=aarch64-unknown-none- #packages/firmware/u-boot.mk:34: export ARCH=arm && export CROSS_COMPILE=arm-linux-gnueabihf-; \ #packages/firmware/u-boot.mk:36: export ARCH=arm64 && export CROSS_COMPILE=aarch64-linux-gnu-; \ make distclean make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_zero_defconfig make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- |
nxp
1 2 3 4 5 6 7 8 9 10 11 |
The compiled U-Boot image, u-boot-with-spl-pbl.bin, is available at u-boot/. You need to use u-boot-with-spl-pbl.bin because for SD boot, ls104x devices use different way for bootloader from ls1088/ls2088/lx2160 devices. #make -j4 ls1046afrwy_tfa_defconfig make distclean export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- make ls1046ardb_sdcard_defconfig make -j4 dd if=u-boot-with-spl-pbl.bin of=/dev/sdX bs=512 seek=8 conv=fsync |
error install mtest
1 2 3 4 5 6 7 8 9 10 11 12 |
# board/freescale/ls1046ardb/ls1046ardb_rcw_sd.cfg #https://e2e.ti.com/support/processors-group/processors/f/processors-forum/717115/linux-am3352-adding-mtest-command-in-u-boot error: ‘CONFIG_SYS_MEMTEST_START’ undeclared (first use in this function); did you mean ‘CONFIG_SYS_MEMTEST_SCRATCH’? error: ‘CONFIG_SYS_MEMTEST_END’ undeclared (first use in this function); did you mean ‘CONFIG_SYS_MEMTEST_SCRATCH’? vim include/configs/ls1046a_common.h ---------------------------------------- #define CONFIG_CMD_MEMTEST #define CONFIG_SYS_ALT_MEMTEST #define CONFIG_SYS_MEMTEST_START 0xFF000000 #define CONFIG_SYS_MEMTEST_END 0xFFFFFFFF ---------------------------------------- |
DEBUG
1 2 3 4 5 |
vim include/configs/ls1046a_common.h ------------------------------------ #define DEBUG 1 #define DDR_DEBUG 1 ------------------------------------ |
DDR
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
git clone https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot.git make distclean export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- make ls1046ardb_sdcard_defconfig make menuconfig <----------- на этом этапе добавил чего надо от uboot / mtest minfo и т.д. далее скопировал исходы из другой платы где есть какая то память (nxp форуме нагуглил ) cp board/freescale/ls1043ardb/ddr.h board/freescale/ls1046ardb/ddr.h <---- поправил cp board/freescale/ls1043ardb/ddr.c board/freescale/ls1046ardb/ddr.c <---- поправил vim include/configs/ls1046ardb.h <---- поправил vim include/common.h <--------- поправил vim ddr.c --------- /* DDR model number: MT40A512M8HX-093E */ #ifdef CONFIG_SYS_DDR_RAW_TIMING dimm_params_t ddr_raw_timing = { .n_ranks = 1, .rank_density = 4294967296u, .capacity = 429496726u, .primary_sdram_width = 64, .ec_sdram_width = 8, .registered_dimm = 0, .mirrored_dimm = 0, .n_row_addr = 16, .n_col_addr = 10, .bank_addr_bits = 0, .bank_group_bits = 1, .edc_config = 0, .burst_lengths_bitmask = 0x0c, .tckmin_x_ps = 750, .tckmax_ps = 1900, .caslat_x = 0x0001FFE00, .taa_ps = 13320, .trcd_ps = 13320, .trp_ps = 13320, .tras_ps = 33000, .trc_ps = 46500, .trfc1_ps = 350000, .trfc2_ps = 260000, .trfc4_ps = 160000, .tfaw_ps = 15000, .trrds_ps = 5300, .trrdl_ps = 6400, .tccdl_ps = 5355, .refresh_rate_ps = 7800000, .dq_mapping_ors = 0, }; --------- |
uboot env
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
printenv - показать переменные setenv ipaddr 192.168.1.126 - задать адрес для интерфейса set ipaddr2 192.168.1.127 - задать еще один ip адрес setenv serverip 192.168.1.1 - задать адрес для tfp setenv netmask 255.255.255.0 - задать vfcre setenv ethaddr 02:80:ad:20:57:23 - задать мак адрес setenv bootargs "console=ttyS0,115200 root=/dev/ram" setenv bootdelay 3 setenv baudrate 115200 setenv stdin serial setenv stdout serial setenv stderr serial setenv bootfile "img-dnp9200" setenv bootcmd bootm 0x10040000 setenv ethact fm1-mac4 setenv eth1addr 00:00:00:00:00:04 setenv ethprime FM1@DTSEC4 setenv ethact fm1-mac3 setenv eth2addr 00:00:00:00:00:F4 setenv ethprime FM1@DTSEC3 |
dd
1 2 3 4 5 6 7 8 9 10 11 12 |
bs=n — размер блока count=n — сколько блоков скопировать seek=n — сколько блоков пропустить от начала в выходном файле перед копированием noerror — игнорировать ошибки ввода-вывода if=файл — читает данные из файла вместо стандартного ввода of=файл — пишет данные в файл вместо стандартного вывода ibs=nn и obs=nn — задаёт, сколько байтов нужно считывать или записывать за раз skip=n — сколько блоков пропустить от начала во входном файле перед копированием dd if=u-boot-with-spl-pbl.bin of=/dev/sda bs=1024 seek=4 conv=fsync dd if=fsl_fman_ucode_ls1046_r1.0_106_4_18.bin of=/dev/sda bs=1024 seek=9216 |
uefi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 0 load mmc 0:2 $fdt_addr_r dtb load mmc 0:1 $kernel_addr_r /EFI/grub/grubaa64.efi bootefi $kernel_addr_r $fdt_addr_r # 1 load mmc 0 $fdt_addr_r dtb load mmc 0 $kernel_addr_r /EFI/grub/grubaa64.efi bootefi $kernel_addr_r $fdt_addr_r # 2 setenv bootargs console=ttyS0,115200 root=/dev/ram0 earlycon=uart8250,mmio,0x21c0500 mtdparts=1550000.spi-0:1m(rcw),15m(u-boot),48m(kernel.itb) setenv fdt_addr_r 0x84080000 setenv kernel_addr_r 0x90000000 load mmc 0 $fdt_addr_r /boot/fsl-ls1046a-rdb.dtb load mmc 0 $kernel_addr_r /boot/grub/BOOTAA64.EFI bootefi $kernel_addr_r $fdt_addr_r |
boot SPI
1 2 3 4 |
setenv bootargs root=/dev/ram0 earlycon=uart8250,mmio,0x21c0500 console=ttyS0,115200 sf probe 0:0 sf read 0x90480000 1000000 2800000 bootm 0x90480000 |
boot sd nxp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#fdisk # fs ext4 /dev/sda1 * 4096 62332927 62328832 29.7G 83 Linux #uboot burn #dd if=u-boot-with-spl-pbl.bin of=/dev/sda bs=512 seek=8 #dtb #fsl-ls1046a-rdb.dtb #fsl-ls1046a-rdb-sdk.dtb #fsl-ls1046a-rdb-usdpaa.dtb #fsl-ls1046a-rdb-usdpaa-shared.dtb #cp Image Image.gz u-boot-dtb /mnt/sda1/boot/ setenv bootargs console=ttyS0,115200 ip=dhcp root=/dev/mmcblk0p1 earlycon=uart8250,mmio,0x21c0500 rootfstype=ext4 rootwait rw setenv load_kernel ext2load mmc :1 82000000 boot/Image setenv load_dtb ext2load mmc :1 8f000000 boot/u-boot-dtb.bin setenv bootcmd mmc rescan\; run load_kernel load_dtb\; booti 82000000 - 8f000000 saveenv |
Проверка mmc карты (sdcard):
1 2 3 4 5 6 7 |
mmc mmc info - информация об "сd card" mmc list - покажет номер "sd reader" для дальнейшего использования с командой "ls" ls mmc 0 - покажет содержимое "/" ls mmc 0 /boot - покажет содержимое "/boot" ls mmc 2.1:3 / - покажет содержимое корневого каталога на устройстве MMC 2, аппаратном разделе 1 и разделе номер 3 |
dm
1 2 3 4 |
Команда dm позволяет просмотреть информацию о модели драйвера, включая дерево устройств и список доступных u-классов. dm tree dm uclass |
Диагностика uboot:
1 2 3 4 5 6 |
dm tree mdio list mii device net list bdinfo ls mmc 0 |
screen как терминал для COM порта
1 2 3 4 |
screen -L -Logfile cabinet-bootup.log /dev/ttyS0 115200 -L -Logfile cabinet-bootup.log — записываем сессию в файл cabinet-bootup.log /dev/ttyS0 — использовать это последовательное устройство 115200 — Baud rate |
Backup and restore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
printenv - проверяем окружения bootcmd - Эта команда используется для задания стандартного поведения при запуске board=evb_rk3128 - Эта команда определяет используемый CPU / плату разработки devtype=spinand Эта переменная определяет используемое флэш-устройство При помощи этих команд мы можем узнать больше о SPI flash: rksfc rksfc - rockchip sfc sub-system rksfc scan rksfc info uboot — вероятно, содержит образ UBoot / загрузчик первого этапа trust — образ Trusted execution environment boot — образ ядра / ramdisk rootfs — самый большой раздел, файловая система рута ядра user data — пользовательские данные, скорее всего, используется для записи рекордов, пользовательских настроек и пр. usb - USB sub-system Инициализация USB хранилища / внешней флешки usb start usb info Сначала мы можем попробовать считать всю SPI flash в ОЗУ при помощи следующей команды. В качестве адреса назначения можно попробовать адрес, сохранённый в $ramdisk_addr_r, то есть 0x6a200000: rksfc read $ramdisk_addr_r 0 0x35E00 Считываем из SPI в память: rksfc read $scriptaddr 0 0x35E00 Записываем из памяти на usb usb write $scriptaddr 0 0x35E00 Читаем из USB в память: usb read $scriptaddr 0 0x35E00 Записываем из памяти в SPI rksfc write $scriptaddr 0x35E00 0 Проверяем доступные разделы: mount df ls -lathr /dev/block/by-name/ lsblk DD для бекапа: cd /mnt/usb/ dd if=/dev/sda1 of=part1.bin dd if=/dev/sda2 of=part2.bin dd if=/dev/sda3 of=part3.bin dd if=/dev/sda4 of=part4.bin dd if=/dev/sda5 of=part5.bin file * - команда расскажет все о файлах мы можем извлечь раздел squashfs с помощью unsquashfs и попробовать смонтировать раздел ext2, чтобы убедиться в их правильности unsquashfs part4.bin |
dhcp в uboot
1 2 3 |
setenv ethaddr 02:80:ad:20:57:23 - задать мак адрес dhcp - получить адрес boot - продолжить загрузку |
для тесту:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
dnsmasq -i enp0s20f0u1u4 --dhcp-range=10.0.100.10,10.0.100.50 -d -u nobody -p0 -K --log-dhcp ip a a 10.0.100.1/24 dev enp0s20f0u1u4 ip link set up dev enp0s20f0u1u4 cat > /etc/systemd/system/mac_set.service << "EOF" [Unit] Description=Change MAC address of network interface After=network.target [Service] ExecStart=/usr/bin/set_mac Type=oneshot RemainAfterExit=yes [Install] WantedBy=default.target EOF chmod +x /usr/bin/set_mac systemctl daemon-reload && systemctl enable mac_set.service cat > /usr/bin/set_mac << "EOF" #!/bin/sh INTERFACE="end0" MAC="02:FF:FF:FF:FF:FF" ip link set dev $INTERFACE down ip link set dev $INTERFACE address $MAC ip link set dev $INTERFACE up EOF MAC=$(printf '02:%02X:%02X:%02X:%02X:%02X' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]) |