硬件方框图

在T7的内部是通过CSIC模块来接收BT1120数据的,T7的CSIC模块方框图(我这里只有H5的规格书,借用H5的CSIC,T7的和H5的应该差不多)如下:
上图就是CSIC模块的方框图。CSIC是由输入Parser(格式解析),ISP(图像处理),VIPP(图像后处理)和DMA(内存写入)组成。该控制器有4个输入Parser,2个ISP,8个VIPP以及8个DMA。ISP2和ISP3内部没有实际的算法模块,仅用于顶层数据传输。上图中一些简称及本文相关术语解释如下:
- ISP: Image Signal Processor(图像信号处理器),实现sensor raw
data数据的处理,包括lens补偿、去坏点、gain、gamma、2D/3D de-mosaic等 - VIPP: Video Input Post Processor(视频输入后处理器),能对图片进行缩小和打水印处理。VIPP支持bayer
raw data经过ISP处理后再缩小,也支持对一般的YUV格式的sensor图像直接缩小。 - MIPI: Mobile Industry Processor Interface(移动行业处理器接口)
- CCI: camera control interface(摄像头控制接口)
- CSI:即Format Parser(格式解析),用于接收和解析并口(DC/BT565/BT1120)和串口(mipi/sub_lvds/hi_spi)的数据
在我们的T7项目中,需要用到的CSIC内部功能模块的路径是:
可以总结出软件相关的模块有NVP6134(Sensor模块)、CSI模块、ISP模块、VIPP模块,各自对应软件代码里面的一个文件夹:
linux内核的menuconfig配置
T7 linux关于摄像头视频输入的控制编写为sunxi-vin驱动(下文简写为VIN驱动,vin是video input的缩写)。 VIN 驱动使用了 I2C 和 media controller 框架,其 Menuconfig 的配置如下:
1. Device Drivers -> <*>I2C support
2. Device Drivers -> <*>Multimedia support -> [*] Cameras/video grabbers support
3. Device Drivers -> <*>Multimedia support -> [*] Media Controller support
4. Device Drivers -> <*>Multimedia support -> [*] V4L2 sub-device userspace API
5. Device Drivers -> <*>Multimedia support -> [*] V4L platform devices -> <M> sunxi video input(camera csi/mipi isp vipp)driver
6. Device Drivers -> <*>Multimedia support -> [*] V4L platform devices -> <M> v4l2 new driver forSUNXI
7. Device Drivers -> <*>Multimedia support -> [*] V4L platform devices -> <M> use internal cci(可以不要)
模块配置
Vin 驱动对 sys_config.fex 中 vin 模块的配置做了调整,将 vin 的各个子模块拆开成不通的节点来配置。这里不贴代码,相关的配置说明可以参考《sys_config.fex使用配置说明.pdf》。补充说明:
- vind节点是vin media节点的缩写,代表一套vin模块。一个vin最多包含4个parser(代码里面是支持8个的,why?)、2个ISP(+2空ISP做通路选择使用)、8个VIPP、8个DMA。因我们项目的T7只需要一个vin设备(对应代码的vin驱动),所以配置里面定义了唯一的vind0的信息。
- 因为我们这里不需要MIPICSI摄像头,所以csi_cci0~csi_cci3(占用csi0和csi1)被disable;cci节点用于配置CSIC CCI模块的寄存器和pin/clk/irq资源;
- 有两个用于并口输入的sensor接口——csi2和csi3,根据硬件电路,使用到csi2,所以csi3可以disable;
- flash和actuator没有用到可以disable;
- sensor模块只使用了nvp6134,所以保留sensor0,去掉sensor1; vinc0~vinc8配置对应T7 CSIC模块里面的DMA,可根据需要使用它们;但是vinc是vin core的缩写,软件上还对应vic_core驱动,实现了video device并创建对应video节点。在sys_config.fex中给出了每个vinc所使用的mipi/csi/isp/sensor/vipp等模块的ID,当vinc节点被应用程序打开时,这些被配置的模块会被启动。每个vinc至少包含sensor/csi两个模块才能正常工作。
- 在DST中,isp模块的配置包含在sensor和vinc里面,没有独立出来;
- scaler节点用于配置VIPP模块的寄存器资源
源码结构介绍
驱动路径位于 linux-3.10\drivers\media\platform\sunxi-vin
sunxi-vin:.
│ vin.c ;media 设备驱动
│ vin.h
│ top_reg.c
│ top_reg.h
│ Kconfig
│ Makefile
│
├─modules
│ ├─actuator
│ │ actuator.c ; vcm driver 的一般行为
│ │ actuator.h ; vcm driver 的头文件
│ │ ad5820_act.c
│ │ dw9714_act.c
│ │ Makefile
│ │ ov8825_act.c
│ │
│ ├─flash
│ │ flash.c ; flash driver 的源文件
│ │ flash.h
│ │
│ ├─sensor
│ │ camera.h ; camera 公用结构体头文件
│ │ camera_cfg.h ;camera ioctl 扩展命令头文件
│ │ gc2155.c
│ │ gc5004.c
│ │ Makefile
│ │ sensor_helper.h ; sensor 帮助函数头文件
│ │ sensor_spi.c ;spi sensor 驱动模板
│ │ nvp6134
│
├─platform
│ platform_cfg.h ;平台配置头文件
│ sun8iw10p1_vfe_cfg.h ;具体的平台配置头文件
│ sun8iw11p1_vfe_cfg.h
│ sun8iw17p1_vin_cfg.h
│ ……
│
├─utility
│ cfg_op.c ;读取 ini 文件的实现函数
│ cfg_op.h ;读取 ini 文件函数对应的头文件
│ sensor_info.c ;sensor 信息文件
│ sensor_info.h ;sensor 信息头文件
│ vfe_io.h ;vfe 模块寄存器操作头文件
│
├─vin-cci
│ bsp_cci.c ;底层 cci bsp 函数
│ bsp_cci.h ;底层 cci bsp 函数头文件
│ cci_helper.c ;cci 帮助函数,供 sensor 驱动调用
│ cci_helper.h ;cci 帮助函数头文件
│ csi_cci_reg.c ; cci 硬件底层实现
│ csi_cci_reg.h ; cci 硬件底层实现头文件
│ csi_cci_reg_i.h ;cci 寄存器资源头文件
│ sunxi_cci.c ;cci 平台驱动源文件
│ sunxi_cci.h ;cci 平台驱动头文件
│
├─vin-csi
│ bsp_csi.c ;底层 csi bsp 函数
│ bsp_csi.h ;底层 csi bsp 函数头文件
│ csi_reg.c ; csi 硬件底层实现
│ csi_reg.h ; csi 硬件底层实现头文件
│ csi_reg_i.h ;csi 寄存器资源头文件
│ sunxi_csi.c ;csi 子模块驱动源文件
│ sunxi_csi.h ;csi 子模块驱动头文件
│
├─vin-isp
│ bsp_isp.c ;底层 isp bsp 函数源文件
│ bsp_isp.h ;底层 isp bsp 函数头文件
│ bsp_isp_algo.h ;底层 isp 算法 bsp 函数头文件
│ bsp_isp_comm.h ;底层 isp 共用函数头文件
│ bsp_isp_null.c ;没有 isp 模块时的接口
│ isp_module_cfg.h ;isp 里面各模块功能配置的头文件
│ isp_platrorm_drv.c ;isp 平台注册
│ isp_platrorm_drv.h ;isp 平台注册
│ sunxi_isp.c ;isp 子模块驱动源文件
│ sunxi_isp.h ;isp 子模块驱动头文件
│
├─vin-mipi
│ bsp_mipi_csi.c ;底层 mipi bsp 函数
│ bsp_mipi_csi.h ;底层 mipi bsp 函数头文件
│ ├─dphy
│ │ dphy.h ;mipi dphy 头文件
│ │ dphy_reg.c ;mipi dphy 底层实现函数
│ │ dphy_reg.h ;mipi dphy 底层实现函数头文件
│ │ dphy_reg_i.h ;mipi dphy 寄存器资源头文件
│ │
│ └─protocol
│ protocol.h ;mipi 协议层头文件
│ protocol_reg.c ;mipi 协议层底层实现
│ protocol_reg.h ;mipi 协议层底层实现头文件
│ protocol_reg_i.h ;mipi 协议层寄存器资源头文件
│ sunxi_mipi.c ;mipi 子模块驱动源文件
│ sunxi_mipi.h ;mipi 子模块驱动头文件
├─vin-scaler
│ sunxi_scaler.c
│ sunxi_scaler.h
│
├─vin-stat
│ vin_h3a.c ;直方图和 3a 统计 buf 驱动
│ vin_h3a.h
│ vin_ispstat.c ;统计 buf 管理框架
│ vin_ispstat.h
│
├─vin-video
│ vin_core.c ;video 资源获取,中断处理
│ vin_core.h
│ vin_helper.c
│ vin_helper.h
│ vin_video.c ;video 节点操作集和 videobuf 回调
│ vin_video.h
└─