Рубрики
dev

uboot / u-boot

Ссылки:

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:

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

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

# 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

vim include/configs/ls1046a_common.h
------------------------------------
#define DEBUG 1 
#define DDR_DEBUG 1
------------------------------------

DDR

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

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

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

# 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

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

#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):

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

Команда dm позволяет просмотреть информацию о модели драйвера, 
включая дерево устройств и список доступных u-классов.
dm tree
dm uclass

Диагностика uboot:

dm tree
mdio list
mii device
net list 
bdinfo
ls mmc 0

screen как терминал для COM порта

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

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

setenv ethaddr 02:80:ad:20:57:23 - задать мак адрес
dhcp - получить адрес
boot - продолжить загрузку

для тесту:


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])