烧录idbloader.img
现在貌似最新sdk里面叫idblock.img
在u-boot里面,将rkbin安装到u-boot
同级目录下然后./make.sh rk3566后,进行./make.sh --idblock
这样目录下会多一个idblock.img,用rkdevelopertool
烧录到sector 64下,也就是dd if=idblock.img of=/dev/sdxxx
在u-boot里烧录gpt分区表
原因是烧完u-boot启动后,rk默认参数会执行
然后出现
GUID Partition Table Header signature is wrong: 0xE3B60966E3B60965 != 0x5452415020494645
说明guid分区损坏(因为我之前把LBA1清空了)
然后根据文章深度探索uboot
用gpt write mmc 0 $partitions
烧录gpt参数
关于partitions环境变量,在include/configs/rockchip-common.h
里的PARTS_RKIMG定义了
#define PARTS_RKIMG \
"uuid_disk=${uuid_gpt_disk};" \
"name=uboot,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};" \
"name=trust,size=4M,uuid=${uuid_gpt_atf};" \
"name=misc,size=4MB,uuid=${uuid_gpt_misc};" \
"name=resource,size=16MB,uuid=${uuid_gpt_resource};" \
"name=kernel,size=32M,uuid=${uuid_gpt_kernel};" \
"name=boot,size=32M,bootable,uuid=${uuid_gpt_boot};" \
"name=recovery,size=32M,uuid=${uuid_gpt_recovery};" \
"name=backup,size=112M,uuid=${uuid_gpt_backup};" \
"name=cache,size=512M,uuid=${uuid_gpt_cache};" \
"name=system,size=2048M,uuid=${uuid_gpt_system};" \
"name=metadata,size=16M,uuid=${uuid_gpt_metadata};" \
"name=vendor,size=32M,uuid=${uuid_gpt_vendor};" \
"name=oem,size=32M,uuid=${uuid_gpt_oem};" \
"name=frp,size=512K,uuid=${uuid_gpt_frp};" \
"name=security,size=2M,uuid=${uuid_gpt_security};" \
"name=userdata,size=-,uuid=${uuid_gpt_userdata};\0"
然后在include/configs/rk3568_common.h
定义了
#define CONFIG_EXTRA_ENV_SETTINGS \
ENV_MEM_LAYOUT_SETTINGS \
"partitions=" PARTS_RKIMG \
ROCKCHIP_DEVICE_SETTINGS \
RKIMG_DET_BOOTDEV \
BOOTENV
但是这些uuid_gpt_loader2
(具体定义看上面那篇文章或者rk官方的wiki)之类的参数貌似要自己输入
补充资料
Orangepi-build的流程
1. build.sh
source “${SRC}”/scripts/main.sh
进入scripts
下的main.sh
2. scripts/main.sh
通过whiptail
选择菜单后确定BOARD变量,
然后
BOARD_TYPE="conf"
# shellcheck source=/dev/null
source "${EXTER}/config/boards/${BOARD}.${BOARD_TYPE}"
LINUXFAMILY="${BOARDFAMILY}"
执行相应板级配置文件
external/config/boards/orangepi3b.conf
BOARD_NAME="OPI 3B"
BOARDFAMILY="rockchip-rk356x"
BOOTCONFIG="orangepi-3b-rk3566_defconfig"
MODULES="sprdbt_tty sprdwl_ng"
MODULES_BLACKLIST_LEGACY="bcmdhd"
KERNEL_TARGET="legacy,current"
BOOT_LOGO="desktop"
BOOT_SUPPORT_SPI="yes"
DISTRIB_TYPE_LEGACY="focal jammy bullseye bookworm raspi"
BOOTFS_TYPE="fat"
IMAGE_PARTITION_TABLE="gpt"
BOOT_FDT_FILE="rockchip/rk3566-orangepi-3b.dtb"
REVISION="1.0.4"
然后LINUXFAMILY等于rockchip-rk356x
scripts/configuration.sh
其实scripts下面的sh都是会执行的,除了main.sh之外的都是一些工具函数,其中最重要(我认为)的是configuration.sh,里面调用了
source “${EXTER}/config/sources/families/${LINUXFAMILY}.conf”
也就是external/config/sources/families/rockchip-rk356x.conf
external/config/sources/families/rockchip-rk356x.conf
这里第一行include了source "${BASH_SOURCE%/*}/include/rockchip64_common.inc"
external/config/sources/families/include/rockchip64_common.inc
其中其实还调用了
source "${BASH_SOURCE%/*}/rk3399_gpu_vpu.inc"
source "${BASH_SOURCE%/*}/rk35xx_gpu_vpu.inc"
source "${BASH_SOURCE%/*}/rk356x_gpu_vpu.inc"
这些是一些vpu,gpu的依赖deb包,有兴趣的自己看
这个文件主要是指定了bl31,u-boot(本体,tpl,spl)怎么编译,打包(idbloader/idblock),然后写入(dd)到sd卡
比如打包tpl+spl
if [[ $BOARD =~ orangepicm4|orangepi3b ]]; then
tools/mkimage -n rk3568 -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img
elif [[ $BOARD =~ orangepi4-lts|orangepi800 ]]; then
tools/mkimage -n rk3399 -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img
fi
打包ddr+spl(第一次知道ddr还可以和spl结合而不是和miniloder)
elif [[ $BOOT_USE_BLOBS == yes ]]; then
local tempfile=$(mktemp)
tools/mkimage -n $BOOT_SOC -T rksd -d $RKBIN_DIR/$DDR_BLOB idbloader.bin
cat $RKBIN_DIR/$MINILOADER_BLOB >> idbloader.bin
loaderimage --pack --uboot ./u-boot-dtb.bin uboot.img 0x200000
trust_merger --replace bl31.elf $RKBIN_DIR/$BL31_BLOB trust.ini
elif [[ $BOOT_SCENARIO == "spl-blobs" || $BOOT_SCENARIO == "tpl-blob-atf-mainline" ]]; then
if [[ $BOARD =~ orangepicm4|orangepi3b ]]; then
tools/mkimage -n rk3568 -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img
elif [[ $BOARD =~ orangepi4-lts|orangepi800 ]]; then
tools/mkimage -n rk3399 -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img
fi
还有比如考虑把uboot全部打包成一个img
if [[ ${MERGE_UBOOT} ]]; then
display_alert "Merge u-boot" "u-boot-${BOARD}-merged.bin" "info"
dd if=/dev/zero of=u-boot-${BOARD}-merged.bin bs=1M count=32 > /dev/null 2>&1
dd if=idbloader.bin of=u-boot-${BOARD}-merged.bin seek=64 conv=notrunc status=none
dd if=uboot.img of=u-boot-${BOARD}-merged.bin seek=16384 conv=notrunc status=none
dd if=trust.bin of=u-boot-${BOARD}-merged.bin seek=24576 conv=notrunc status=none
mv u-boot-${BOARD}-merged.bin ${DEB_STORAGE}/u-boot/
fi
等等
是怎么启动kernel的
未完待续(其实就是在fat32加载kernel,然后在kernel的启动参数里(这个在设备树写进去了)对应好rootfs的gpt partition的uuid就行
香橙派mali加载原理
linux的loader按照这个顺序加载shared library
The order is documented in the manual of the dynamic linker, which is ld.so. It is:
1.directories from LD_LIBRARY_PATH;
2.directories from /etc/ld.so.conf;
3./lib;
4./usr/lib.
source
然后在香橙派的/etc/ld.so.conf.d/
下面有mali的override,然后他最优先找/usr/lib/aarch64-linux-gnu/mali
这个路径
然后glmark2-es2优先加载这个路径的so库libEGL.so
,因此不用慌都丢在aarch64-linux-gnu
这个路径下和mesa的库冲突
orangepi@orangepi3b:/etc$ ls /etc/ld.so.conf.d/
00-aarch64-mali.conf fakeroot-aarch64-linux-gnu.conf
aarch64-linux-gnu.conf libc.conf
orangepi@orangepi3b:/etc$ vim /etc/ld.so.conf.d/
并且/usr/lib/aarch64-linux-gnu
这个路径也是由aarch64-linux-gnu.conf这个文件确定的
# Multiarch support
/usr/local/lib/aarch64-linux-gnu
/lib/aarch64-linux-gnu
/usr/lib/aarch64-linux-gnu
香橙派怎么实现开机显示cpu温度等信息的
通过/etc/update-motd.d
下面的文件显示motd
香橙派官方运用rkbin打包idbloader(idblock)
见https://github.com/orangepi-xunlong/orangepi-build/blob/d91089989f73c77e8346400a32f5cd54206992c0/external/config/sources/families/include/rockchip64_common.inc#L67
tools/mkimage -n rk3568 -T rksd -d $RKBIN_DIR/$DDR_BLOB:spl/u-boot-spl.bin idbloader.img
dd if=/dev/zero of=u-boot-${BOARD}-merged.bin bs=1M count=32 > /dev/null 2>&1
dd if=idbloader.bin of=u-boot-${BOARD}-merged.bin seek=64 conv=notrunc status=none
dd if=uboot.img of=u-boot-${BOARD}-merged.bin seek=16384 conv=notrunc status=none
dd if=trust.bin of=u-boot-${BOARD}-merged.bin seek=24576 conv=notrunc status=none