Rockchip-isp1
概述
以下文档提供了rockchip-isp1驱动程序和rockchip SoC上图像信号处理模块的基本信息,并附有示例和详细信息。
硬件
更多详细信息可在TRM章节“Image Signal Processing”、“MIPI D-PHY”中找到,但它们仅在NDA下可用。
ISP 详细
ISP 包括:
- MIPI serial camera interface
- Image Signal Processing
- Many Image Enhancement Blocks
- Crop
- Resize
方框图
完整的方框图无法从datasheet粘贴到此处,下图为抽象版本:
MIPI 详细
rockchip SoC中有三个D-PHY实例,其连接如下图所示:
软件
驱动
rockchip-isp1是rockchip SoC上基于V4L2的图像信号处理模块驱动程序。与早期的驱动程序rk-isp10相比,它使用媒体控制器框架,这与普通的v4L2不同。虽然普通v4L2将设备视为将输入数据连接到主机存储器的基于DMA的普通图像拖放器,但媒体控制器考虑到一个典型视频设备可能由多个子设备组成。
媒体控制器基础知识
请仔细阅读下面的链接,如果你以前没有使用过它。
https://linuxtv.org/downloads/v4l-dvb-apis/uapi/mediactl/media-controller-intro.html
方框图
File 视图
V4l2 视图
Name
| Type
| Description
|
rkisp1_mainpath
| v4l2_vdev, capture
| 格式:YUV, RAW Bayer;最大分辨率:4416*3312;支持:Crop |
rkisp1_selfpath
| v4l2_vdev, capture
| 格式: YUV, RGB;最大分辨率:920*1080;支持:Crop |
rkisp1-isp-subdev
| v4l2_subdev
| 内部isp模块;支持:source/sink pad crop。 sink pad的格式应等于sensor输入格式,大小应等于/小于sensor输入大小。 如果输出格式为raw bayer,则source pad的格式应等于vdev输出格式,否则应为YUYV2X8。大小应等于/小于sink pad。 |
rockchip-sy-mipi-dphy
| v4l2_subdev
| MIPI-DPHY 配置 |
rkisp1-statistics
| v4l2_vdev, capture
| 提供图像颜色统计信息
|
rkisp1-input-params
| v4l2_vdev, output
| 接收AWB、BLC的参数。。。。。。图像增强块 |
Sensor 驱动要求
sensor驱动应执行下表中的控制。
Controls
| Description
| R/W
| Needed by
|
V4L2_CID_VBLANK
| 垂直消隐。每帧之后的空闲时间,在此期间不产生图像数据。垂直消隐的单位是直线。每一行都有图像宽度的长度加上在同一子设备中由V4L2_CID_PIXEL_RATE 速率控制定义的像素速率下的水平消隐。 | R
| Ae
|
V4L2_CID_HBLANK
| 水平消隐。每行图像数据之后的空闲时间,在此期间不产生图像数据。水平消隐的单位是像素。
| R
| Ae
|
V4L2_CID_EXPOSURE
| 确定相机sensor的曝光时间。曝光时间受帧间隔的限制。驱动会将这些值解释为100µs单位,其中值1代表1/10000秒,10000代表1秒,100000代表10秒。
| R/W
| Ae
|
V4L2_CID_ANALOGUE_GAIN
| 模拟增益是影响像素矩阵中所有颜色分量的增益。增益操作在A/D转换之前在模拟域中执行。
| R/W
| Ae
|
V4L2_CID_DIGITAL_GAIN
| 数字增益是所有颜色分量乘以的值。通常,应用的数字增益是控制值除以例如0x100,这意味着为了不获得数字增益,控制值需要为0x100。无增益配置通常也是默认配置。
| R/W
| Ae
|
V4L2_CID_PIXEL_RATE
| 子设备源板中的像素速率。此控制为只读,其单位为像素/秒。
| R
| Ae
|
V4L2_CID_LINK_FREQ
| 数据总线频率。数据总线频率与媒体总线像素代码、总线类型(每个采样的时钟周期)一起定义像素阵列中的像素速率(V4L2_CID_PIXEL_RATE )(如果设备不是图像sensor,则可能在其他地方)。帧速率可以通过像素时钟、图像宽度和高度以及水平和垂直消隐来计算。虽然像素速率控制可以在包含像素阵列的子设备之外的其他地方定义,但无法从该信息获得帧速率。这是因为只有在像素阵列上,才能假定垂直和水平消隐信息是准确的:像素阵列中不允许其他消隐。帧速率的选择通过选择所需的水平和垂直消隐来执行。这种控制的单位是赫兹。 | R
| mipi-dphy
|
设备树绑定
https://github.com/torvalds/linux/tree/master/Documentation/devicetree/bindings/media/rockchip-isp1.txt
https://github.com/torvalds/linux/tree/master/Documentation/devicetree/bindings/media/rockchip-mipi-dphy.txt
Linux
用户应用
v4l-utils工具和应用程序:
v4l-utils工具是由Linux维护的V4L2开发工具包。它提供了一套用于配置V4L2子设备属性的V4L2和媒体框架相关工具,测试V4L2设备,并提供开发库,如libv4l2等等。
本章主要介绍v4l utils中的两个命令行工具:media-ctl和v4l2-ctl
media-ctl,用于查看和配置拓扑
v4l2-ctl,用于配置v4l2控件、捕获帧、设置cif、isp和sensor
参数:
v4l-utils的不同版本的格式代码将不同,尤其是mbus-fmt部分,本文档中使用的版本是集成在Linux SDK中的v4l-utils-1.14.1。
Android
https://source.android.com/devices/camera/camera3
二次开发
该驱动程序目前可以在ASUS Tinker Board和Firefly-RK3288-Reload+Rockchip Debian/Yocto SDK上运行。
源码
内核
- 4.15 + FORMLIST Patches
- Rockchip 4.4 BSP
Sensor驱动
- IMX219
- OV5647
- TC35874X
设备树
- Tinker Board
- Firefly-rk3288-Reload
测试命令
cat /sys/class/video4linux/video*/name
# get self_path videox and main_path videox+1
gst-launch-1.0 rkcamsrc device=/dev/videox+1 io-mode=4 ! videoconvert ! video/x-raw,format=NV12,width=640,height=480 ! kmssink
其他
拓扑
Media device information
------------------------
driver rkisp1
model rkisp1
serial
bus info
hw revision 0x0
driver version 0.0.0
Device topology
- entity 1: rkisp1-isp-subdev (4 pads, 5 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev0
pad0: Sink
[fmt:SBGGR10_1X10/800x600 field:none
crop.bounds:(0,0)/800x600
crop:(0,0)/800x600]
<- "rockchip-sy-mipi-dphy":1 [ENABLED]
pad1: Sink
<- "rkisp1-input-params":0 [ENABLED]
pad2: Source
[fmt:SBGGR10_1X10/800x600 field:none
crop.bounds:(0,0)/800x600
crop:(0,0)/800x600]
-> "rkisp1_selfpath":0 [ENABLED]
-> "rkisp1_mainpath":0 [ENABLED]
pad3: Source
-> "rkisp1-statistics":0 [ENABLED]
- entity 2: rkisp1_selfpath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video0
pad0: Sink
<- "rkisp1-isp-subdev":2 [ENABLED]
- entity 3: rkisp1_mainpath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video1
pad0: Sink
<- "rkisp1-isp-subdev":2 [ENABLED]
- entity 4: rkisp1-statistics (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video2
pad0: Sink
<- "rkisp1-isp-subdev":3 [ENABLED]
- entity 5: rkisp1-input-params (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video3
pad0: Source
-> "rkisp1-isp-subdev":1 [ENABLED]
- entity 6: rockchip-sy-mipi-dphy (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: Sink
[fmt:SRGGB10_1X10/3280x2464 field:none]
<- "imx219 2-0010":0 [ENABLED]
pad1: Source
[fmt:SRGGB10_1X10/3280x2464 field:none]
-> "rkisp1-isp-subdev":0 [ENABLED]
- entity 7: imx219 2-0010 (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev2
pad0: Source
[fmt:SRGGB10_1X10/3280x2464 field:none]
-> "rockchip-sy-mipi-dphy":0 [ENABLED]