Дерево устройств Jetson TX2, узлы i2c и загрузка драйвера камеры

Вопрос или проблема

Я немного запутался в поведении 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.

Оцените материал
Добавить комментарий

Капча загружается...