Камери 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_timing | pixel_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}