跳到主要内容

V2D

介绍 SpacemiT 平台 V2D 模块的功能和使用方法。

模块介绍

SpacemiT 平台 V2D 驱动提供 2D 图形的硬件加速。

功能介绍

v2d

驱动模型 V2D 驱动使用字符设备驱动模型,用户空间通过 /dev/v2d_dev 设备文件与用户空间进行交互。支持的标准接口包括:

  • open(): 设备打开时调用的函数。
  • read(): 从设备读取数据的函数。
  • write(): 向设备写入数据的函数。
  • ioctl(): 处理控制命令的函数。
  • release(): 设备关闭时调用的函数。

基本功能 V2D 驱动支持以下 2D 图像处理操作:

  • 区域填充
  • 缩放
  • 旋转
  • 裁剪
  • 图像格式转换

源码结构介绍

SpacemiT 平台 V2D 驱动源码结构,内核目录如下:

drivers/soc/spacemit$ tree v2d
v2d
|-- csc_matrix.h
|-- Kconfig
|-- Makefile
|-- v2d_drv.c // v2d 驱动
|-- v2d_drv.h
|-- v2d_hw.c
|-- v2d_iommu.c // v2d iommu 驱动
|-- v2d_priv.h
|-- v2d_reg.h

关键特性

特性

特性特性说明
颜色填充支持图像颜色填充功能。
旋转支持图像 0°,90°,180°,270° 旋转,及镜像功能。
裁剪支持图像裁剪功能。
缩放支持图像 1/8 ~ 8 倍的缩放功能功能。
格式转换支持 YUV,RGB 颜色空间转换功能。

性能参数

功能性能规格
颜色填充1920x1080@200 FPS
格式转换1920x1080@200 FPS

配置介绍

主要包括 V2D 驱动使能配置DTS 配置

CONFIG 配置

CONFIG_SPACEMIT_V2D:SpacemiT 平台 V2D 驱动配置选项,默认情况,此选项为 Y

 Device Drivers  --->
SOC (System On Chip) specific Drivers --->
<*> Spacemit V2D Engine Driver

DTS 配置

clock配置

V2D 使用两个主时钟源:v2d-iov2d-core,其中 v2d-io 支持 204.8/307.2/409.6 MHz 四个不同挡位,默认使用 409.6 MHz。可通过写入 /sys/bus/platform/devices/c0100000.v2d/clkrate 实现动态调整。

配置平台 V2D 相关 clock 和 reset 示例如下。

// linux-6.6\arch\riscv\boot\dts\spacemit\k1-x.dtsi
v2d@c0100000 {
compatible = "spacemit,v2d";
reg = <0x0 0xc0100000 0x0 0x1000>;
reg-names = "v2dreg";
clocks = <&ccu CLK_DPU_MCLK>, // v2d clock 配置
<&ccu CLK_V2D>;
clock-names = "v2d-io", "v2d-core";
resets = <&reset RESET_V2D>; // v2d reset 配置
reset-names= "v2d_reset";
interrupt-parent = <&intc>;
interrupts = <86>;
interconnects = <&dram_range3>;
interconnect-names = "dma-mem";
status = "ok";
};

接口描述

API 介绍

应用端通过 API 调用实现 V2D 功能。主要实现 2D 图形的 FillBitblitBlend 三个功能。

  • V2D_BeginJob
int32_t V2D_BeginJob(V2D_HANDLE *phHandle);
功能说明创建一个 V2D 工作队列。
参数定义phHandle:句柄指针
返回值0:成功; -1: 失败
  • V2D_EndJob
int32_t V2D_EndJob(V2D_HANDLE hHandle);
功能说明提交工作队列到 V2D 驱动,并启动工作。
参数定义hHandle:句柄
返回值0:成功; -1: 失败
  • V2D_AddFillTask
int32_t V2D_AddFillTask(V2D_HANDLE hHandle, 
V2D_SURFACE_S *pstDst,
V2D_AREA_S *pstDstRect,
V2D_FILLCOLOR_S *pstFillColor);

功能说明提交任务到 V2D 工作队列,向目标位图的操作区填充颜色。
参数定义hHandle:句柄;pstDst:目标位图;pstDstRect:目标位图操作区;pstFillColor:颜色填充结构体
返回值0:成功; -1: 失败
  • V2D_AddBitblitTask
int32_t V2D_AddBitblitTask(V2D_HANDLE hHandle, 
V2D_SURFACE_S *pstDst,
V2D_AREA_S *pstDstRect,
V2D_SURFACE_S *pstSrc,
V2D_AREA_S *pstSrcRect, V2D_CSC_MODE_E enCSCMode);

功能说明提交任务到 V2D 工作队列,源位图的操作区域搬运到目标位图的操作区域。
参数定义hHandle:句柄;pstDst:目标位图;pstDstRect:目标位图操作区;pstSrc: 源位图;pstSrcRect:源位图操作区;enCSCMode:是否需要进行色域转换标志
返回值0:成功; -1: 失败
  • 2D_AddBlendTask
int32_t V2D_AddBlendTask(V2D_HANDLE hHandle, 
V2D_SURFACE_S *pstBackGround,
V2D_AREA_S *pstBackGroundRect,
V2D_SURFACE_S *pstForeGround,
V2D_AREA_S *pstForeGroundRect,
V2D_SURFACE_S *pstMask,
V2D_AREA_S *pstMaskRect,
V2D_SURFACE_S *pstDst,
V2D_AREA_S *pstDstRect,
V2D_BLEND_CONF_S *pstBlendConf,
V2D_ROTATE_ANGLE_E enForeRotateAngle,
V2D_ROTATE_ANGLE_E enBackRotateAngle,
V2D_CSC_MODE_E enForeCSCMode,
V2D_CSC_MODE_E enBackCSCMode,
V2D_PALETTE_S *pstPalette,
V2D_DITHER_E dither);

功能说明提交任务到V2D工作队列,源位图到目标位图完成裁剪,旋转,格式转换,缩放等功能。
参数定义hHandle:句柄;pstBackGround:背景位图;pstBackGroundRect:背景位图操作区;pstForeGround: 前景位图;pstForeGroundRect:前景位图操作区;pstMask:Mask位图;pstMaskRect:Mask位图操作区;pstDst: 目标位图;pstDstRect:目标位图操作区;pstBlendConf:blend配置结构体;enForeRotateAngle:前景操作旋转角度;enBackRotateAngle:背景操作旋转角度;enForeCSCMode:前景CSC转换模式;enBackCSCMode:背景CSC转换模式;pstPalette:L8格式调色板数据结构指针;dither:选择dither模式
返回值0:成功; -1: 失败

Debug 介绍

查看v2d io clock频率

# cat /sys/bus/platform/devices/c0100000.v2d/clkrate
409600000

测试介绍

  • Fill 测试用例
# cd /usr/share/v2d
# v2d_test --fill
v2d fill test case successful!
  • Bitblit 测试用例
# cd /usr/share/v2d
# v2d_test --blit
v2d blit test case successful!
  • Blend 测试用例
# cd /usr/share/v2d
# v2d_test --blend
v2d blend test case successful!

FAQ