[RK3399][Android7.1] 调试笔记 --- I2C读取错误unexpected irq in STOP: 0x10

本文描述了在RK3399平台上,使用Android7.1和Kernelv4.4.83时,通过busyboxhwclock-r命令读取RTC硬件时间频繁出现的错误。错误信息包括rtcrtc0:read_time:failtoread和i2c意外中断等。解决方法是将I2C速率降低到100k。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83

现象:

当快速连续多次执行busybox hwclock -r去读取rtc硬件里的时间时,出现如下error:

[ 1003.621100] rtc rtc0: read_time: fail to read: -22

或者

[ 1009.333255] rk3x-i2c ff3d0000.i2c: unexpected irq in STOP: 0x10
[ 1010.329904] rk3x-i2c ff3d0000.i2c: timeout, ipd: 0x00, state: 4
[ 1010.329992] rtc rtc0: read_time: fail to read: -110

解决方法:

降低I2C速率到100k,默认I2C驱动用的就是100k,所以不需要配置。

&i2c4 {
	status = "okay";
	/*
	i2c-scl-rising-time-ns = <345>;
	i2c-scl-falling-time-ns = <11>;
	clock-frequency = <400000>;
	*/
    rx8010: rx8010@32 {
		compatible = "epson,rx8010";
		reg = <0x32>;
		status = "okay";
    };
};
<think>我们正在处理一个关于"out-of-bandirq51stuckorunexpected"的问题。这个错误通常与中断处理相关,特别是在使用某些硬件设备时。中断请求(IRQ)51可能属于特定的硬件设备,而"out-of-band"(带外)通常指的是通过非标准通道(如边带信号)传递的中断。这种错误表明该中断没有被正确处理,可能是由于驱动程序问题、硬件故障或系统配置问题。根据已有的知识,我们可以从以下几个方面进行排查:1.**确认中断源**:首先需要确定IRQ51对应哪个设备。可以通过查看`/proc/interrupts`文件来获取中断分配情况。2.**检查驱动程序**:如果确定了设备,检查其驱动程序是否有问题,是否需要更新或重新加载。3.**检查硬件状态**:硬件故障可能导致中断异常,检查相关硬件(如PCI设备)是否工作正常。4.**系统日志分析**:查看系统日志(如`dmesg`和`/var/log/messages`)获取更详细的错误信息。5.**内核参数调整**:有时可以通过调整内核参数来避免中断问题,例如尝试禁用或启用某些中断处理特性。由于用户提到了之前引用中的内容(虽然引用是关于pppoe和内存回收的,但可能与当前问题无关),我们主要关注中断问题。###步骤详解####1.确认中断源使用以下命令查看中断分配:```bashcat/proc/interrupts```在输出中查找IRQ51对应的设备。例如,输出可能如下:```51:12345678PCI-MSI-edgesnd_hda_intel```这里IRQ51被分配给了声卡设备(snd_hda_intel)。记录下设备名称。####2.检查系统日志使用`dmesg`命令查看内核日志,并过滤与IRQ51相关的信息:```bashdmesg|grep-i"irq51"```或者查看系统日志文件:```bashgrep-i"irq51"/var/log/messages```或者使用`journalctl`(对于使用systemd的系统):```bashjournalctl-k|grep-i"irq51"```这些命令可以帮助我们找到具体的错误信息,例如中断卡住的原因。####3.重新加载驱动程序如果确定是某个设备的驱动导致的问题,尝试卸载并重新加载该驱动。例如,如果IRQ51对应的是`snd_hda_intel`(声卡驱动):```bashsudormmodsnd_hda_intelsudomodprobesnd_hda_intel```注意:在卸载驱动时,相应的设备将不可用,请确保不影响系统运行。####4.检查硬件状态如果是PCI设备,使用`lspci`命令查看设备状态:```bashlspci-v```在输出中找到对应设备,查看其状态信息。如果有异常,可能是硬件问题。####5.内核参数调整尝试在启动内核时传递参数来调整中断行为。例如,可以尝试禁用中断线程化(如果启用的话)或使用其他中断处理模式。编辑`/etc/default/grub`文件,在`GRUB_CMDLINE_LINUX`行添加参数,例如:```GRUB_CMDLINE_LINUX="...threadirqs=off..."```然后更新grub配置并重启:```bashsudoupdate-grubsudoreboot```注意:调整内核参数需要谨慎,建议在测试环境中先尝试。####6.更新内核和驱动程序如果问题持续存在,考虑更新内核和相关驱动程序,因为新版本可能已经修复了该问题。###相关问题§§相关问题§§1.如何查看Linux系统中所有中断的分配情况?2.如何动态调整Linux内核参数以解决中断问题?3.在Linux中,如何卸载并重新加载一个内核模块?4.如何查看Linux系统日志以诊断硬件问题?5.更新Linux内核的具体步骤是什么?</think>### 排查和解决 "out-of-band IRQ 51 stuck/unexpected" 错误错误表明系统处理中断请求(IRQ)时出现问题,特别是IRQ 51相关的带外中断(通常指高优先级中断)。以下是系统化的排查步骤: #### 1. **确认中断源** ```bash cat /proc/interrupts | grep 51 ``` - 查看输出中IRQ 51对应的设备(如`nvme0q6`表示NVMe固态硬盘) - 记录设备名称和中断计数器值 #### 2. **检查内核日志** ```bash dmesg -T | grep -iE "irq|51|stuck" journalctl -k --since "1 hour ago" | grep -i "irq 51" ``` - 查找类似错误: ``` irq 51: nobody cared (try booting with the "irqpoll" option) handlers: [<ffffffffc0a8c0d0>] nvme_irq [nvme] ``` #### 3. **临时解决方案(重启后失效)** ```bash # 禁用中断诊断(谨慎使用) echo 0 > /proc/sys/kernel/unknown_nmi_panic # 调整中断平衡(适用于多核CPU) sudo apt install irqbalance sudo systemctl restart irqbalance ``` #### 4. **持久化解决方案** **步骤1:更新固件和驱动** ```bash sudo apt update sudo apt install --reinstall linux-firmware nvme-cli sudo nvme fw-log /dev/nvme0 # 检查NVMe固件日志 ``` **步骤2:调整内核参数** 编辑`/etc/default/grub`: ```diff GRUB_CMDLINE_LINUX="... + intel_idle.max_cstate=1 irqpoll pci=noaer" ``` 更新配置: ```bash sudo update-grub && sudo reboot ``` **步骤3:中断绑定(针对特定设备)** ```bash # 查看设备中断号 grep "nvme" /proc/interrupts # 绑定到特定CPU核心 echo 2 > /proc/irq/51/smp_affinity_list ``` #### 5. **硬件诊断** ```bash # 检查PCI设备状态 lspci -vvv -s $(lspci | grep NVMe | awk '{print $1}') # 测试NVMe健康状态 sudo nvme smart-log /dev/nvme0 ``` 重点关注: - `critical_warning` 字段 - `media_errors` 计数 ### 故障树分析 ```mermaid graph TD A[IRQ 51错误] --> B{硬件 or 软件?} B -->|硬件| C[检查NVMe健康状态] B -->|软件| D[检查驱动日志] C -->|介质错误| E[更换存储设备] D -->|驱动崩溃| F[更新内核/驱动] D -->|中断风暴| G[调整CPU亲和性] ``` ### 常见原因 1. **NVMe固态硬盘故障**(最常见) 2. 内核驱动不兼容(特别是5.4-5.10版本) 3. CPU电源管理冲突(C-states问题) 4. 中断处理程序死锁 5. PCIe通道错误(需检查`dmesg | grep -i aer`) > **注意**:若问题在虚拟机中出现,需检查宿主机中断设置并更新虚拟化驱动(如`hv_vmbus`)。 ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值