![]()
![]()
![]()
![]()
![]()
![]()
前言: ?
两周前,眺望电子发布了最新RK3576-S核心板的预告,搭载LPDDR5和UFS这一组合引起了不少用户的关注,同时也收到不少关于存储搭配的疑问。本文结合内测调试经验以与客户需求为大家剖析其中关键点。
眺望电子RK3576-S核心板支持LPDDR5,考虑硬件复用性,核心板可选贴UFS和EMMC存储器颗粒,因此会衍生出四种配置场景:
空贴UFS,LPDDR5+EMMC配置;
空贴EMMC,LPDDR5+UFS配置;
同时存在UFS和EMMC,以EMMC为系统磁盘,UFS作为扩展存储器;
同时存在UFS和EMMC,以UFS为系统磁盘,EMMC作为扩展存储器;
如上四种场景均需软硬件协同修改,以下以最复杂的 “UFS 与 EMMC 共存且 EMMC 为系统盘” 场景为例,详解原理与操作方法。
一、问题描述
当 RK3576-S 核心板同时搭载 UFS 与 EMMC 时,会出现两个异常现象:
2、即使 UFS 烧写固件成功,系统上电仍无法启动,始终进入 maskrom 模式。
二、硬件分析
问题根源在于易被忽视的:BOOT启动项配置
SARADC_IN0_BOOT 专用于 SYSTEM BOOT 启动顺序的设置,不能用于其它功能,通过上下拉电阻分压采样得到的值,用来判断从哪个接口进行 BOOT,设置如下表:(Rup/Rdown 代表上、下拉电阻)
我司RK3576-S核心板SARADC_IN0_BOOT 引脚内部上下拉配置为Config 10状态,对应启动顺序为EMMC->SDMMC0->USB。
这就导致:若 EMMC 为空(未烧写固件),即使 UFS 已烧写固件,系统仍会因优先检测 EMMC 失败而进入 maskrom 模式。
若要设置UFS为系统磁盘,必须保证SYSTEM BOOT配置中UFS比EMMC的启动优先级高。硬件调整方法也很简单:根据下表更换上下拉电阻阻值。
对于场景【3】来说,光调整硬件可还不行,uboot也是关键。
三、Uboot分析
芯片进入烧写模式时,默认走usbplug的uboot。查看启动usbplug的启动log发现系统只扫描到UFS就进行启动了,并没有扫描EMMC。
定位到SDK/u-boot/arch/arm/mach-rockchip/usbplug.c文件中bootdev_rockusb_cmd函数会根据dev_list数组定义的顺序来依次对存储介质进行初始化等操作,如果扫描到对应的存储设备就会直接从该存储介质中启动,也就是将固件烧写到该存储介质中。
从dev_list数组可以看到初始化存储介质的顺序为SCSI(UFS)->MMC(EMMC)。
所以对于有UFS颗粒和EMMC颗粒的核心板,当扫描到UFS存储介质之后,就会退出循环,不再对EMMC等存储介质进行扫描。
最后将扫描到的存储介质类型和设备号组合成“rockusb 0 xxx x”命令,最终在board_init函数中运行此命令,将固件烧写到对应的存储中。
四、软件修改?
要实现默认烧写固件到EMMC中而不是UFS中,需要让系统扫描到UFS后只做初始化,不退出循环,直到扫描到EMMC才退出循环,因此需要对bootdev_rockusb_cmd函数做以下修改:
修改后需要重新编译usbplug,以下操作均在u-boot目录下实现:
#编译usbplug.
/make.sh CROSS_COMPILE=/home/talowe/talowe-rk3576-linux-v1.01/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- rk3576-usbplug
#拷贝usbplug.bin到rkbin替换对应文件
cp usbplug.bin ../rkbin/bin/rk35/rk3576_usbplug_v1.04.bin
打包固件,以下操作均在SDK根目录下实现:
#重新编译uboot和loader./build.sh uboot
#打包整包固件./build.sh updateimg
?五、验证
如上则是针对同时存在UFS和EMMC,以EMMC为系统磁盘,UFS作为扩展存储器的软硬件完整修改方案了。掌握此逻辑后,可类比调整其他三种存储配置场景的软硬件参数。
441