I2C/SMBUS 故障程式碼

這是 I2C/SMBus 堆疊中使用故障程式碼的最重要約定的摘要。

“故障”並不總是“錯誤”

並非所有故障報告都意味著錯誤;“頁面錯誤”應該是一個熟悉的例子。 軟體通常會在瞬態故障後重試冪等操作。 在某些情況下,可能存在更高階的恢復方案,例如重新初始化(可能還有重置)。 在由故障報告觸發的此類恢復之後,不會發生錯誤。

類似地,有時“故障”程式碼只是報告操作的已定義結果……它並不表示任何錯誤,只是結果不在“黃金路徑”上。

簡而言之,您的 I2C 驅動程式程式碼可能需要了解這些程式碼才能正確響應。 其他程式碼可能需要依賴您的程式碼來報告正確的故障程式碼,以便它可以(反過來)正確執行。

I2C 和 SMBus 故障程式碼

這些作為負數從大多數呼叫中返回,零或某個正數表示非故障返回。 與這些符號關聯的特定數字因體系結構而異,但大多數 Linux 系統使用 <asm-generic/errno*.h> 編號。

請注意,此處的描述並不詳盡。 可能返回其他程式碼,並且在其他情況下應返回這些程式碼。 但是,驅動程式不應針對這些情況返回其他程式碼(除非硬體未提供唯一的故障報告)。

此外,介面卡探測方法返回的程式碼遵循特定於其主機匯流排(例如 PCI 或平臺匯流排)的規則。

EAFNOSUPPORT

當請求使用 10 位地址但 I2C 介面卡不支援時返回。

EAGAIN

當 I2C 介面卡在主傳送模式下丟失仲裁時返回:其他一些主裝置同時傳送不同的資料。

當嘗試在原子上下文中呼叫 I2C 操作時,如果某個任務已在使用該 I2C 匯流排執行其他操作,也會返回此值。

EBADMSG

當收到無效的資料包錯誤程式碼位元組時,由 SMBus 邏輯返回。 此程式碼是一個 CRC,涵蓋事務中的所有位元組,並在終止 STOP 之前傳送。 此故障僅在讀取事務中報告; SMBus 從裝置可能有一種方法來報告來自主裝置的寫入操作的 PEC 不匹配。 請注意,即使正在使用 PEC,您也不應僅依賴這些作為檢測不正確資料傳輸的唯一方法。

EBUSY

當匯流排忙碌的時間超過允許的時間時,由 SMBus 介面卡返回。 這通常表明某些裝置(可能是 SMBus 介面卡)需要一些故障恢復(例如重置),或者嘗試重置但失敗。

EINVAL

這個相當模糊的錯誤意味著在任何 I/O 操作開始之前檢測到無效引數。 如果可以,請使用更具體的故障程式碼。

EIO

這個相當模糊的錯誤意味著在執行 I/O 操作時出現問題。 如果可以,請使用更具體的故障程式碼。

ENODEV

由 driver probe() 方法返回。 這比 ENXIO 更具體,意味著問題不在於地址,而在於在那裡找到的裝置。 驅動程式探測可能會驗證裝置是否返回正確的響應,並酌情返回此程式碼。 (驅動程式核心會警告除 ENXIO 和 ENODEV 之外的探測故障。)

ENOMEM

由任何在需要時無法分配記憶體的元件返回。

ENXIO

由 I2C 介面卡返回,以指示傳輸的地址階段未收到 ACK。 雖然這可能只意味著 I2C 裝置暫時沒有響應,但通常意味著該地址上沒有任何裝置在監聽。

由 driver probe() 方法返回,以指示它們未找到要繫結的裝置。 (也可以使用 ENODEV。)

EOPNOTSUPP

當被要求執行其不支援或無法支援的操作時,由介面卡返回。

例如,當要求不支援 SMBus 塊傳輸的介面卡執行塊傳輸時,將返回此值。 在這種情況下,發出該請求的驅動程式應在發出該塊傳輸請求之前驗證是否支援該功能。

同樣,如果 I2C 介面卡無法執行所有合法的 I2C 訊息,則當要求執行其無法執行的事務時,它應返回此程式碼。 (這些限制無法在介面卡的功能掩碼中看到,因為假設介面卡支援 I2C,它就支援所有 I2C。)

EPROTO

當從裝置不符合相關的 I2C 或 SMBus(或特定於晶片的)協議規範時返回。 一種情況是 SMBus 塊資料響應(來自 SMBus 從裝置)的長度超出 1-32 位元組的範圍。

ESHUTDOWN

當使用已暫停的介面卡請求傳輸時返回。

ETIMEDOUT

當操作花費的時間太長,並在完成之前中止時,驅動程式會返回此值。

當操作花費的時間超過 SMBus 規範允許的時間時,SMBus 介面卡可能會返回此值; 例如,當從裝置將時鐘拉伸得太遠時。 I2C 沒有此類超時,但 I2C 介面卡通常也會施加一些任意限制(遠長於 SMBus!)。