I2C/SMBUS 故障代码¶
这是 I2C/SMBus 堆栈中使用故障代码的最重要约定摘要。
“故障”不总是“错误”¶
并非所有故障报告都意味着错误;“页面故障”应该是一个熟悉的例子。软件通常在瞬时故障后重试幂等操作。在某些情况下,可能存在更复杂的恢复方案,例如重新初始化(可能还有重置)。在由故障报告触发的此类恢复之后,没有错误。
类似地,有时“故障”代码只是报告操作的定义结果...它根本不表示任何错误,只是结果不在“黄金路径”上。
简而言之,您的 I2C 驱动程序代码可能需要知道这些代码才能正确响应。其他代码可能需要依赖您的代码报告正确的故障代码,以便它可以(反过来)正确运行。
I2C 和 SMBus 故障代码¶
这些代码作为负数从大多数调用返回,零或某些正数表示非故障返回。与这些符号关联的特定数字在不同架构之间有所不同,尽管大多数 Linux 系统都使用 <asm-generic/errno*.h> 编号。
请注意,此处的描述并非详尽无遗。可能返回其他代码,并且在其他情况下应返回这些代码。但是,驱动程序不应为这些情况返回其他代码(除非硬件不提供唯一的故障报告)。
此外,适配器探测方法返回的代码遵循特定于其主机总线(例如 PCI 或平台总线)的规则。
- EAFNOSUPPORT
当请求使用 10 位地址时,不支持 10 位地址的 I2C 适配器返回此代码。
- EAGAIN
当 I2C 适配器在主发送模式下丢失仲裁时返回此代码:其他一些主设备同时发送不同的数据。
当尝试在原子上下文中调用 I2C 操作时,当某些任务已经使用该 I2C 总线执行其他操作时,也会返回此代码。
- EBADMSG
当接收到无效的数据包错误代码字节时,SMBus 逻辑返回此代码。此代码是涵盖事务中所有字节的 CRC,并在终止 STOP 之前发送。此故障仅在读取事务中报告;SMBus 从设备可能有一种方法来报告主机写入的 PEC 不匹配。请注意,即使正在使用 PEC,您也不应仅依靠这些作为检测不正确数据传输的唯一方法。
- EBUSY
当总线繁忙的时间超过允许的时间时,SMBus 适配器会返回此代码。这通常表明某些设备(可能是 SMBus 适配器)需要进行一些故障恢复(例如重置),或者已尝试重置但失败。
- EINVAL
这个相当模糊的错误意味着在开始任何 I/O 操作之前检测到无效的参数。如果可以,请使用更具体的故障代码。
- EIO
这个相当模糊的错误意味着在执行 I/O 操作时出现了一些问题。如果可以,请使用更具体的故障代码。
- ENODEV
由驱动程序的 probe() 方法返回。这比 ENXIO 更具体,这意味着问题不在于地址,而在于在那里找到的设备。驱动程序探测可能会验证设备是否返回了正确的响应,并根据需要返回此代码。(驱动程序核心将警告除 ENXIO 和 ENODEV 之外的探测故障。)
- ENOMEM
由任何在需要时无法分配内存的组件返回。
- ENXIO
由 I2C 适配器返回,以指示传输的地址阶段没有获得 ACK。虽然这可能只是意味着 I2C 设备暂时没有响应,但通常意味着该地址没有监听任何设备。
由驱动程序的 probe() 方法返回,以指示它们没有找到要绑定的设备。(也可以使用 ENODEV。)
- EOPNOTSUPP
当被要求执行其不支持或无法支持的操作时,适配器会返回此代码。
例如,当要求不支持 SMBus 块传输的适配器执行该传输时,将返回此代码。在这种情况下,发出该请求的驱动程序应在发出该块传输请求之前验证是否支持该功能。
类似地,如果 I2C 适配器无法执行所有合法的 I2C 消息,则当要求执行其无法执行的事务时,应返回此代码。(这些限制无法在适配器的功能掩码中看到,因为假设如果适配器支持 I2C,则它支持所有 I2C。)
- EPROTO
当从设备不符合相关的 I2C 或 SMBus(或芯片特定)协议规范时返回。一种情况是,来自 SMBus 从设备的 SMBus 块数据响应的长度超出 1-32 字节的范围。
- ESHUTDOWN
当使用已挂起的适配器请求传输时返回。
- ETIMEDOUT
当操作花费的时间过长并在完成之前中止时,驱动程序会返回此代码。
当操作花费的时间超过 SMBus 规范允许的时间时,SMBus 适配器可能会返回此代码;例如,当从设备将时钟延长太远时。I2C 没有此类超时,但 I2C 适配器通常也会施加一些任意限制(比 SMBus 长得多!)。