当前位置: 首页 > news >正文

imx93 uboot 构建

1. 信息来源

从 nxp 的英文网站中可以找到 imx93 的构建信息,当前的最新版本为:Linux 6.6.3_1.0.0

# 网址如下:
https://www.nxp.com/design/design-center/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-applications-processors:IMXLINUX

在 IMX_LINUX_RELEASE_NOTES.pdf 中提到了最新的源码版本;

# IMX_LINUX_RELEASE_NOTES.pdf 网址如下
https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf

在 IMX_LINUX_USERS_GUIDE.pdf 中提到了 uboot、linux 的下载编译;

# IMX_LINUX_USERS_GUIDE.pdf 网址如下
https://www.nxp.com/docs/en/user-guide/IMX_LINUX_USERS_GUIDE.pdf

在 Fast Boot on i.MX 8M and i.MX 9 Using Falcon Mode and Kernel Optimizations 文档中提到了固件信息,以及下载方法;

# 「Fast Boot on i.MX 8M and i.MX 9 Using Falcon Mode and Kernel Optimizations」网址如下
https://www.nxp.com/docs/en/application-note/AN14093.pdf

2. 硬件信息

开发板:IMX93EVK

电脑系统:ubuntu 20.04,x86_64 架构

3. uboot 构建

在 IMX_LINUX_USERS_GUIDE.pdf 中提到了如下信息:

On i.MX 93, multiple elements are needed:
• imx-boot (built by imx-mkimage), which includes SPL, U-Boot, Arm Trusted Firmware, OP-TEE, Sentinel Firmware, DDR PHY Firmware
• Linux kernel image
• (Optional) Arm Cortex-M33 image
• A device tree file (.dtb) for the board being used
• A root file system (rootfs) for the particular Linux image

imx93 的 uboot 使用 imx-mkimage 来制作;需要如下部分:

SPL:second program loader,二级程序加载器,为 uboot 的一部分,编译 uboot 的时候会一并编译出;
U-Boot:简单理解为内核引导程序,编译 uboot 的时候一并编译出;
ATF:Arm Trusted Firmware,简单理解为由 Arm 提供的项目,支持 Arm 架构上的安全启动和运行时需求;
OP-TEE:Open Portable Trusted Execution Environment,开源的可信执行环境(TEE)框架,先不管;
Sentinel Firmware:应该就是指 EdgeLock Secure Enclave (ELE) firmware;
DDR PHY Firmware:ddr 固件

3.1 交叉编译器下载

方法一:去 arm 网站上下一个

# 我选择的是 arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
# 下载网址见下
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

方法二:下载 buildroot,构建一个 sdk

# 下载 buildroot 源码
git clone git://git.buildroot.net/buildroot# 进入 buildroot 目录,配置 imx93 defconfig
cd buildroot
make freescale_imx93evk_defconfig# make menuconfig 去除 kernel 与 uboot 的构建,保存后退出
make menuconfig# 执行构建 sdk 命令
make sdk -j$(nproc --all)# 生成的文件路径如下
ls -alh output/images/aarch64-buildroot-linux-gnu_sdk-buildroot.tar.gz

方法三:使用 Yocto 来构建交叉编译器

# 见另一篇博客
https://blog.csdn.net/liangtao_1996/article/details/137959559

3.2 uboot 编译

# 在 https://www.nxp.com/docs/en/user-guide/IMX_LINUX_USERS_GUIDE.pdf 中提到了下载编译的方法# 下载 uboot 源码,并切换到分支 lf_v2023.04
git clone https://github.com/nxp-imx/uboot-imx -b lf_v2023.04# 进入 uboot 源码,配置 imx93(配置交叉编译器的前提下)
cd uboot
make distclean
make imx93_11x11_evk_defconfig
make -j$(nproc --all)# 编译会生成以下两个需要的文件
ls -alh u-boot.bin
ls -alh ./spl/u-boot-spl.bin# 遇到报错如下:
tools/mkeficapsule.c:21:10: fatal error: gnutls/gnutls.h: No such file or directory21 | #include <gnutls/gnutls.h>| 
# 解决方法:安装如下包
sudo apt-get install libgnutls28-dev

3.2 ATF 编译

# 下载源码,并切换到当前版本 tag:lf-6.6.3-1.0.0;LF 是 linux factory 的缩写;
git clone https://github.com/nxp-imx/imx-atf
cd imx-atf
git checkout lf-6.6.3-1.0.0# 执行 make help 查看编译帮助
make help# 从 make help 中可以知道,执行 make clean 是清除编译;
# 一般的编译命令为 make [PLAT=<platform>] [OPTIONS] [TARGET]
# 所以构建 imx93 的 ATF 命令如下(配置交叉编译器的前提下)
make PLAT=imx93 bl31# 生成的文件如下:
ls -alh build/imx93/release/bl31.bin

3.3 ELE 固件下载

# 在以下文件中,可知下载命令,和最新的分支
# https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf
wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-ele-imx-0.1.1.bin# 导出固件,firmware-ele-imx-0.1.1.bin 头部是一段 shell 脚本,赋予执行权限
chmod u+x firmware-ele-imx-0.1.1.bin# 执行 bin 文件,同意许可后会导出固件
./firmware-ele-imx-0.1.1.bin# 导出的文件为: mx93a1-ahab-container.img
ls -alh firmware-ele-imx-0.1.1/mx93a1-ahab-container.img

3.4 ddr 固件下载

# 在以下文件中,可知下载命令,和最新的分支
# https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf
wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.23.bin# 导出固件,firmware-imx-8.23.bin 头部是一段 shell 脚本,赋予执行权限
chmod u+x firmware-imx-8.23.bin# 执行 bin 文件,同意许可后会导出固件
./firmware-imx-8.23.bin# 导出的文件为: lpddr4*
ls -alh firmware-imx-8.23/firmware/ddr/synopsys/lpddr4*

3.5 imx-mkimage 工具下载

# 在以下文件中,可知 imx-mkimage 仓库
# https://www.nxp.com/docs/en/release-note/IMX_LINUX_RELEASE_NOTES.pdf
git clone https://github.com/nxp-imx/imx-mkimage.git
cd imx-mkimage
git checkout lf-6.6.3-1.0.0

3.6 打包生成 flash.bin

# 在以下文件中,藐视了如何打包 flash.bin
# https://www.nxp.com/docs/en/user-guide/IMX_LINUX_USERS_GUIDE.pdf
4.5.13 How to build imx-boot image by using 
For i.MX 93 A1 and i.MX 91P, to build imx-boot image by using imx-mkimage, perform the following steps:
1. Copy u-boot.bin from u-boot/u-boot.bin and u-boot-spl.bin from uboot/ spl/u-boot-
spl.bin to imx-mkimage/iMX93/.
2. Copy bl31.bin from Arm Trusted firmware (imx-atf) to imx-mkimage/iMX93/.
3. Copy the image of Sentinel firmware container mx93a1-ahab-container.img to imx-mkimage/iMX9/.
4. If using OP-TEE, copy tee.bin to imx-mkimage/iMX93/. The bl31.bin copied in Step 2 must be built
with OP-TEE SPD enabled.
5. Run the following command to generate flash.bin.
• For i.MX 93 A1:
make SOC=iMX9 REV=A1 flash_singleboot
# 拷贝 3.1 编译的 u-boot.bin 和 spl/u-boot-spl.bin 到 imx-mkimage/iMX93/ 目录
cp uboot-imx/u-boot.bin uboot-imx/spl/u-boot-spl.bin imx-mkimage/iMX93/# 拷贝 3.2 编译的 bl31.bin 文件到 imx-mkimage/iMX93/ 目录
cp imx-atf/build/imx93/release/bl31.bin imx-mkimage/iMX93/# 拷贝 3.3 下载的 Sentinel firmware container mx93a1-ahab-container.img 到 imx-mkimage/iMX93/ 目录
cp firmware-ele-imx-0.1.1/mx93a1-ahab-container.img imx-mkimage/iMX93/# 拷贝 3.4 下载的 ddr 固件 lpddr4* 到 imx-mkimage/iMX93/ 目录
# 参考博客:https://xterra2.avnet.com/poc/nxp/buildroot-for-i.mx93
cp firmware-imx-8.23/firmware/ddr/synopsys/lpddr4* imx-mkimage/iMX93/# 进入 imx-mkimage 构建 flash.bin
cd imx-mkimage
make SOC=iMX9 REV=A1 flash_singleboot# 生成的 flash.bin 文件在 iMX93/flash.bin 路径
ls -alh iMX93/flash.bin

4. 将 flash.bin 写入 tf 卡

利用 shell 脚本来快速写入,新建一个命令为 mksdboot.sh 的脚本,给于执行权限;

将 uboot 编译出的文件 flash.bin 和 mksdboot.sh 放入同级目录,执行以下命令就能将 uboot 刻录到 tf 卡;

对于 i.MX 9 seek 为 32k;这个在 IMX_LINUX_USERS_GUIDE.pdf 中有提到;

sudo ./mksdboot.sh

脚本的作用是:

  1. 找到 16GB 以下的分区

  2. 将 tf 卡的前 1MB 空间写 0

  3. 跳过 tf 卡的前 8MB 空间,将剩余空间格式化为 fat

  4. 将 flash.bin 文件写入 tf 卡,seek 为 32KB 的地方

虚拟机版本如下:

#!/bin/bash# Determine the absolute path to the executable
# EXE will have the PWD removed so we can concatenate with the PWD safely
PWD=`pwd`
EXE=`echo $0 | sed s=$PWD==`
EXEPATH="$PWD"/"$EXE"
clear
cat << EOM################################################################################This script will create a bootable SD card from custom or pre-built binaries.The script must be run with root permissions and from the bin directory of
the SDKExample:$ sudo ./mksdboot.shFormatting can be skipped if the SD card is already formatted and
partitioned properly.################################################################################EOMAMIROOT=`whoami | awk {'print $1'}`
if [ "$AMIROOT" != "root" ] ; thenecho "	**** Error *** must run script with sudo"echo ""exit
fi# find the avaible SD cards
echo " "
echo "Availible Drives to write images to: "
echo " "
ROOTDRIVE=`mount | grep 'on / ' | awk {'print $1'} |  cut -c6-8`
echo "#  major   minor    size   name "
cat /proc/partitions | grep -v $ROOTDRIVE | grep '\<sd.\>' | grep -n ''
echo " "ENTERCORRECTLY=0
while [ $ENTERCORRECTLY -ne 1 ]
doread -p 'Enter Device Number: ' DEVICEDRIVENUMBERecho " "DEVICEDRIVENAME=`cat /proc/partitions | grep -v 'sda' | grep '\<sd.\>' | grep -n '' | grep "${DEVICEDRIVENUMBER}:" | awk '{print $5}'`echo "$DEVICEDRIVENAME"DRIVE=/dev/$DEVICEDRIVENAMEDEVICESIZE=`cat /proc/partitions  | grep -v 'sda' | grep '\<sd.\>' | grep -n '' | grep "${DEVICEDRIVENUMBER}:" | awk '{print $4}'`if [ -n "$DEVICEDRIVENAME" ]thenENTERCORRECTLY=1elseecho "Invalid selection"fiecho ""
doneecho "$DEVICEDRIVENAME was selected"
#Check the size of disk to make sure its under 16GB
if [ $DEVICESIZE -gt 17000000 ] ; then
cat << EOM################################################################################**********WARNING**********Selected Device is greater then 16GBContinuing past this point will erase data from deviceDouble check that this is the correct SD Card################################################################################EOMENTERCORRECTLY=0while [ $ENTERCORRECTLY -ne 1 ]doread -p 'Would you like to continue [y/n] : ' SIZECHECKecho ""echo " "ENTERCORRECTLY=1case $SIZECHECK in"y")  ;;"n")  exit;;*)  echo "Please enter y or n";ENTERCORRECTLY=0;;esacecho ""donefiecho ""DRIVE=/dev/$DEVICEDRIVENAMEecho "Checking the device is unmounted"
for i in `ls -1 $DRIVE?`; doecho "unmounting device '$i'"umount $i 2>/dev/null
doneENTERCORRECTLY=0
while [ $ENTERCORRECTLY -ne 1 ]
doread -p 'Would you like to re-partition the drive anyways [y/n] : ' CASEPARTITIONecho ""echo " "ENTERCORRECTLY=1case $CASEPARTITION in"y")  echo "Now partitioning $DEVICEDRIVENAME ...";PARTITION=0;;"n")  echo "Abort partitioning";exit ;;*)  echo "Please enter y or n";ENTERCORRECTLY=0;;esacecho ""
donePARTITION=1if [ "$PARTITION" -eq "1" ]
then# Set the PARTS value as well
PARTS=1
cat << EOM################################################################################Now making 1 partitions################################################################################EOMdd if=/dev/zero of=$DRIVE bs=1024 count=1024
syncSIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`echo DISK SIZE - $SIZE bytesCYLINDERS=`echo $SIZE/255/63/512 | bc`fdisk $DRIVE << EOF
n
p
1
16384t
b
w
EOFcat << EOM################################################################################Partitioning Boot################################################################################
EOMmkfs.vfat -F 32 -n "boot" ${DRIVE}1
fiecho "Buring the flash.bin to sdcard"
if [ -e flash.bin ]
thendd if=flash.bin of=${DRIVE} bs=32K seek=1 conv=fsync
fiecho ""
echo "Syncing...."
echo ""
syncsleep 1for i in `ls -1 $DRIVE?`; doecho "unmounting device '$i'"umount $i 2>/dev/null
doneecho "Make update sd card success!"

非虚拟机版本如下(慎用):

#!/bin/bash# Determine the absolute path to the executable
# EXE will have the PWD removed so we can concatenate with the PWD safely
PWD=`pwd`
EXE=`echo $0 | sed s=$PWD==`
EXEPATH="$PWD"/"$EXE"
clear
cat << EOM################################################################################This script will create a bootable SD card from custom or pre-built binaries.The script must be run with root permissions and from the bin directory of
the SDKExample:$ sudo ./mksdboot.shFormatting can be skipped if the SD card is already formatted and
partitioned properly.################################################################################EOMAMIROOT=`whoami | awk {'print $1'}`
if [ "$AMIROOT" != "root" ] ; thenecho "	**** Error *** must run script with sudo"echo ""exit
fi# find the avaible SD cards
echo " "
echo "Availible Drives to write images to: "
echo " "
ROOTDRIVE=`mount | grep 'on / ' | awk {'print $1'} |  cut -c6-8`
echo "#  major   minor    size   name "
cat /proc/partitions | grep -v $ROOTDRIVE | grep '\<sd.\>' | grep -n ''
echo " "ENTERCORRECTLY=0
while [ $ENTERCORRECTLY -ne 1 ]
doread -p 'Enter Device Number: ' DEVICEDRIVENUMBERecho " "DEVICEDRIVENAME=`cat /proc/partitions | grep '\<sd.\>' | grep -n '' | grep "${DEVICEDRIVENUMBER}:" | awk '{print $5}'`echo "$DEVICEDRIVENAME"DRIVE=/dev/$DEVICEDRIVENAMEDEVICESIZE=`cat /proc/partitions | grep '\<sd.\>' | grep -n '' | grep "${DEVICEDRIVENUMBER}:" | awk '{print $4}'`if [ -n "$DEVICEDRIVENAME" ]thenENTERCORRECTLY=1elseecho "Invalid selection"fiecho ""
doneecho "$DEVICEDRIVENAME was selected"
#Check the size of disk to make sure its under 16GB
if [ $DEVICESIZE -gt 17000000 ] ; then
cat << EOM################################################################################**********WARNING**********Selected Device is greater then 16GBContinuing past this point will erase data from deviceDouble check that this is the correct SD Card################################################################################EOMENTERCORRECTLY=0while [ $ENTERCORRECTLY -ne 1 ]doread -p 'Would you like to continue [y/n] : ' SIZECHECKecho ""echo " "ENTERCORRECTLY=1case $SIZECHECK in"y")  ;;"n")  exit;;*)  echo "Please enter y or n";ENTERCORRECTLY=0;;esacecho ""donefiecho ""DRIVE=/dev/$DEVICEDRIVENAMEecho "Checking the device is unmounted"
for i in `ls -1 $DRIVE?`; doecho "unmounting device '$i'"umount $i 2>/dev/null
doneENTERCORRECTLY=0
while [ $ENTERCORRECTLY -ne 1 ]
doread -p 'Would you like to re-partition the drive anyways [y/n] : ' CASEPARTITIONecho ""echo " "ENTERCORRECTLY=1case $CASEPARTITION in"y")  echo "Now partitioning $DEVICEDRIVENAME ...";PARTITION=0;;"n")  echo "Abort partitioning";exit ;;*)  echo "Please enter y or n";ENTERCORRECTLY=0;;esacecho ""
donePARTITION=1if [ "$PARTITION" -eq "1" ]
then# Set the PARTS value as well
PARTS=1
cat << EOM################################################################################Now making 1 partitions################################################################################EOMdd if=/dev/zero of=$DRIVE bs=1024 count=1024
syncSIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`echo DISK SIZE - $SIZE bytesCYLINDERS=`echo $SIZE/255/63/512 | bc`fdisk $DRIVE << EOF
n
p
1
16384t
b
w
EOFcat << EOM################################################################################Partitioning Boot################################################################################
EOMmkfs.vfat -F 32 -n "boot" ${DRIVE}1
fiecho "Buring the flash.bin to sdcard"
if [ -e flash.bin ]
thendd if=flash.bin of=${DRIVE} bs=32K seek=1 conv=fsync
fiecho ""
echo "Syncing...."
echo ""
syncsleep 1for i in `ls -1 $DRIVE?`; doecho "unmounting device '$i'"umount $i 2>/dev/null
doneecho "Make update sd card success!"

后续单独写入命令

# /dev/sdb 是你的 tf 卡被虚拟机识别的节点
sudo dd if=flash.bin of=/dev/sdb bs=32K seek=1 conv=fsync

5. 下载另一版本的 ele

我在调试的时候发现,使用 mx93a1-ahab-container.img,imx93 evk 会无日志输出,使用 mx93a0-ahab-container.img 就行;原因暂不知;

# 在其博客可知,他们用的是 mx93a0-ahab-container.img
# 下载同样的版本
wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-sentinel-0.9.bin# 导出固件,firmware-sentinel-0.9.bin 头部是一段 shell 脚本,赋予执行权限
chmod u+x firmware-sentinel-0.9.bin# 执行 bin 文件,同意许可后会导出固件
./firmware-sentinel-0.9.bin# 导出的文件为: mx93a0-ahab-container.img
ls -alh firmware-sentinel-0.9/mx93a0-ahab-container.img

重新打包生成 flash.bin

# 将 mx93a0-ahab-container.img 拷贝到 imx-mkimage/iMX93/ 目录
cp firmware-sentinel-0.9/mx93a0-ahab-container.img imx-mkimage/iMX93/# 进入 imx-mkimage 构建 flash.bin
cd imx-mkimage
make SOC=iMX9 REV=A0 flash_singleboot# 生成的 flash.bin 文件在 iMX93/flash.bin 路径
ls -alh iMX93/flash.bin

将 flash.bin 再次写入 tf 卡;

6. tf 卡启动日志如下

将开发板拨动为 tf 卡启动,启动日志如下:

U-Boot SPL 2023.04 (May 30 2024 - 15:24:24 +0800)
SOC: 0xa0009300
LC: 0x40010
PMIC: PCA9451A
PMIC: Over Drive Voltage Mode
DDR: 3733MTS
M33 prepare ok
Normal Boot
Trying to boot from BOOTROM
Boot Stage: Primary boot
image offset 0x8000, pagesize 0x200, ivt offset 0x0
Load image from 0x4e000 by ROM_API
NOTICE:  BL31: v2.8(release):lf-6.6.3-1.0.0-0-g8dbe28631
NOTICE:  BL31: Built : 15:32:21, May 30 2024U-Boot 2023.04 (May 30 2024 - 15:24:24 +0800)CPU:   i.MX93(52) rev1.0 1700 MHz (running at 1692 MHz)
CPU:   Consumer temperature grade (0C to 95C) at 30C
Reset cause: POR (0x1)
Model: NXP i.MX93 11X11 EVK board
DRAM:  2 GiB
optee optee: OP-TEE api uid mismatch
TCPC:  Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x52]
SNK.Power3.0 on CC1
PDO 0: type 0, 5000 mV, 3000 mA [E]
PDO 1: type 0, 9000 mV, 3000 mA []
PDO 2: type 0, 15000 mV, 3000 mA []
PDO 3: type 0, 20000 mV, 2250 mA []
Requesting PDO 3: 20000 mV, 750 mA
Source accept request
PD source ready!
tcpc_pd_receive_message: Polling ALERT register, TCPC_ALERT_RX_STATUS bit failed, ret = -62
TCPC:  Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x51]
TCPC:  Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x50]
Core:  229 devices, 36 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment[*]-Video Link 0adv7535_mipi2hdmi hdmi@3d: Can't find cec device id=0x3c
fail to probe panel device hdmi@3d
fail to get display timings
probe video device failed, ret -19[0] lcd-controller@4ae30000, video[1] dsi@4ae10000, video_bridge[2] hdmi@3d, panel
adv7535_mipi2hdmi hdmi@3d: Can't find cec device id=0x3c
fail to probe panel device hdmi@3d
fail to get display timings
probe video device failed, ret -19
In:    serial
Out:   serial
Err:   serialBuildInfo:- ELE firmware version 0.0.9-9df0f503switch to partitions #0, OK
mmc1 is current device
UID: 0xa3fa1137 0x9f490717 0x208828a4 0xe6e39a70
flash target is MMC:1
Net:   eth0: ethernet@42890000, eth1: ethernet@428a0000 [PRIME]
Fastboot: Normal
Normal Boot
Hit any key to stop autoboot:  0 
Working FDT set to 83000000
switch to partitions #0, OK
mmc0(part 0) is current device
Scanning mmc 0:1...
45301 bytes read in 3 ms (14.4 MiB/s)
Working FDT set to 83000000
optee optee: OP-TEE api uid mismatch
Unable to open OP-TEE session (err=-19)
mm_communicate failed!
Error: Cannot initialize UEFI sub-system, r = 3
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
Working FDT set to 83000000
Error: Cannot initialize UEFI sub-system, r = 3
starting USB...
Bus usb@4c100000: tcpc_setup_ufp_mode: Polling ALERT register, TCPC_ALERT_CC_STATUS bit failed, ret = -62
Port not available.
Bus usb@4c200000: tcpc_setup_ufp_mode: Polling ALERT register, TCPC_ALERT_CC_STATUS bit failed, ret = -62
Port not available.
USB is stopped. Please issue 'usb start' first.
Running BSP bootcmd ...
switch to partitions #0, OK
mmc1 is current device
Failed to load 'boot.scr'
Failed to load 'Image'
Booting from net ...
ethernet@428a0000 Waiting for PHY auto negotiation to complete..
U-Boot SPL 2023.04 (May 30 2024 - 15:24:24 +0800)
SOC: 0xa0009300
LC: 0x40010
PMIC: PCA9451A
PMIC: Over Drive Voltage Mode
DDR: 3733MTS
M33 prepare ok
Normal Boot
Trying to boot from BOOTROM
Boot Stage: Primary boot
image offset 0x8000, pagesize 0x200, ivt offset 0x0
Load image from 0x4e000 by ROM_API
NOTICE:  BL31: v2.8(release):lf-6.6.3-1.0.0-0-g8dbe28631
NOTICE:  BL31: Built : 15:32:21, May 30 2024U-Boot 2023.04 (May 30 2024 - 15:24:24 +0800)CPU:   i.MX93(52) rev1.0 1700 MHz (running at 1692 MHz)
CPU:   Consumer temperature grade (0C to 95C) at 31C
Reset cause: POR (0x1)
Model: NXP i.MX93 11X11 EVK board
DRAM:  2 GiB
optee optee: OP-TEE api uid mismatch
TCPC:  Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x52]
SNK.Power3.0 on CC1
PDO 0: type 0, 5000 mV, 3000 mA [E]
PDO 1: type 0, 9000 mV, 3000 mA []
PDO 2: type 0, 15000 mV, 3000 mA []
PDO 3: type 0, 20000 mV, 2250 mA []
Requesting PDO 3: 20000 mV, 750 mA
Source accept request
PD source ready!
tcpc_pd_receive_message: Polling ALERT register, TCPC_ALERT_RX_STATUS bit failed, ret = -62
TCPC:  Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x51]
TCPC:  Vendor ID [0x1fc9], Product ID [0x5110], Addr [I2C2 0x50]
Core:  229 devices, 36 uclasses, devicetree: separate
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment[*]-Video Link 0adv7535_mipi2hdmi hdmi@3d: Can't find cec device id=0x3c
fail to probe panel device hdmi@3d
fail to get display timings
probe video device failed, ret -19[0] lcd-controller@4ae30000, video[1] dsi@4ae10000, video_bridge[2] hdmi@3d, panel
adv7535_mipi2hdmi hdmi@3d: Can't find cec device id=0x3c
fail to probe panel device hdmi@3d
fail to get display timings
probe video device failed, ret -19
In:    serial
Out:   serial
Err:   serialBuildInfo:- ELE firmware version 0.0.9-9df0f503switch to partitions #0, OK
mmc1 is current device
UID: 0xa3fa1137 0x9f490717 0x208828a4 0xe6e39a70
flash target is MMC:1
Net:   eth0: ethernet@42890000, eth1: ethernet@428a0000 [PRIME]
Fastboot: Normal
Normal Boot
Hit any key to stop autoboot:  0 
Working FDT set to 83000000
switch to partitions #0, OK
mmc0(part 0) is current device
Scanning mmc 0:1...
45301 bytes read in 3 ms (14.4 MiB/s)
Working FDT set to 83000000
optee optee: OP-TEE api uid mismatch
Unable to open OP-TEE session (err=-19)
mm_communicate failed!
Error: Cannot initialize UEFI sub-system, r = 3
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
Working FDT set to 83000000
Error: Cannot initialize UEFI sub-system, r = 3
starting USB...
Bus usb@4c100000: tcpc_setup_ufp_mode: Polling ALERT register, TCPC_ALERT_CC_STATUS bit failed, ret = -62
Port not available.
Bus usb@4c200000: tcpc_setup_ufp_mode: Polling ALERT register, TCPC_ALERT_CC_STATUS bit failed, ret = -62
Port not available.
USB is stopped. Please issue 'usb start' first.
Running BSP bootcmd ...
switch to partitions #0, OK
mmc1 is current device
Failed to load 'boot.scr'
Failed to load 'Image'
Booting from net ...
ethernet@428a0000 Waiting for PHY auto negotiation to complete.....

相关文章:

imx93 uboot 构建

1. 信息来源 从 nxp 的英文网站中可以找到 imx93 的构建信息&#xff0c;当前的最新版本为&#xff1a;Linux 6.6.3_1.0.0 # 网址如下&#xff1a; https://www.nxp.com/design/design-center/software/embedded-software/i-mx-software/embedded-linux-for-i-mx-application…...

视觉SLAM十四讲:从理论到实践(Chapter7:视觉里程计1)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 一、目标 1.理解图像特征点的意义&#xff0c;并掌握在单幅图像中提取特征点及多幅图像中匹配特征点的方法。 2.理解对极几何的原理&#xff0c;利用对极几何的约束&…...

c++指针的*

1.*运算符 *运算符被称为间接值&#xff08;indirect value&#xff09;或者解除引用&#xff08;dereferencing&#xff09;运算符 将其应用于指针可以得到该地址处存储的值 由于 * 也有乘法的意思&#xff0c;c通过上下文来确定是乘法还是解除引用 2.如何声明和初始化指针 …...

快团团大团长帮卖团长团长如何获得物流查询码?

一、功能说明 团长可自行生成物流查询码&#xff0c;直接将码发给顾客&#xff0c;顾客扫码可查询自己订单的物流状态&#xff01; 用户扫码后&#xff0c;会出现用户在该团长处下单的所有快递订单。团员可查看该订单物流信息、进行退款申请&#xff0c;或直接联系团长。 二…...

MySQL(二)基本SQL语句以及基本函数应用

1、基本SQL语句 MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 - 函数应用在sql语句中 -- 临时表 select now() from dual;-- 数学函数 二进制 -- 返回x的绝对值 select a…...

fyne apptab布局

fyne apptab布局 AppTabs 容器允许用户在不同的内容面板之间切换。标签要么只是文本&#xff0c;要么是文本和一个图标。建议不要混合一些有图标的标签和一些没有图标的标签。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…...

Python实现定时任务的方式

大家好&#xff0c;在当今数字化的时代&#xff0c;定时任务的需求在各种应用场景中频繁出现。无论是数据的定时更新、周期性的任务执行&#xff0c;还是特定时间点的操作触发&#xff0c;Python 都为我们提供了强大而灵活的手段来实现这些定时任务。当我们深入探索 Python 的世…...

微信小程序-网络数据请求(配置request合法域名)

1.小程序中网络数据请求的限制 出于安全方面的考虑&#xff0c;小程序官方对数据接口的请求做出了如下两个限制&#xff1a; &#xff08;1&#xff09;只能请求HTTPS类型的接口 &#xff08;2&#xff09;必须将接口的域名添加到信任列表中 如果要请求某个域名下的接口&am…...

栈和队列题目练习

本节小编选了两道题来加深对栈和队列的认识理解&#xff01; 有效的括号 方法1&#xff1a;直接用栈的结构&#xff08;动态数组&#xff09; 本题可以用栈这个结构来解答&#xff0c;将(,{,[ 左括号压入栈中&#xff0c;然后取出栈顶元素与右括号),},]匹配。不匹配的话&…...

【排列问题】

问题&#xff1a; 已知某序列有n个元素&#xff0c;请编写程序打印出包含该序列所有元素的所有排列。 输入要求&#xff1a; 输入第1行为整数n&#xff0c;表示该序列元素的个数&#xff1b;第2行为n个整数&#xff0c;表示需要排列的序列元素。 输出要求&#xff1a;输出若…...

token 无感刷新

什么是 token 无感刷新&#xff1f;为什么需要 token 无感刷新&#xff1f;让我们想象一下有这么个场景&#xff1a;你登录一个系统成功后&#xff0c;玩了 10 分钟&#xff0c;发现登录失效了&#xff0c;又要你重新登录&#xff0c;然后又过 10 分钟&#xff0c;又失效了&…...

Netty SSL双向验证

Netty SSL双向验证 1. 环境说明2. 生成证书2.1. 创建根证书 密钥证书2.2. 生成请求证书密钥2.3. 生成csr请求证书2.4. ca证书对server.csr、client.csr签发生成x509证书2.5. 请求证书PKCS#8编码2.6. 输出文件 3. Java代码3.1. Server端3.2. Client端3.3. 证书存放 4. 运行效果4…...

4.nginx反向代理、负载均衡

nginx反向代理、负载均衡 一、反向代理1、语法2、注意事项3、后端服务器记录客户端真实IP3.1 在nginx反向代理时添加x-real-ip字段3.2 后端httpd修改combined日志格式3.3 后端是nginx的情况 二、负载均衡 upstream模块1、负载均衡作用2、调度算法3、配置应用 一、反向代理 隐藏…...

浅谈申请小程序地理位置权限的正确打开方式

小程序地理位置接口有什么功能&#xff1f; 这篇内容会教大家如何快速申请“获取当前的地理位置&#xff08;onLocationChange&#xff09;”接口&#xff0c;以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验&#xff0c;来之不易&#xff0c;望大家…...

make modules 和 make modules_install

1. make modules 如&#xff1a;make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- modules 直接make&#xff0c;不加任何参数&#xff0c;就是make all&#xff0c;包含make modules。 make modules是单独编译模块&#xff0c;驱动被配置成M的都是modules&#xff0c;modul…...

docker 安装mysql,redis,rabbitmq

文章目录 docker 安装ngnix&#xff0c;mysql,redis,rabbitmq安装docker1.安装下载docker-ce源命令2.安装docker3.查看版本4.查看docker状态5.启动docker6.测试安装ngnix 安装mysql8.0.361.拉取mysql镜像2.安装mysql8 安装redis1.拉取redis7.0.11镜像2.安装redis3.进入容器内部…...

Windows配置java环境JDK

配置jdk环境非常简单&#xff0c;大概有以下几步&#xff1a; 下载jdk安装&#xff0c;然后双击进行安装配置环境变量(也不是一定非要配置环境变量&#xff0c;配置环境变量的好处就是&#xff0c;在任何位置&#xff0c;系统都可以找到安装路径&#xff0c;非常实用且方便) …...

英伟达驱动重装教程

离线安装NVIDIA驱动程序通常涉及下载驱动程序安装包并手动执行安装步骤。以下是详细步骤: 1. 下载NVIDIA驱动程序 首先,你需要在有网络连接的计算机上下载适合你系统的NVIDIA驱动程序安装包。可以从NVIDIA官方驱动下载页面下载。 选择你的GPU型号和操作系统,然后下载相应…...

【蓝桥杯嵌入式】 第六届国赛

目录 题目 配置 注意事项 代码 - 默写大师 EEPROM读写函数 LED驱动函数 ADC采集 上电初始化 LCD 按键 PWM互补输出 全部代码 hardware.c hardware.h control.c control.h main.c 题目 配置 注意事项 复制LCD的工程&#xff0c;先配置资源 --- 勾选完选项一…...

图片裁剪与上传处理方案 —— 基于阿里云 OSS 处理用户资料

目录 01: 通用组件&#xff1a;input 构建方案分析 02: 通用组件&#xff1a;input 构建方案 03: 构建用户资料基础样式 04: 用户基本资料修改方案 05: 处理不保存时的同步问题 06: 头像修改方案流程分析 07: 通用组件&#xff1a;Dialog 构建方案分析 08: 通用组件&…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...