您尚未登录。

楼主 # 2024-11-30 14:29:29

15121102075@139.com
会员
注册时间: 2024-09-29
已发帖子: 7
积分: 12

F1c100s升级5.7.1内核卡死,starting kernel ...

荔枝派升级5.7.1内核,卡死在starting kernel...
第一步:尝试early_printk,提示信息

Error: invalid dtb and unrecognized/unsupported machine ID
  r1=0x00000000, r2=0x00000000
Available machine support:

ID (hex)        NAME
ffffffff        Generic DT based system
ffffffff        Allwinner suniv Family
ffffffff        Allwinner sun9i Family
ffffffff        Allwinner A83t board
ffffffff        Allwinner sun8i Family
ffffffff        Allwinner sun7i (A20) Family
ffffffff        Allwinner sun6i (A31) Family
ffffffff        Allwinner sun4i/sun5i Families

Please check your kernel config and/or bootloader.

第二步:直接读取缓存信息。缓存地址在内核编译目录system.map文件中,找到__log_buf对应的地址c0b3e460

c0b3e460 b __log_buf

重启荔枝派,进入Uboot命令行界面,输入md c0b3e460。不断敲击回车,直到全是0。出来的数据格式显示不好阅读,丢给网上ai聊天软件,整理成人类可读的格式。如下:

FEL.eGON.BT0
Unknown boot source %d. Timeout
Initialising DRAM
DRAM initialisation failed: dram[0x%x] != 0x%x. Resetting...
DRAM:. %d MiB
Trying to boot from %s. SPL: Unsupported Boot Device!
SPL: failed to boot from all boot devices
U-Boot SPL 2018.01-05676-g0
Apr 08 2018 - 16:10:2
U-Boot.spl: unsupported mmc boot device...
l: could not initialise mmc. error: %d..spl: could not find mmc device. error: %
spl: mmc init failed with error: %d..spl: mmc
partition switch failed. mmc_load_image_raw_sector:
sector: mmc block read error..spl: mmc: wrong boot
mode..MMC2_2.MMC1

### ERROR
### Please RESET the board ###.

### Wrong ISO Id entry: %s on %d:%d
### EL TORITO SPECIFICATION.**
No valid boot catalog found on %d:%d **.**
### Wrong El Torito identifier: %s on %d:%d *
### Can't read Boot Entry at %lX on %d:%d **..
### Checksum Error in booting catalog
### alog validation
entry on %d:%d *
*..** Key 0x55 0xAA error on %d:
** Partition %d not found
** Partition %d not bootable on device %d *
** No boot partition found on
device %d **..P
art Start Sect x Size Type
%2d %lu %lu %

..mmc_init: block number 0x%lx exceeds max(0x%lx)..
mmc fail to send stop cmd..%s: %
d, time %lu..Status Error: 0x%08
X..Timeout waiting for card ready..
MC: no card present..Card did not respond to voltage select!.MMC
SET_DSR failed..

<FPMMC Device %d not found..mmc.
sunxi SPI.mmc %u
error cannot set clock to %u..S
UNXI SD/MMC.Wrong mmc number %d.
mmc_cd.Cannot find console..

离线

楼主 #1 2024-11-30 14:49:10

15121102075@139.com
会员
注册时间: 2024-09-29
已发帖子: 7
积分: 12

Re: F1c100s升级5.7.1内核卡死,starting kernel ...

第三步:分析。
3.1- 设备树dts问题
    1. 仔细分析dts实现逻辑,没问题。用dtc单独编译出现语法错误。单独编译4.14内核的dts进行对照试验。发现linux自带的dtc命令,无法对include进行预处理。造成语法错误的提示。初步排除dts问题,进行下一步分析。

3.2- 内核id与uboot id不匹配
 
  1. 有文章显示。uboot中的Machine ID与内核中的Machine ID不匹配。在uboot环境变量fdt_file与dtb文件名不一致或找不到dtb文件。
       在uboot命令行中打印环境变量,结果为空。翻阅之前的启动输入,dtb已经成功找到。


3.3- 内核空间不够
    1.根据缓存提示,存在内核空间不够。f1c100s中dram最大支持32m,内核文件只有4m多。

离线

楼主 #2 2024-11-30 22:18:20

15121102075@139.com
会员
注册时间: 2024-09-29
已发帖子: 7
积分: 12

Re: F1c100s升级5.7.1内核卡死,starting kernel ...

3.2- 内核id与uboot id不匹配(续)
- 内核arch/arm/tools/mach-types中,没有suniv的机器码;在arch/arm/include/asm/mach-types.h,仅有sun4i的机器码。验证其他芯片型号的机器码在两个文件中是对应的。那么为何f1c100s没有在这里写明?如果没有写明,如何进行的机器码验证?
 
- 答案在于,在现代linux中,可以通过设备树验证和配置硬件,而不完全依赖机器码。所以提示中“unrecognized/unsupported machine ID”的原因就找到了。

离线

楼主 #3 2024-11-30 22:42:22

15121102075@139.com
会员
注册时间: 2024-09-29
已发帖子: 7
积分: 12

Re: F1c100s升级5.7.1内核卡死,starting kernel ...

3.2- 内核id与uboot id不匹配(续)

此外:

1. 在uboot命令行中bdinfo和printenv输出情况如下:fdt_addr_r=0x80C00000 /设备树地址。在配置uboot时的传递地址参数bootcmd如下,与上述地址不符。 load mmc 0:1 0x80008000 zImage /内核起始地址          load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb /设备树地址 bootz 0x80008000 - 0x80c08000
 
2. 打印printenv bootcmd的参数。发现bootcmd=run distro_bootcmd,该值发生了变化。bootcmd=run distro_bootcmd。distro_bootcmd=for target in {boot_targets}; do run bootcmd_{target}; done
 
3. 发现默认的uboot设置就是这个参数。编译uboot发现uboot中也有设备树!!!那么,为何有在uboot和内核中有两个设备树?并且这两个设备树文件,有点小区别。这会不会相互耦合和影响?答案是:只需要启动一个就好了,常规配置中,不启用uboot的设备树。

最近编辑记录 15121102075@139.com (2024-11-30 22:42:50)

离线

楼主 #4 2024-11-30 22:46:08

15121102075@139.com
会员
注册时间: 2024-09-29
已发帖子: 7
积分: 12

Re: F1c100s升级5.7.1内核卡死,starting kernel ...

回过头来,继续在设备树的方面上进行探索。

3.1- 设备树dts问题(续)
在compressed/head.s中有如下代码

 `ldr lr, [r6, #0] #ifndef **ARMEB** ldr r1, =0xedfe0dd0 @ sig is 0xd00dfeed big endian ldr r1,=0xedfe0 dd0 @ sig是0 x d00 dfeed big endian #else ldr r1, =0xd00dfeed #endif cmp lr, r1 bne dtb_check_done @ not found`        
从上面代码可以看出,r6是内核正常的结尾处,D0 0D FE ED是dtb的魔数(用于识别为dtb文件的一段数字),当CONFIG_ARM_APPENDED_DTB选项被选中时会将内核正常结尾处也就是附加dtb开头的内容加载到lr中,同时根据大小端,将dtb的魔数设置到寄存器r1中,接着判断二者是否相等,如果不等,说明未找到dtb,否则说明内核自带了dtb。如果发现存在dtb append,则在后续解压内核时避免对dtb部分造成影响,最终调整dtb的相关指针,以便内核启动时,能够正确加载和解析dtb。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn