Перейти до основного вмісту

Камери MIPI CSI-2

Провайдер camera.mipi повідомляє про сенсори зображення за ISP Modalix. Він виконує повторне сканування за uevent media і video4linux. Виявлення відкриває вузли пристроїв лише для читання й надсилає тільки ioctl-запити; воно ніколи не встановлює формат чи зв’язок і ніколи не запускає потік.

Кожен /dev/mediaN драйвера simaai-v4l2-vid читається за допомогою MEDIA_IOC_G_TOPOLOGY, і кожна сутність MEDIA_ENT_F_CAM_SENSOR у його графі є однією камерою. Медіапристрої інших драйверів (наприклад, uvcvideo) ігноруються.

Ідентифікація​

id — це camera:<sensor entity name>, наприклад camera:imx477 5-001a: драйвер сенсора, шина I2C та адреса. libcamera використовує те саме ім’я, тож це також ім’я, яке приймає CameraInput. Два сенсори з однаковим ім’ям, наприклад на двох медіапристроях, мали б спільний id, тому натомість сканування завершується помилкою, у якій названо обидва медіапристрої.

Поля​

ПолеНаявністьЗначення
type, idзавждиcamera та ідентифікатор, описаний вище
backendзавждиmipi
modelякщо ім’я його міститьПерше слово імені сутності, наприклад imx477
availabilityзавжди{"state": "unknown", "reason": ...}: медіаконтролер не має стану володіння, доступного лише для читання
camera_nameзавждиІм’я сутності сенсора для передавання в CameraInput
media_deviceзавжди/dev/mediaN (лише для маршрутизації; не для ідентифікації)
bus_infoякщо повідомляєтьсяШина медіапристрою з MEDIA_IOC_DEVICE_INFO, наприклад platform:csi2video@1
ispзавжди{"state": "available", "device_path", "device_paths", "sizing"} або {"state": "unavailable", "reason"} разом із modes: []
modes_errorякщо isp доступний, але режими неможливо перелічитиЧому modes дорівнює []: розміри сенсора не вдалося перелічити або їх забагато
csi_receiverякщо є зв’язокСутність, з якою зв’язаний вихідний пад (source pad) сенсора, наприклад csidev-40c3000.csi
sensor_timingякщо вдається прочитатиpixel_rate (пікселів/с), hblank_min, vblank_min, width, height, прочитані з /dev/v4l-subdevN сенсора
max_fpsза наявності sensor_timingpixel_rate / ((width + hblank_min) * (height + vblank_min)), з точністю до двох знаків після коми

sensor_timing береться з інтерфейсу субпристрою сенсора (названого через /sys/dev/char/<major>:<minor>): активний формат зв’язаного вихідного пада (VIDIOC_SUBDEV_G_FMT), поточне значення V4L2_CID_PIXEL_RATE та мінімуми V4L2_CID_HBLANK і V4L2_CID_VBLANK. Поле пропускається, якщо будь-якого з них бракує.

Вихідні вузли ISP — це записи video4linux з іменем isp_v4l2-vid-cap-out і card arm-isp-out. Якщо їх кілька, повідомляються лише режими, спільні для всіх.

sizing вказує, звідки беруться вихідні розміри ISP; це визначає те, що перелічує ISP, а не версія платформи. ISP, що задає розміри під час роботи за сенсором, для якого його налаштовано (Platform 3.0), до того перелічує 0x0: якщо будь-який вузол ISP перелічує розмір 0x0, sizing дорівнює runtime. Інакше (Platform 2.1.x) розміри — це вбудована в драйвер таблиця: sizing дорівнює fixed.

Режими​

Режими — це вихідні формати та дискретні розміри ISP, тобто те, що може захоплювати CameraInput. Кожен режим має format (FourCC), width, height і isp_output: true. Режим містить frame_intervals у тій самій формі, що й для USB-камер, лише якщо ISP повідомляє інтервали для свого розміру. ISP DevKit їх не повідомляє, тому його режими не мають частоти кадрів; max_fps і sensor_timing описують обмеження сенсора.

Якщо sizing: "runtime", ISP перелічує лише розмір, для якого його зараз налаштовано (0x0 у стані спокою), тому ці розміри не використовуються. Режими тоді — це формати, які перелічують усі вузли ISP, у кожному дискретному розмірі кадру, який субпристрій сенсора повідомляє для всіх своїх кодів медіашини (VIDIOC_SUBDEV_ENUM_MBUS_CODE, VIDIOC_SUBDEV_ENUM_FRAME_SIZE). Кожен має format, width, height, sensor_mode: true і isp_input, а також frame_intervals, якщо сенсор повідомляє інтервали для цього розміру (VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL). Діапазони пропускаються. Якщо розміри сенсора не вдається перелічити, камера має modes: [], а modes_error пояснює чому; isp усе одно повідомляє про ISP. Sentinel публікує не більше 1 024 пар формат-розмір для однієї камери; про більший добуток повідомляється так само замість виділення пам’яті для необмеженого каталогу.

isp_input має значення true, якщо сенсор перелічує розмір під 12-бітним кодом медіашини Bayer (MEDIA_BUS_FMT_S{BGGR,GBRG,GRBG,RGGB}12_1X12), його ширина кратна 64, висота парна, а сам розмір не перевищує 4096x3072. Обробник libcamera від SiMa налаштовує сенсор у 12-бітному RAW, RAW DMA ISP потребує кроку рядка 32 байти (12-бітний рядок із кількістю пікселів, кратною 64), а ISP не має масштабувальника, тому виводить такий режим у його власному розмірі. libcamera звужує розмір, що не відповідає цим обмеженням (4056x3040 у IMX477 передається як 4032x3040 на Platform 3.0).

Кожен режим із фіксованим ISP також має available і, якщо воно false, reason: чи налаштовано плату для цього точного виходу. Так само відомо, що режим сенсора не NV12 недоступний. Режим NV12 із sensor_mode і isp_input: true доступний. Інший недоступний, якщо немає режиму isp_input, не меншого за нього, і не має рішення, якщо такий режим є: libcamera може обрізати цей більший режим до нього, а виявлення Sentinel лише для читання не може підтвердити це без налаштування камери чи запуску з неї потоку. Для IMX477 на Platform 3.0 це робить доступними 1280x990, 1920x1080, 2048x1080, 3840x2160, 3968x3040 і 4032x3040, обидва розміри шириною 4056 — недоступними, а 1332x990, 2028x1080 і 2028x1520 — без рішення. Повне правило описано в каталозі.

Помилки​

КодКоли
io.permission_deniedМедіапристрій неможливо відкрити (EACCES, EPERM) або неможливо отримати перелік вмісту /dev (EACCES)
io.openБудь-який інший збій відкриття медіапристрою або запиту до нього
peripherals.discovery_failedСутність сенсора без імені або два сенсори з однаковим ім’ям (їхні id збіглися б)

Пристрій, що зникає посеред сканування, пропускається. Збої ISP ніколи не спричиняють невдачу сканування; вони роблять isp недоступним із зазначенням причини. Сенсор, розміри якого неможливо перелічити, натомість має modes_error.

Приклад​

IMX477 на Modalix DevKit зі скороченим переліком режимів (загалом дев’ять: три формати, три розміри). Граф і розміри ISP переписано з DevKit; значення таймінгів сенсора наведено так, як їх повідомляє DevKit, але вони покриті лише тестами.

{"type": "camera", "id": "camera:imx477 5-001a", "model": "imx477",
"availability": {"state": "unknown", "reason": "The media controller does not expose a reliable read-only ownership state; discovery does not acquire, configure, or stream from the camera."},
"modes": [{"format": "AR24", "width": 1920, "height": 1080, "isp_output": true},
{"format": "AR24", "width": 2048, "height": 1080, "isp_output": true}],
"backend": "mipi", "camera_name": "imx477 5-001a", "media_device": "/dev/media0",
"bus_info": "platform:csi2video@1",
"isp": {"state": "available", "device_path": "/dev/video1", "device_paths": ["/dev/video1"],
"sizing": "fixed"},
"csi_receiver": "csidev-40c3000.csi",
"sensor_timing": {"pixel_rate": 840000000, "hblank_min": 9332, "vblank_min": 48,
"width": 1920, "height": 1080},
"max_fps": 66.18}