복구는 어댑터가 제공하는 기능입니다
Linux v6.18.37의 i2c_recover_bus는 어댑터의 bus_recovery_info가 없으면 -EBUSY를 반환하고, 있으면 recover_bus 콜백을 호출합니다. 모든 어댑터가 같은 GPIO 펄스 절차를 사용하거나 복구 자체를 지원하는 것은 아닙니다.
일반 SCL 복구 경로는 SCL을 읽고 바꿀 수 있어야 합니다. 초기화 검사는 get_sda 또는 set_sda도 요구하며, 컨트롤러 전용 recover_bus는 별도 구현을 사용할 수 있습니다. prepare_recovery, pinctrl 전환, unprepare_recovery와 기본 핀 상태 복원은 정상 전송과 복구가 핀을 함께 사용하기 위한 조건입니다.
펄스 아홉 번을 보내면 항상 안전한가요?
그렇지 않습니다. 쓰기 전송이 ACK 단계에서 끊겼다면 추가 클록이 장치의 데이터 비트로 해석될 수 있습니다. 고정 버전의 fault-injection 문서는 SDA 확인이나 STOP 없이 펄스를 계속 보내면 의도하지 않은 레지스터 쓰기가 발생할 수 있다고 설명합니다.
i2c_generic_scl_recovery는 최대 아홉 클록 주기의 상승·하강 에지를 만들면서 SCL이 실제로 올라왔는지 확인합니다. set_sda가 있으면 STOP 조건을 만들도록 SDA를 뒤따르게 합니다. 상승 단계에서 버스가 풀렸다고 확인되면 일찍 종료하고, SCL이 계속 낮으면 -EBUSY로 끝냅니다.
버스 상태를 읽을 수 없는 구성에서는 구현이 성공을 가정하는 경로도 있습니다. 따라서 반환값이 0이라고 해서 파형이 정상이고, 대상 장치의 상태가 보존되며, 다음 전송이 성공한다는 것까지 증명되지는 않습니다.
복구 결과와 고장 원인을 따로 남깁니다
SDA가 외부에서 계속 낮게 고정되거나 SCL이 올라올 수 없는 물리 상태라면 소프트웨어 펄스로 해결할 수 없습니다. 풀업, 전압, 장치 전원과 핀 소유권은 해당 회로 조건으로 확인합니다. 버스 복구를 반복했다고 해서 결함이 제거됐다고 판단하지 않습니다.
검증 기록은 끊긴 전송 위치, 복구 전후 SCL/SDA, 반환값, 후속 정상 전송을 구분합니다. 이 글의 설명은 구현과 문서 대조이며, 특정 보드의 GPIO를 전환하거나 fault injector를 실행한 결과가 아닙니다.
- 지원 확인
어댑터 콜백과 핀 제어 조건
- 버스 해제
SCL/SDA와 STOP 관찰
- 기능 재확인
허용된 후속 전송 결과