介绍spacemit平台V2D模块的功能和使用方法。
模块介绍
spacemit平台 V2D 驱动提供 2D 图形的硬件加速。
功能介绍
驱动模型 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相关clock配置,包括v2d-io 和 v2d-core clock配置,reset配置。v2d-io clock可配置为204800000 HZ,307200000 HZ,409600000 HZ,409600000 HZ四个不同挡位。默认使用409600000 HZ,可通过写节点/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";
};
接口描述
测试介绍
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!
API介绍
应用端通过API调用实现V2D功能。主要实现2D图形的Fill,Bitblit,Blend三个功能。
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:失败 |
V2D_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