VIN简介
VIN(Video Input Node)是基于Linux内核v4l2框架实现的SoC的camera驱动框架。VIN框架的主要功能包括注册/注销、参数读取、与v4l2上层接口、与各device的下层接口、中断处理、buffer申请切换等。
VIN框架的模块包括sensor、actuator和flash等。sensor模块是各个sensor的器件层实现,包括上下电、初始化、各分辨率切换等。
此外,VIN框架还包括对csi接口和mipi接口的控制文件vin-csi和vin-mipi,isp的库操作文件vin-isp,以及video设备操作文件vin-video。
VIN框架还使用了一些自定义的驱动结构体,如vin_md(Video input_media device)和v4l2_device。v4l2_device是整个输入设备的总结构体,充当驱动的管理者以及入口监护人,用于视频输入设备整体的管理。media_device是多媒体设备,用于运行时数据流的管理,嵌入在V4L2 device内部。
地平线J5的 VIN软件架构是一个专门为自动驾驶和AI应用设计的软件框架,旨在提供高效、可靠和灵活的视频输入和处理功能。该框架基于地平线J5芯片的强大计算能力和高度集成的硬件特性,结合了先进的软件设计和优化技术,以支持自动驾驶系统在复杂道路环境中的实时感知和决策。
J5的Sensor接入属于图像处理子系统中的VIN部分,各模块间有结构如下

其中VIN部分主要包括: CAM,MIPI,CIM/CIMDMA,系统结构有如下:

CAM模块是VIN框架中负责摄像头传感器控制和管理的关键组件,它确保了摄像头传感器能够正常工作,并提供高质量的图像数据给VIN框架进行后续处理。
CIM(Camera Interface Module)模块是VIN框架中与摄像头传感器进行通信和交互的关键组件。它通过管理接口、数据传输、时序控制、电源和时钟管理以及错误处理等功能,确保摄像头传感器能够正常工作,并将高质量的图像数据传输给VIN框架进行后续处理。CIMDMA利用直接内存访问(DMA)技术,允许数据在内存和摄像头传感器之间直接传输,而无需CPU的介入,大大提高了数据传输效率和实时性。
典型的vio(Video In/Out (VIN+VPM))使用流程如下:vpm(Video Process Manager )

用户层封装为libvin,其代码仓库位于: hbre/camera
驱动层则由各子模块驱动实现,代码位于kernel: drivers/media/platform/hobot。
libvin内有多个so库,用于灵活适配接入多种Sensor接入场景:
libcam.so – 主体驱动库,封装了mipi,cim/cimdma,lpwm,gpio,i2c等公共模块与架构逻辑。
libvio对libvin与libvpm进行了封装再供用户调用,本文档只涉及libvin本身。
hb_vin_init():初始化cam,包括cmos、mipi、cim/cimdma;
hb_vin_start():启动cam,包括cmos、mipi、cim/cimdma;
配置文件
VIN配置文件说明
Cim/Cimdma配置文件说明
Mipi配置文件说明
MIPI数据格式
YUV | 0x18 | YUV420 8-bit |
|---|---|---|
0x19 | YUV420 10-bit | |
0x1A | Legacy YUV420 8-bit | |
0x1B | Reserved | |
0x1C | YUV420 8-bit (Chroma Shifted Pixel Sampling) | |
0x1D | YUV420 10-bit (Chroma Shifted Pixel Sampling) | |
0x1E | YUV422 8-bit | |
0x1F | YUV422 10-bit | |
RGB | 0x20 | RGB444 |
0x21 | RGB555 | |
0x22 | RGB565 | |
0x23 | RGB666 | |
0x24 | RGB888 | |
0x25~0x27 | Reserved | |
RAW | 0x28 | RAW6 |
0x29 | RAW7 | |
0x2A | RAW8 | |
0x2B | RAW10 | |
0x2C | RAW12 | |
0x2D | RAW14 | |
0x2E~0x2F | Reserved |

