当前位置: 首页 > 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: 通用组件&…...

迷你主机Esxi 6.7挂载新硬盘

背景 硬件&#xff1a;零刻SER Pro 6 系统&#xff1a;vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了&#xff0c;但空间不够用&#xff0c;想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…...

解决VSCode右键没有Open In Default Browser问题

在VSCode进行Web小程序测试时&#xff0c;我们在新建的HTML文件中输入 !会自动生成页面代码骨架&#xff0c;写入内容后&#xff0c;我们想要右键在浏览器中预览。发现右键没有“Open In Default Browser”选项。原因是没有安装插件。 下面是解决方案&#xff1a;首先在VSCode找…...

httpsok-v1.12.0支持LB证书自动部署

&#x1f525;httpsok-v1.12.0支持LB证书自动部署 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻松搞…...

基于Pytorch框架的深度学习EfficientNetV2神经网络中草药识别分类系统源码

第一步&#xff1a;准备数据 5种中草药数据&#xff1a;self.class_indict ["百合", "党参", "山魈", "枸杞", "槐花", "金银花"] &#xff0c;总共有900张图片&#xff0c;每个文件夹单独放一种数据 第二步&a…...

网络协议。

一、流程案例 接下来揭秘我要说的大事情&#xff0c;“双十一”。这和我们要讲的网络协议有什么关系呢&#xff1f; 在经济学领域&#xff0c;有个伦纳德里德&#xff08;Leonard E. Read&#xff09;创作的《铅笔的故事》。这个故事通过一个铅笔的诞生过程&#xff0c;来讲述…...

Excel单元格格式无法修改的原因与解决方法

Excel单元格格式无法更改可能由多种原因造成。以下是一些可能的原因及相应的解决方法&#xff1a; 单元格或工作表被保护&#xff1a; 如果单元格或工作表被设置为只读或保护状态&#xff0c;您将无法更改其中的格式。解决方法&#xff1a;取消单元格或工作表的保护。在Excel中…...

CasaOS玩客云安装全平台高速下载器Gopeed并实现远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

JAVA学习-练习试用Java实现“最长回文子串”

问题&#xff1a; 给定一个字符串 s&#xff0c;找到 s 中最长的回文子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。 示例 2&#xff1a; 输入&#xff1a;s …...

深入探索Qt框架系列之信号槽原理(三)

前面两篇分别介绍了QObject::connect和QMetaObject::Connection&#xff0c;那么信号槽机制的基础已经介绍完了&#xff0c;本文将介绍信号槽机制是如何从信号到槽的&#xff0c;以及多线程下是如何工作的。 信号槽机制源码解析 1. 信号的触发 以该系列的第一篇文章中的示例举…...

npm镜像源管理、nvm安装多版本node异常处理

查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…...