前言

此系列博文是在解决了openwrt在NanoPi R2s上启动失败的解决过程记录,顺带也熟悉了rk3328系列的芯片的启动过程和openwrt中对uboot和最终镜像的生成过程。

问题现象

在master主线的版本编译后,烧写到闪迪的32G TF卡后,发现不能启动,通过串口,得到以下输出。

U-Boot TPL 2021.01 (Jun 13 2021 - 22:02:19)
DDR4, 333MHz
BW=32 Col=10 Bk=4 BG=2 CS0 Row=15 CS=1 Die BW=16 Size=1024MB
Trying to boot from BOOTROM
Returning to boot ROM...U-Boot SPL 2021.01 (Jun 13 2021 - 22:02:19 +0000)
Trying to boot from MMC1
mmc_load_image_raw_sector: mmc block read error
SPL: failed to boot from all boot devices

问题分析

通过添加日志,定位mmc_load_image_raw_sector接口,有如下日志:

U-Boot TPL 2021.01 (Jun 13 2021 - 22:02:19)
DDR4, 333MHz
BW=32 Col=10 Bk=4 BG=2 CS0 Row=15 CS=1 Die BW=16 Size=1024MB
Trying to boot from BOOTROM
Returning to boot ROM...U-Boot SPL 2021.01 (Jun 13 2021 - 22:02:19 +0000)
Trying to boot from MMC1
Buswidth = 0, clock: 0
Buswidth = 0, clock: 0
Buswidth = 1, clock: 0
Buswidth = 1, clock: 400000
CMD_SEND:0ARG            0x00000000
Sending CMD0MMC_RSP_NONE
CMD_SEND:8ARG            0x000001aa
Sending CMD8MMC_RSP_R1,5,6,7     0x000001aa
CMD_SEND:55ARG           0x00000000
Sending CMD55MMC_RSP_R1,5,6,7    0x00800120
CMD_SEND:41ARG           0x40300000
Sending CMD41MMC_RSP_R3,4        0x00ff8000
CMD_SEND:55ARG           0x00000000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000120
CMD_SEND:41ARG           0x40300000
Sending CMD41MMC_RSP_R3,4        0x00ff8000
CMD_SEND:55ARG           0x00000000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000120
CMD_SEND:41ARG           0x40300000
Sending CMD41MMC_RSP_R3,4        0x00ff8000
CMD_SEND:55ARG           0x00000000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000120
CMD_SEND:41ARG           0x40300000
Sending CMD41MMC_RSP_R3,4        0x00ff8000
CMD_SEND:55ARG           0x00000000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000120
CMD_SEND:41ARG           0x40300000
Sending CMD41MMC_RSP_R3,4        0x00ff8000
CMD_SEND:55ARG           0x00000000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000120
CMD_SEND:41ARG           0x40300000
Sending CMD41MMC_RSP_R3,4        0x80ff8000
CMD_SEND:2ARG            0x00000000
Sending CMD2MMC_RSP_R2       0x03534453 0x44303332 0x80ffffff 0xff0062c5 DUMPING DATA000 - 03 53 44 53 004 - 44 30 33 32 008 - 80 ff ff ff 012 - ff 00 62 c5
CMD_SEND:3ARG            0x00000000
Sending CMD3MMC_RSP_R1,5,6,7     0xd5550520
CMD_SEND:9ARG            0xd5550000
Sending CMD9MMC_RSP_R2       0x00260032 0x515981e9 0xbef9cfff 0x92404053 DUMPING DATA000 - 00 26 00 32 004 - 51 59 81 e9 008 - be f9 cf ff 012 - 92 40 40 53
CMD_SEND:7ARG            0xd5550000
Sending CMD7MMC_RSP_R1,5,6,7     0x00000700
CMD_SEND:55ARG           0xd5550000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000920
CMD_SEND:51ARG           0x00000000
Sending CMD51MMC_RSP_R1,5,6,7    0x00000920
CMD_SEND:55ARG           0xd5550000
Sending CMD55MMC_RSP_R1,5,6,7    0x00000920
CMD_SEND:6ARG            0x00000000
Sending CMD6MMC_RSP_R1,5,6,7     0x00000920
Buswidth = 1, clock: 400000
Buswidth = 1, clock: 25000000
spl: mmc boot mode: raw
CMD_SEND:16ARG           0x00000200
Sending CMD16MMC_RSP_R1,5,6,7    0x00000900
CMD_SEND:17ARG           0x00800000
Sending CMD17MMC_RSP_R1,5,6,7    0x00000900
hdr read sector 4000, count=1
dump header...
magic:0x0
hcrc: 0x0
size: 0x0
load: 0x0
==============
mmc_load_image_raw_sector: mmc block read error
spl: mmc boot mode: fs
SPL: failed to boot from all boot devices
### ERROR ### Please RESET the board ###

可以看出在协商后,MMC总线宽度为1,而不是4,这是不能正常进行通信的。通过查找MMC协议手册,BUS宽度是可以通过协商然后确定的。接下来就查看原理图,再对比linux下的设备树,TF卡的电源通过vcc_sd和vcc_io_sdio控制,而在rk3328-nanopi-r2s-u-boot.dtsirk3328-nanopi-r2s.dts中,有如下内容:

 /* Need this and all the pinctrl/gpio stuff above to set pinmux */&vcc_sd {u-boot,dm-spl;};vcc_io_sdio: sdmmcio-regulator {compatible = "regulator-gpio";enable-active-high;gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;pinctrl-0 = <&sdio_vcc_pin>;pinctrl-names = "default";regulator-name = "vcc_io_sdio";regulator-always-on;regulator-min-microvolt = <1800000>;regulator-max-microvolt = <3300000>;regulator-settling-time-us = <5000>;regulator-type = "voltage";startup-delay-us = <2000>;states = <1800000 0x13300000 0x0>;vin-supply = <&vcc_io_33>;};vcc_sd: sdmmc-regulator {compatible = "regulator-fixed";gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>;pinctrl-0 = <&sdmmc0m1_gpio>;pinctrl-names = "default";regulator-name = "vcc_sd";regulator-boot-on;regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;vin-supply = <&vcc_io_33>;};&sdmmc {bus-width = <4>;cap-sd-highspeed;disable-wp;pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>;pinctrl-names = "default";sd-uhs-sdr12;sd-uhs-sdr25;sd-uhs-sdr50;sd-uhs-sdr104;vmmc-supply = <&vcc_sd>;vqmmc-supply = <&vcc_io_sdio>;status = "okay";};

可以看出通过 GPIO1 RK_PD4 控制SD卡的IO电压,通过GPIO0 RK_PD6控制SD的供电电压,前者电压可以配置,后面是固定电压。然后尝试开启MMC的IO可配置选项,再使能对应的pinctrl,并且因为不能启动的卡容量为32G,需要开启UHS支持,接下来进修改,编译后烧写测试。

修改如下:

diff --git a/arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi b/arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi
index 9e2ced1541..d5469748a2 100644
--- a/arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi
+++ b/arch/arm/dts/rk3328-nanopi-r2s-u-boot.dtsi
@@ -33,6 +33,10 @@u-boot,dm-spl;};+&vcc_io_sdio {
+  u-boot,dm-spl;
+};
+&gmac2io {snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;snps,reset-active-low;
diff --git a/arch/arm/dts/rk3328-nanopi-r2s.dts b/arch/arm/dts/rk3328-nanopi-r2s.dts
index 5445c5cb3d..452e4764e6 100644
--- a/arch/arm/dts/rk3328-nanopi-r2s.dts
+++ b/arch/arm/dts/rk3328-nanopi-r2s.dts
@@ -323,7 +323,7 @@bus-width = <4>;cap-sd-highspeed;disable-wp;
-   pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>;
+  pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>, <&sdmmc0m1_gpio>;pinctrl-names = "default";sd-uhs-sdr12;sd-uhs-sdr25;diff --git a/configs/nanopi-r2s-rk3328_defconfig b/configs/nanopi-r2s-rk3328_defconfig
index 52996266a1..a7969bd7ab 100644
--- a/configs/nanopi-r2s-rk3328_defconfig
+++ b/configs/nanopi-r2s-rk3328_defconfig
@@ -56,6 +56,10 @@ CONFIG_FASTBOOT_BUF_ADDR=0x800800CONFIG_FASTBOOT_CMD_OEM_FORMAT=yCONFIG_ROCKCHIP_GPIO=yCONFIG_SYS_I2C_ROCKCHIP=y
+CONFIG_MMC_IO_VOLTAGE=y
+CONFIG_SPL_MMC_IO_VOLTAGE=y
+CONFIG_MMC_UHS_SUPPORT=y
+CONFIG_SPL_MMC_UHS_SUPPORT=yCONFIG_MMC_DW=yCONFIG_MMC_DW_ROCKCHIP=yCONFIG_SF_DEFAULT_SPEED=20000000

结果

经过上面的修改,发现系统能够正常启动了,说明总线宽度正常协商好了,电压范围也OK,下面是正常启动的日志。

U-Boot TPL 2021.01 (Jun 13 2021 - 22:02:19)
DDR4, 333MHz
BW=32 Col=10 Bk=4 BG=2 CS0 Row=15 CS=1 Die BW=16 Size=1024MB
Trying to boot from BOOTROM
Returning to boot ROM...U-Boot SPL 2021.01 (Jun 13 2021 - 22:02:19 +0000)
Trying to boot from MMC1
Found FIT
NOTICE:  BL31: v2.3():v2.3
NOTICE:  BL31: Built : 15:56:43, Apr 20 2020
NOTICE:  BL31:Rockchip release version: v1.2U-Boot 2021.01 (Jun 13 2021 - 22:02:19 +0000) OpenWrtModel: FriendlyElec NanoPi R2S
DRAM:  1022 MiB
PMIC:  RK8050 (on=0x40, off=0x00)
MMC:   mmc@ff500000: 1
Loading Environment from MMC... MMC Device 0 not found
*** Warning - No MMC card found, using default environmentIn:    serial@ff130000
Out:   serial@ff130000
Err:   serial@ff130000
Model: FriendlyElec NanoPi R2S
Net:   eth0: ethernet@ff540000
Hit any key to stop autoboot:  0
=>

总结

在多次尝试后,拿了一张以前的4G金士顿得到TF卡进行对比,发现金士顿的低速卡是OK的;通过日志就发现协商完两者总线宽度不正常,这个时候去简单搜了下协议,发现不同的速度对应不同的频率和电压,发现是不是电压配置不正确还是哪个GPIO没有配置对。
这个时候就去查看同SOC的板子,比较,新增了对dts的修改,再打开了对应的CONFIG选项,果真成功了!!!遇到问题要不断的发现蛛丝马迹,多想一下可能的解决方案,这个时候难题往往就能解决了。

RK3328启动失败解决记录相关推荐

  1. centos7下docker启动失败解决

    centos7下docker启动失败解决 docker安装成功却启动失败,查看docker服务,systemctl status docker.service, 服务日志提示Failed to sta ...

  2. mysql安装服务和安装中常见问题install/Remove of the Service Denied与net start mysql服务启动失败解决方法

    mysql安装服务和安装中常见问题install/Remove of the Service Denied与net start mysql服务启动失败解决方法 参考文章: (1)mysql安装服务和安 ...

  3. xampp中apache点击启动失败解决方法

    xampp中apache点击启动失败解决方法 参考文章: (1)xampp中apache点击启动失败解决方法 (2)https://www.cnblogs.com/cuisaihang/p/70088 ...

  4. SSH启动失败解决方法

    SSH启动失败解决方法 参考文章: (1)SSH启动失败解决方法 (2)https://www.cnblogs.com/setevn/p/7845987.html 备忘一下.

  5. ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法

    ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法 参考文章: (1)ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法 (2)https://www. ...

  6. Arcgis10.2安装及LicensenManager10.2启动失败解决方法

    arcgis10.2安装步骤: https://jingyan.baidu.com/article/fc07f98911b66912ffe5199b.html LicensenManager10.2启 ...

  7. APMServ启动失败解决方法

    APMServ启动失败解决方法 我的是APMServ5.2.6在win10下启动失败,折腾的1个多小时,发现是httpd-ssl.conf路径不正确,以下是常见的启动失败原因和解决方法. 一.安装路径 ...

  8. avahi-daemon启动失败-解决方法-linux

    avahi-daemon启动失败-解决方法-linux 参考文章: (1)avahi-daemon启动失败-解决方法-linux (2)https://www.cnblogs.com/xuejungo ...

  9. License Manager 10.3启动失败解决方法

    License Manager 10.3启动失败解决方法 参考文章: (1)License Manager 10.3启动失败解决方法 (2)https://www.cnblogs.com/xixihu ...

最新文章

  1. 头号任务:CIO面临的十大挑战预测
  2. jetbrains是最好的编译器系列
  3. C#使用Cookie方法
  4. 掘金外链即将失效?论如何用脚本一次性下载/替换失效的外链图片
  5. windows安装ruby on rails
  6. scala类型匹配注意事项
  7. Telerik for AJAX RadGrid控件
  8. ExtJs4学习(一):正确认识ExtJs4
  9. 从grub中引导进入windows7的启动管理界面
  10. springboot 使用i18n进行国际化发生乱码问题
  11. 图像识别用什么神经网络,图神经网络可以做什么
  12. mybatis 批量新增 批量修改
  13. 用mysql建销售订单主表_mysql订单表如何设计?
  14. MyBatis 学习(七):深入 Mapper XML映射文件
  15. 视频转换中的码率是什么意思?它的大小有什么作用?
  16. OC中的^怎么理解?
  17. 《港联证券》股票必须持仓多久才能卖?股票买入多久显示持仓?
  18. (三)爬取一些网页图片
  19. 蓝牙(BLE)传输数据的吞吐量
  20. 杭州斯凯SDK教程_入门篇

热门文章

  1. php excel 导出图片,phpexcel 导出多张图片
  2. [4G5G基础学习]:流程 - 4G LTE 核心网的Attach流程
  3. python基础训练—字符串
  4. 特斯拉Q4财报:底部反弹70%,为信仰打call
  5. Win10家庭版中文用户名改英文用户名方法(亲测管用)
  6. 精妙sql语句(完全版)
  7. Kali Linux 渗透测试之被动信息收集(三)——Recon-NG框架
  8. 北京小学 计算机派位,北京小升初东西海朝4区电脑派位规则汇总 2021家长必看...
  9. Keil软件仿真STM32互补输出PWM
  10. idm+百度下载助手解决百度网盘限速