- 收藏
- 点赞
- 分享
- 举报
Hi3516dv300支持BT1120(已经解决)
感谢社区内小伙伴的帖子和回答,不然不知道什么时候能将BT1120调通。故记录下来方便其他小伙伴查阅。
目的:将fpga输出的YUV数据通过BT1120输入Hi3516dv300
数据流如下:
BT1120 —yuv422—> VI — yuv420—> VENC —h264—> network
BT1120 标准时序下,数据就是yuv422格式,16Bit总线位宽,Y通道8bit灰度,C通道8bit色度。
VI1必须连接Y通道, VI0必须连接C通道,如果保存下的YUV图像出现色度数据与灰度数据对调的情况可以尝试将Y,C通道换一下。
1、主要设置以下几个结构体:
- combo_dev_attr_t
注意:根据文档,对于3516dv300, 只有videv1,MIPI1才支持BT1120输入,且要将输入模式设置为CMOScombo_dev_attr_t MIPI_BT1120_ATTR =
{
/* input mode */
.devno = 1,
.input_mode = INPUT_MODE_CMOS, //使MIPI RX PHY处于CMOS模式
.data_rate = MIPI_DATA_RATE_X1,
.img_rect = {0, 0, 1280, 720},
{
.mipi_attr = {DATA_TYPE_YUV422_8BIT, HI_MIPI_WDR_MODE_NONE, {-1, -1, -1, -1}}
}
};
VI_DEV_ATTR_S
/* BT1120 1080p */
VI_DEV_ATTR_S DEV_ATTR_BT1120_720P_BASE =
{
/* interface mode */
VI_MODE_BT1120_STANDARD,
/* multiplex mode */
VI_WORK_MODE_1Multiplex,
/* r_mask g_mask b_mask*/
{0xFF000000, 0xFF0000},
/* progessive or interleaving */
VI_SCAN_PROGRESSIVE, /*逐行*/
/*AdChnId*/
{-1, -1, -1, -1},
/*enDataSeq, only support yuv*/
VI_DATA_SEQ_UVUV,
/* synchronization information */
{
/*port_vsync port_vsync_neg port_hsync port_hsync_neg */
VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_NORM_PULSE,VI_VSYNC_VALID_NEG_HIGH,
/*hsync_hfb hsync_act hsync_hhb*/
{
0, 0, 0,
/*vsync0_vhb vsync0_act vsync0_hhb*/
0, 0, 0,
/*vsync1_vhb vsync1_act vsync1_hhb*/
0, 0, 0
}
},
/* input data type */
VI_DATA_TYPE_YUV,
/* bReverse */
HI_FALSE,
/* input size */
{1280, 720},
{{
{1280, 720},
},
{VI_REPHASE_MODE_NONE, VI_REPHASE_MODE_NONE}},
{WDR_MODE_NONE, 720},
DATA_RATE_X1
};
- VI_PIPE_ATTR_S
VI_PIPE_ATTR_S PIPE_ATTR_BT1120_720P_BIT16_420 = {
/* bBindDev bYuvSkip */
VI_PIPE_BYPASS_NONE,
HI_FALSE, /*YUV skip enable */
HI_TRUE, /* ISP Bypass */
1280,
720,
PIXEL_FORMAT_YVU_SEMIPLANAR_422,
COMPRESS_MODE_NONE,
DATA_BITWIDTH_8, /* bit_width width: 16 illegal, should be when YUV!*/
HI_FALSE,
{PIXEL_FORMAT_YVU_SEMIPLANAR_420, DATA_BITWIDTH_8, VI_NR_REF_FROM_RFR,
COMPRESS_MODE_NONE},
HI_FALSE,
{-1, -1}};
不需要ISP,故设置ISP Bypass为true。
VI_CHN_ATTR_S
VI_CHN_ATTR_S CHN_ATTR_BT1120_720P_420_SDR8_LINEAR = {
{1280, 720},
PIXEL_FORMAT_YVU_SEMIPLANAR_420,
DYNAMIC_RANGE_SDR8,
VIDEO_FORMAT_LINEAR,
COMPRESS_MODE_NONE,
0,
0,
0,
{-1, -1}};
2、接口调用关系如下
SAMPLE_COMM_VI_StartVi()
SAMPLE_COMM_VI_StartMIPI_BT1120() //combo_dev_attr_t
SAMPLE_COMM_VI_SetParam()
SAMPLE_COMM_VI_CreateVi()
SAMPLE_COMM_VI_CreateSingleVi()
SAMPLE_COMM_VI_StartDev() //VI_DEV_ATTR_S
SAMPLE_COMM_VI_BindPipeDev()
SAMPLE_COMM_VI_StartViPipe() //VI_PIPE_ATTR_S
SAMPLE_COMM_VI_StartViChn() //VI_CHN_ATTR_S
//SAMPLE_COMM_VI_CreateIsp() /*close isp*/
SAMPLE_COMM_VI_StartMIPI_BT1120()实现如下:
HI_S32 SAMPLE_COMM_VI_StartMIPI_BT1120(SAMPLE_VI_CONFIG_S* pstViConfig) {
HI_S32 fd;
combo_dev_attr_t *pstcomboDevAttr = NULL;
fd = open("/dev/hi_mipi", O_RDWR);
if (fd < 0)
{
printf("warning: open hi_mipi dev failed\n");
return -1;
}
pstcomboDevAttr = &MIPI_BT1120_ATTR;
if (NULL == pstcomboDevAttr)
{
printf("Func %s() Line[%d], unsupported BT1120\n", __FUNCTION__, __LINE__);
close(fd);
return HI_FAILURE;
}
if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr))
{
printf("set mipi attr failed\n");
close(fd);
return HI_FAILURE;
}
close(fd);
return HI_SUCCESS;
}
3、设置相关寄存器
当使用非MIPI RX功能时,需要先配置PHY_MODE_LINK和PHY_EN_LINK寄存器分别为0x30100和0x0(寄存器详情请参见芯片手册9.3.6小节),使MIPI RX PHY处于CMOS模式。
在SDK中相关接口调用后,海思会自动设置相关寄存器,故无需手动去设置
4、修改驱动启动脚本
路径:/komod/load3516dv300
根据脚本的说明来启动#!/bin/sh
# Useage: ./load3516dv300 [ -r|-i|-a ] [ sensor0~1 ]
# -r : rmmod all modules
# -i : insmod all modules
# -a : rmmod all moules and then insmod them
# e.g: RAW: ./load3516dv300 -i -sensor0 imx335 -sensor1 imx335
# e.g: BT1120/DC : ./load3516dv300 -i -sensor0 imx327 -sensor1 imx327 -osmem 128 -yuv0 1
# e.g: BT656 : ./load3516dv300 -i -sensor0 imx327 -sensor1 imx327 -osmem 128 -yuv0 2
./load3516dv300 -i -sensor0 imx327 -sensor1 imx327 -osmem 128 -yuv0 1
需要注意以下几点:- 确定输入的yuv顺序
DEV_ATTR_BT1120_1080P_BASE 中的enDataSeq要和输入源的一致。设置为:VI_DATA_SEQ_UVUV
后,HI_MPI_VI_SetDevAttr报错,查看/dev/logmpp
详细报错如下:
提示viDev 1不支持yuv的顺序YUYV,我们将其改为UVUV,就通过了。<3>[ vi] [func]:vi_drv_check_data_seq [line]:8672 [info]:invalid input yuv seq 4 of vi dev 1
<3>[ vb] [Func]:vb_set_supplement_conf [Line]:1955 [Info]:VB is initialized!
- 设置正确且支持的viPipe
查看文档《HiMPP 媒体处理软件开发参考》下关于VI_PIPE_ATTR_S的说明<3>[ vi] [func]:vi_drv_check_pipe_pix_fmt [line]:1635 [info]:vi_pipe(0) do not support SP420/SP422/YUV400!
<3>[ vi] [func]:vi_drv_check_pipe_pix_fmt [line]:1594 [info]:picture pix format should be YUV or BAYER which is 22!
3516dv300只有pipe2支持输出YUV格式的数据
在设置VIConfig结构体时,将vipipe设置为2。
stViConfig.astViInfo[i].stSnsInfo.MipiDev = 1; //MipiDev-1 for BT.1120
...
stViConfig.astViInfo[i].stDevInfo.ViDev = 1; //viDev-1 for BT.1120
stViConfig.astViInfo[i].stPipeInfo.aPipe[0] = 2; //pipe2 for yuv
stViConfig.astViInfo[i].stPipeInfo.aPipe[1] = -1;
stViConfig.astViInfo[i].stPipeInfo.aPipe[2] = -1;
stViConfig.astViInfo[i].stPipeInfo.aPipe[3] = -1;
遇到bug的时候,记得查看/dev/logmpp,输出信息会将错误原因写的很清楚。一定要多看文档,很多时候,是因为没注意到文档中的某些细节才卡住。
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
-
2018-10-19 15:20:12
-
2022-01-14 14:26:53
-
2022-11-06 23:33:52
-
2019-08-02 10:16:28
-
2023-08-18 09:48:27
-
22015-06-11 11:15:14
-
2022-02-16 15:04:36
-
2022-02-16 16:31:26
-
2020-06-24 17:35:06
-
2020-09-18 09:20:31
-
2017-08-16 09:21:23
-
2019-12-20 12:00:55
-
2021-01-28 18:43:55
-
2021-11-20 11:48:05
-
2016-03-28 22:06:13
-
2015-08-17 18:06:31
-
2017-07-24 14:07:39
-
2018-06-04 18:05:16
-
2015-01-22 14:01:28
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明