I2C/SMBUS Fault Codes

本文总结了在I2C/SMBus堆栈中使用故障代码的最重要约定。

“Fault”并不总是“Error”

并非所有的fault报告都含有errors,“page faults”应该是一个熟悉的例子。软件在出现短暂故障(faults)后,经常会重试幂等操作。在某些情况下,可能存在一些更奇特的恢复方案,例如重新初始化(也可能是重置)。这样的恢复后,触发故障(fault)报告,没有错误(error)。

以类似的方式,有时“fault”代码只是报告了一个操作的定义结果……它根本不表明任何事情是错误的,只是结果没有在“golden path”上。

简而言之,为了正确响应,您的I2C驱动程序代码可能需要知道这些代码。其他代码可能需要依赖您的代码报告正确的错误(fault)代码,这样它才能(反过来)正确地运行。

I2C和SMBus的fault codes

在大多数调用中,这些返回值都是负数,其中0或某个正数表示无错误返回。尽管大多数Linux系统使用 <asm-generic/errno*.h> 编号,但与这些符号相关的具体数字在不同的体系结构之间是不同的。

注意,这里的描述不是详尽的。还可能返回其他代码,以及在其他情况下应该返回这些代码。然而,驱动程序不应该为这些情况返回其他代码(除非硬件不提供唯一的故障(fault)报告)。

此外,适配器探测方法返回的代码遵循特定于其主机总线(如PCI或platform总线)的规则。

EAGAIN

当I2C适配器在主传输模式中失去仲裁时返回:其他一些主服务器在同一时间传输不同的数据。

当某个任务已经在使用该I2C总线执行其他操作时,当尝试在原子上下文中调用I2C操作时也返回。

EBADMSG

当收到无效的包错误码字节时,由SMBus逻辑返回。此代码是覆盖事务中所有字节的CRC,在终止STOP之前发送。此错误仅在读事务时报告,SMBus slave可能有一种方法来报告来自主机的写入的PEC不匹配。请注意,即使使用了PECs,也不应该将其作为检测不正确数据传输的唯一方法。

EBUSY

当总线繁忙时间超过允许的时间时,由SMBus适配器返回。这通常表明某些设备(可能是SMBus适配器)需要一些故障恢复(例如复位),或者试图复位但失败。

EINVAL

这个相当模糊的错误意味着在启动任何I/O操作之前检测到无效参数。尽可能使用更具体的错误代码。

EIO

这个相当模糊的错误意味着在执行I/O操作时出现了错误。尽可能使用更具体的错误代码。

ENODEV

由驱动程序probe()方法返回。这比ENXIO更具体一点,意味着问题不在地址,而在那里找到的设备。驱动程序探测器可以验证设备返回正确的响应,并在适当的时候返回。(驱动核心会对ENXIO和ENODEV以外的probe故障发出警告。)

ENOMEM

由任何在需要分配内存时不能分配内存的组件返回。

ENXIO

由I2C适配器返回,表示传输的地址阶段没有得到ACK。虽然它可能只是意味着一个I2C设备暂时没有响应,但通常它意味着在那个地址上没有任何侦听。

由driver probe()方法返回,表示它们没有发现要绑定的设备。(也可以使用ENODEV。)

EOPNOTSUPP

当要求适配器执行它不支持或不能支持的操作时返回。

例如,当要求不支持SMBus块传输的适配器执行一个块传输时,将返回这个值。在这种情况下,发出该请求的驱动程序应该在发出该块传输请求之前验证该功能是否被支持。

类似地,如果I2C适配器不能执行所有合法的I2C消息,它应该在被要求执行它不能执行的事务时返回此消息。(这些限制在适配器的功能掩码中看不到,因为假设一个适配器支持I2C,那么它就支持所有的I2C。)

EPROTO

当slave不符合相关的I2C或SMBus(或特定于芯片的)协议规范时返回。一种情况是SMBus块数据响应(来自SMBus slave)的长度超出1-32字节的范围。

ESHUTDOWN

当使用已经挂起的适配器请求传输时返回。

ETIMEDOUT

这是由驱动程序返回的,当一个操作花费了太多的时间,并在它完成之前被中止。

当操作花费的时间超过SMBus规范所允许的时间时,SMBus适配器可以返回它;例如,当一个slave把时钟拖得太远。I2C没有这样的超时,但I2C适配器施加一些任意限制(比SMBus长得多!)也是正常的。

posted @ 2021-08-18 19:13  闹闹爸爸  阅读(403)  评论(0编辑  收藏  举报