Вопрос или проблема
Я немного запутался в поведении Jetson TX2 при загрузке драйверов для камеры.
Вот определение IMX274 в дереве устройств:
i2c@3180000 {
reg = <0x0 0x3180000 0x0 0x100>;
dmas = <0x19 0x17 0x19 0x17>;
interrupts = <0x0 0x1b 0x4>;
compatible = "nvidia,tegra186-i2c";
clock-names = "div-clk", "parent", "slow-clk";
reset-names = "i2c";
clock-frequency = <0x61a80>;
scl-gpio = <0x12 0x72 0x0>;
sda-gpio = <0x12 0x73 0x0>;
clocks = <0xd 0x4b 0xd 0x10d 0xd 0x5c>;
resets = <0xd 0x15>;
status = "okay";
#address-cells = <0x1>;
phandle = <0x7c>;
#stream-id-cells = <0x1>;
#size-cells = <0x0>;
dma-names = "rx", "tx";
linux,phandle = <0x7c>;
imx274_a@1a {
reg = <0x1a>;
mclk = "extperiph1";
devnode = "video0";
avdd-reg = "vana";
compatible = "nvidia,imx274";
clock-names = "extperiph1", "pllp_grtba";
reset-gpios = <0x12 0x8d 0x0>;
physical_h = "2.738";
physical_w = "3.674";
clocks = <0xd 0x59 0xd 0x10d>;
vana-supply = <0x1a>;
sensor_model = "imx274";
iovdd-reg = "vif";
delayed_gain = "true";
vif-supply = <0x1a>;
dvdd-reg = "vdig";
vdig-supply = <0x1a>;
mode0 {
...
}
ports {
#address-cells = <0x1>;
#size-cells = <0x0>;
port@0 {
reg = <0x0>;
endpoint {
bus-width = <0x4>;
remote-endpoint = <0x1d>;
phandle = <0x94>;
csi-port = <0x0>;
linux,phandle = <0x94>;
};
};
};
};
i2c2 является псевдонимом для i2c@3180000, поэтому я ожидаю увидеть устройство на шине 2. Я уверен, что могу увидеть его на шине с адресом 0x57
.
nvidia@tegra-ubuntu:~/kernel/kernel$ sudo i2cdetect -r -y 2
[sudo] пароль для nvidia:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- --
20: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Первый вопрос: Как ядро определяет тип устройства i2c на шине? Я думал, что используется поле reg
, но 0x1a в дереве устройств явно отличается от 0x57 на шине.
Во-вторых, как я вижу, модуль совместим со следующими драйверами: compatible = "nvidia,imx274";
Однако драйвер устройства другой:
nvidia@tegra-ubuntu:~/kernel/kernel$ sudo v4l2-ctl -D -d /dev/video0
Информация о драйвере (не используем libv4l2):
Название драйвера: tegra-video
Тип карты: vi-output, imx274 2-001a
Информация о шине: platform:15700000.vi:0
Версия драйвера: 4.4.38
Возможности: 0x84200001
Видео захват
Стриминг
Расширенный формат пикселей
Возможности устройства
Возможности устройства: 0x04200001
Видео захват
Стриминг
Расширенный формат пикселей
Поэтому, кажется, что по каким-то причинам загружается неправильный драйвер, так ли это или я просто что-то упускаю? Тем не менее, все еще возможно захватить изображение с помощью argus.
некоторые случайные ответы:
reg = <0x1a> в dts файле – это адрес, а не тип периферийного устройства на шине i2c. Поскольку этот адрес зарегистрирован драйвером, он не будет обнаружен i2c-detect, поэтому ‘UU’ на адресе 1a в выводе i2c-detect. ’57’ в вашем выводе – это другое периферийное устройство.
в мире nvidia TX2 v4l2, /dev/video0 относится к драйверу VI, который подключен к CSI, к которому подключен ваш сенсор. ‘imx274 2-001a’ в выводе ‘v4l2-ctl -D’ говорит вам, что этот VI подключен к imx274, находящемуся на второй (произвольный порядок в ядре linux) шине i2c, по адресу 0x1a.
Ответ или решение
Понимание работы дерева устройств Jetson TX2, узлов I2C и загрузки драйвера камеры
Jetson TX2 представляет собой мощную платформу для разработки, особенно в области компьютерного зрения и обработки изображений. Правильная настройка устройства и его драйверов, таких как драйвер для камеры IMX274, может быть неочевидной задачей. Давайте подробно рассмотрим основные аспекты, связанные с вашим вопросом: как Linux-кernel идентифицирует устройства I2C и почему может быть загружен драйвер, отличный от ожидаемого.
Идентификация устройств I2C в Linux
Kernel использует несколько механизмов для идентификации типов устройств, подключённых по шине I2C. Первичный метод идентификации базируется на информации, представленной в дереве устройств (Device Tree). В вашем случае строка
reg = <0x1a>;
означает, что устройство IMX274 использует адрес 0x1a
на I2C-шине. Однако при выполнении команды i2cdetect
вы видите адрес 0x57
. Это происходит из-за того, что адрес 0x1a
является адресом, зарегистрированным драйвером устройства, который не будет обнаружен при использовании i2cdetect
.
Когда вы вызываете i2cdetect
, он сканирует адреса, запрашивая, отвечает ли устройство на каждом адресе. Если драйвер устройства инициализирован, он не будет отвечать на команды обнаружения, что и приводит к отображению UU
вместо адреса. Это означает, что драйвер уже захватил соответствующий I2C-адрес и обработчик не доступен для опроса i2cdetect
. В вашем случае, адрес 0x57
на шине I2C может принадлежать другому устройству.
Загрузка драйвера камеры
Вы также упоминаете, что драйвер для IMX274 определяется как:
compatible = "nvidia,imx274";
Однако при проверке загруженного драйвера командой v4l2-ctl
выясняется, что используется драйвер tegra-video
. На первый взгляд это может показаться несоответствием; тем не менее, важно понимать, что драйвер tegra-video
является частью системы обработки видео и поддержки захвата изображения, которое работает в параллель с драйверами для конкретных устройств, таких как IMX274.
Фраза Card type: vi-output, imx274 2-001a
в выводе команды v4l2-ctl
указывает на то, что драйвер tegra-video
обрабатывает видеопоток с IMX274, установленным на двумерной как части архитектуры видеозахвата NVIDIA.
Таким образом, хотя может казаться, что используется «неправильный» драйвер, на самом деле это ожидаемое поведение архитектуры NVIDIA для работы с камерами и их драйверами в рамках обработки видео.
Заключение
В summarizing, kernel Linux идентифицирует устройства I2C, основываясь на информации из дерева устройств, и адреса, указанные в структуре reg
не всегда совпадают с фактическими адресами устройств на шине, особенно если драйвер уже зарегистрировал хендлер. Драйвер, достаточно абстрагированный от конкретной камеры, как в случае с tegra-video
, может корректно управлять камерами IMX274 и обеспечивать необходимые функции. Надеюсь, эта информация помогла прояснить поведение системы и ответить на ваши вопросы относительно работы драйверов в Jetson TX2.