나는 이것에 대해 거의 이해하지 못하므로 양해해 주시기 바랍니다. 지금까지 내가 수집한 것에서 Linux의 i2c 하위 시스템은 다음을 인식합니다.장비부착한 다음 로드된 드라이버 모듈과 어떻게든 일치시킵니다. 일치하는 항목을 인식하면 해당 드라이버의 프로브 기능을 호출하여 실제로 드라이버 설정을 시작합니다.
작동하지 않는 카메라를 디버깅하려고 합니다. i2c 하위 시스템이 카메라가 존재한다는 사실을 발견하고 해당 카메라에 대한 디렉터리를 구축한 것을 볼 수 /sys/bus/i2c/i2c-7
있으며 .probe_new()
드라이버의 기능은 다음과 같습니다.아니요내가 여기에 많은 디버그 메시지를 추가했기 때문에 호출되었습니다. 그래서 장치를 드라이버에 연결하는 단계가 누락된 것 같은데 어떻게 작동하는지 알 수 없습니다.
i2c 하위 시스템이 장치->드라이버 일치를 수행하는 방법을 설명할 수 있는 사람이 있습니까?
편집하다:
명확하게 하기 위해 드라이버가 이름을 "ov2680"으로 선언한다는 것을 알고 있습니다.
static const struct i2c_device_id ov2680[] = {
{"ov2680", 0},
{},
};
MODULE_DEVICE_TABLE(i2c, ov2680_id);
내가 모르는 것은 i2c 하위 시스템이 어떻게 시작되는지입니다.장비드라이버에 선언된 장치 ID와 일치시켜 볼까요?
답변1
I²C는 장치 열거를 지원하지 않으므로 커널은 다음을 제공합니다.I²C 장치를 초기화하는 네 가지 방법:
- 장치 트리에 나열합니다(워프 i.MX7 보드), ACPI 테이블 또는 보드 파일 사용
ov2680
(후자를 무시하고 이전 버전과의 호환성을 위해서만 제공됨) - 하드웨어가 존재를 "인식"할 때 이를 명시적으로 인스턴스화합니다. 이는 내부 I²C 버스를 사용하여 다양한 구성 요소를 연결하는 TV 어댑터에서 일반적입니다.
- 버스 초기화 중에 프로브를 조사하십시오.
- 사용자 공간에서 설정하십시오.
후자를 사용하면 버스의 주소를 알고 있는 경우 장치를 강제로 검색할 수 있습니다.
echo ov2680 0x50 > /sys/bus/i2c/devices/i2c-7/new_device
이 방법이 작동하는지 확인한 후에는 장치 트리 또는 버스 기반 검색을 사용하여 장치 자동 초기화 정보를 추가해야 하는 위치를 찾을 수 있습니다. 커널 문서(위의 첫 번째 링크 참조)를 참조하면 올바른 방향으로 갈 수 있습니다.
귀하가 언급한 의견에 따르면 OVTI2680
여기서 문제는 두 개의 OmniVision OV2680 드라이버가 있다는 것입니다.drivers/media/i2c/ov2680.c
그리고drivers/staging/media/atomisp/i2c/atomisp-ov2680.c
. 전자는 장치 트리를 사용하여 발견되고, 후자는 ACPI를 사용하여 발견되며, 디렉토리 OVTI2680
에 파일이 있다는 i2c
것은 후자가 로드되고 있음을 나타냅니다.