【驱动调试】板子reboot后,JL6107未初始化。

JL6107的驱动集成完后,正常单板上下电时工作正常,但单板reboot后,JL6107就不正常了。
通过代码追踪,发现phy_driver_register驱动里的config_init未被调用,所以JL6107未正常初始化。

驱动与设备注册存在时序问题?

先将模块自动加载去掉,改为手动加载模组,看问题是否还会复现。

  • 初次上电后,由于不加载ko,Open失败,所以ifocnfig未看到eth0;手动加载ko后,再将eth0 up,可以看到JL6107初始化正常。
  • 再次reboot后,未发现open失败的打印信息,ifconfig也能看到eth0?此时的ko都还未加载,难道stmmac_open未执行?--确认有执行,见下面的调用关系
  • stmmac_open->stmmac_setup_phy->stmmac_init_phy->phy_connect->phy_connect_direct->phy_attach_direct->phy_init_hw
    在phy_init_hw中有config_init的调用,发现config_init为空,所以调用失败。
  • 在reboot后,执行ifconfig eth0 down,重新手动卸载ko,再加载ko,执行ifconfig eth0 up后,网卡工作正常。

从上面现象看,在reboot时驱动注册存在问题。

确认驱动注册问题

phy_driver_register

新发现

相同的软件版本加载到另一个单板内,就是OK的。驱别在于无问题板子reboot时网卡会断开,而有问题的板子网卡一直连着。怀疑是reboot过种中PHY的复位有区别。
手动调复位接口,PHY也不复位。
查看硬件,复位管脚与控制器断开了,下面这个Q601没有焊。
在这里插入图片描述
跳过Q601,分别将R625的两端连接到PHY的复位管脚,均发现无法复位,看来控制器驱动不行啊。让客户自己焊好Q601验证吧。

客户确认焊上Q601后问题解决

问题根因

后面确认是由于在reboot过程中,PHY未复位,所以总线扫到器件后又没有对应的驱动,就匹配上了通用的驱动,最终导致网卡异常。

### Reboot过程中内存初始化的详细机制 在操作系统中,`reboot`操作会触发系统的快速重启流程。此过程中,系统并不会完全断电,而是保持硬件处于通电状态,并跳过部分初始化步骤。以下是关于`reboot`过程中内存初始化的详细机制: #### 内存初始化的必要性 在`reboot`操作中,内存的初始化程度取决于具体的操作系统实现和硬件架构。通常情况下,`reboot`不会完全重新初始化内存控制器或清除所有内存内容,而是依赖于BIOS/UEFI提供的部分初始化功能[^1]。 #### 内存初始化的阶段 1. **BIOS/UEFI初始化** 在`reboot`过程中,BIOS/UEFI可能会执行简化的初始化过程,包括对内存控制器的基本设置。然而,这一阶段通常比冷启动时的初始化更为简化,可能不会重新检测所有内存模块或执行全面的内存测试[^2]。 2. **内核内存管理初始化** 操作系统内核在加载时会对内存管理子系统进行重新初始化。这包括: - 重新配置页表和虚拟内存映射。 - 初始化 slab 分配器或其他内存分配机制。 - 检查并标记已使用的物理页面为使用状态,确保新进程能够正确分配内存[^3]。 ```c // 示例:Linux内核中内存初始化代码片段 void __init mem_init(void) { unsigned long codesize, reservedpages, pagesetsize; int do_initcalls = 0; // 初始化页全局目录 pgd_init(0); // 计算内存使用情况 reservedpages = count_data_pages(); codesize = (unsigned long) &_etext - (unsigned long) &_stext; pagesetsize = (unsigned long) &pgd_cache - (unsigned long) &pgd_0; // 打印内存统计信息 printk(KERN_INFO "Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, %ldk data, %ldk init)\n", nr_free_pages() << PAGE_SHIFT, num_physpages << PAGE_SHIFT, codesize >> 10, reservedpages << PAGE_SHIFT >> 10, pagesetsize >> 10, (unsigned long)(&__init_end - &__init_begin) >> 10); } ``` 3. **文件系统缓存清理** 在`reboot`之前,操作系统会同步文件系统缓存到磁盘,并尝试释放尽可能多的内存页面。这一步骤确保了在重启后,内存中的脏数据不会影响新进程的运行[^4]。 #### 特殊情况下的内存处理 - 如果硬件支持ACPI规范中的S4(休眠)或S5(关机)状态,则`reboot`可能会涉及更复杂的电源管理逻辑,此时内存的初始化可能需要额外的处理。 - 在某些嵌入式系统中,`reboot`可能会保留特定区域的内存内容以加速启动过程,这种技术被称为“快速恢复”或“瞬时启动”[^5]。 ### 总结 `reboot`过程中,内存的初始化通常是部分完成的,依赖于BIOS/UEFI提供的基础支持以及操作系统内核的重新配置。与冷启动相比,`reboot`避免了完全断电和硬件的冷启动初始化,因此其速度更快,但内存初始化的深度也相对较低。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值