维克多-朱果

维克多-朱果

0个粉丝

1

问答

0

专栏

0

资料

维克多-朱果  发布于  2022-03-28 17:26:25
采纳率 0%
1个问答
7429

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
    1. combo_dev_attr_t MIPI_BT1120_ATTR =
    2. {
    3. /* input mode */
    4. .devno = 1,
    5. .input_mode = INPUT_MODE_CMOS, //使MIPI RX PHY处于CMOS模式
    6. .data_rate = MIPI_DATA_RATE_X1,
    7. .img_rect = {0, 0, 1280, 720},
    8. {
    9. .mipi_attr = {DATA_TYPE_YUV422_8BIT, HI_MIPI_WDR_MODE_NONE, {-1, -1, -1, -1}}
    10. }
    11. };
    注意:根据文档,对于3516dv300, 只有videv1,MIPI1才支持BT1120输入,且要将输入模式设置为CMOS

  • VI_DEV_ATTR_S

    1. /* BT1120 1080p */
    2. VI_DEV_ATTR_S DEV_ATTR_BT1120_720P_BASE =
    3. {
    4. /* interface mode */
    5. VI_MODE_BT1120_STANDARD,
    6. /* multiplex mode */
    7. VI_WORK_MODE_1Multiplex,
    8. /* r_mask g_mask b_mask*/
    9. {0xFF000000, 0xFF0000},
    10. /* progessive or interleaving */
    11. VI_SCAN_PROGRESSIVE, /*逐行*/
    12. /*AdChnId*/
    13. {-1, -1, -1, -1},
    14. /*enDataSeq, only support yuv*/
    15. VI_DATA_SEQ_UVUV,
    16. /* synchronization information */
    17. {
    18. /*port_vsync port_vsync_neg port_hsync port_hsync_neg */
    19. VI_VSYNC_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_NORM_PULSE,VI_VSYNC_VALID_NEG_HIGH,
    20. /*hsync_hfb hsync_act hsync_hhb*/
    21. {
    22. 0, 0, 0,
    23. /*vsync0_vhb vsync0_act vsync0_hhb*/
    24. 0, 0, 0,
    25. /*vsync1_vhb vsync1_act vsync1_hhb*/
    26. 0, 0, 0
    27. }
    28. },
    29. /* input data type */
    30. VI_DATA_TYPE_YUV,
    31. /* bReverse */
    32. HI_FALSE,
    33. /* input size */
    34. {1280, 720},
    35. {{
    36. {1280, 720},
    37. },
    38. {VI_REPHASE_MODE_NONE, VI_REPHASE_MODE_NONE}},
    39. {WDR_MODE_NONE, 720},
    40. DATA_RATE_X1
    41. };
    • VI_PIPE_ATTR_S
  1. VI_PIPE_ATTR_S PIPE_ATTR_BT1120_720P_BIT16_420 = {
  2. /* bBindDev bYuvSkip */
  3. VI_PIPE_BYPASS_NONE,
  4. HI_FALSE, /*YUV skip enable */
  5. HI_TRUE, /* ISP Bypass */
  6. 1280,
  7. 720,
  8. PIXEL_FORMAT_YVU_SEMIPLANAR_422,
  9. COMPRESS_MODE_NONE,
  10. DATA_BITWIDTH_8, /* bit_width width: 16 illegal, should be when YUV!*/
  11. HI_FALSE,
  12. {PIXEL_FORMAT_YVU_SEMIPLANAR_420, DATA_BITWIDTH_8, VI_NR_REF_FROM_RFR,
  13. COMPRESS_MODE_NONE},
  14. HI_FALSE,
  15. {-1, -1}};

不需要ISP,故设置ISP Bypass为true。

  • VI_CHN_ATTR_S

    1. VI_CHN_ATTR_S CHN_ATTR_BT1120_720P_420_SDR8_LINEAR = {
    2. {1280, 720},
    3. PIXEL_FORMAT_YVU_SEMIPLANAR_420,
    4. DYNAMIC_RANGE_SDR8,
    5. VIDEO_FORMAT_LINEAR,
    6. COMPRESS_MODE_NONE,
    7. 0,
    8. 0,
    9. 0,
    10. {-1, -1}};

    2、接口调用关系如下

    1. SAMPLE_COMM_VI_StartVi()
    2. SAMPLE_COMM_VI_StartMIPI_BT1120() //combo_dev_attr_t
    3. SAMPLE_COMM_VI_SetParam()
    4. SAMPLE_COMM_VI_CreateVi()
    5. SAMPLE_COMM_VI_CreateSingleVi()
    6. SAMPLE_COMM_VI_StartDev() //VI_DEV_ATTR_S
    7. SAMPLE_COMM_VI_BindPipeDev()
    8. SAMPLE_COMM_VI_StartViPipe() //VI_PIPE_ATTR_S
    9. SAMPLE_COMM_VI_StartViChn() //VI_CHN_ATTR_S
    10. //SAMPLE_COMM_VI_CreateIsp() /*close isp*/

    SAMPLE_COMM_VI_StartMIPI_BT1120()实现如下:

    1. HI_S32 SAMPLE_COMM_VI_StartMIPI_BT1120(SAMPLE_VI_CONFIG_S* pstViConfig) {
    2. HI_S32 fd;
    3. combo_dev_attr_t *pstcomboDevAttr = NULL;
    4. fd = open("/dev/hi_mipi", O_RDWR);
    5. if (fd < 0)
    6. {
    7. printf("warning: open hi_mipi dev failed\n");
    8. return -1;
    9. }
    10. pstcomboDevAttr = &MIPI_BT1120_ATTR;
    11. if (NULL == pstcomboDevAttr)
    12. {
    13. printf("Func %s() Line[%d], unsupported BT1120\n", __FUNCTION__, __LINE__);
    14. close(fd);
    15. return HI_FAILURE;
    16. }
    17. if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr))
    18. {
    19. printf("set mipi attr failed\n");
    20. close(fd);
    21. return HI_FAILURE;
    22. }
    23. close(fd);
    24. return HI_SUCCESS;
    25. }

    3、设置相关寄存器
    当使用非MIPI RX功能时,需要先配置PHY_MODE_LINK和PHY_EN_LINK寄存器分别为0x30100和0x0(寄存器详情请参见芯片手册9.3.6小节),使MIPI RX PHY处于CMOS模式。
    在SDK中相关接口调用后,海思会自动设置相关寄存器,故无需手动去设置
    4、修改驱动启动脚本
    路径:/komod/load3516dv300
    根据脚本的说明来启动

    1. #!/bin/sh
    2. # Useage: ./load3516dv300 [ -r|-i|-a ] [ sensor0~1 ]
    3. # -r : rmmod all modules
    4. # -i : insmod all modules
    5. # -a : rmmod all moules and then insmod them
    6. # e.g: RAW: ./load3516dv300 -i -sensor0 imx335 -sensor1 imx335
    7. # e.g: BT1120/DC : ./load3516dv300 -i -sensor0 imx327 -sensor1 imx327 -osmem 128 -yuv0 1
    8. # 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详细报错如下:
    1. <3>[ vi] [func]:vi_drv_check_data_seq [line]:8672 [info]:invalid input yuv seq 4 of vi dev 1
    2. <3>[ vb] [Func]:vb_set_supplement_conf [Line]:1955 [Info]:VB is initialized!
    提示viDev 1不支持yuv的顺序YUYV,我们将其改为UVUV,就通过了。
  • 设置正确且支持的viPipe
    1. <3>[ vi] [func]:vi_drv_check_pipe_pix_fmt [line]:1635 [info]:vi_pipe(0) do not support SP420/SP422/YUV400!
    2. <3>[ vi] [func]:vi_drv_check_pipe_pix_fmt [line]:1594 [info]:picture pix format should be YUV or BAYER which is 22!
    查看文档《HiMPP 媒体处理软件开发参考》下关于VI_PIPE_ATTR_S的说明
    3516dv300只有pipe2支持输出YUV格式的数据

在设置VIConfig结构体时,将vipipe设置为2。

  1. stViConfig.astViInfo[i].stSnsInfo.MipiDev = 1; //MipiDev-1 for BT.1120
  2. ...
  3. stViConfig.astViInfo[i].stDevInfo.ViDev = 1; //viDev-1 for BT.1120
  4. stViConfig.astViInfo[i].stPipeInfo.aPipe[0] = 2; //pipe2 for yuv
  5. stViConfig.astViInfo[i].stPipeInfo.aPipe[1] = -1;
  6. stViConfig.astViInfo[i].stPipeInfo.aPipe[2] = -1;
  7. stViConfig.astViInfo[i].stPipeInfo.aPipe[3] = -1;

遇到bug的时候,记得查看/dev/logmpp,输出信息会将错误原因写的很清楚。一定要多看文档,很多时候,是因为没注意到文档中的某些细节才卡住。

我来回答
回答6个
时间排序
认可量排序

sterben

0个粉丝

3

问答

0

专栏

0

资料

sterben 2022-05-28 16:54:40
认可0

楼主请问你的硬件接线是怎么实现的,可以请教一下吗?每个引脚都是如何接的 有无原理图可以参考一下

横贯八方

5个粉丝

34

问答

0

专栏

3

资料

横贯八方 2022-07-22 15:22:21
认可0

感谢分享

在学了在学了!

3个粉丝

36

问答

104

专栏

162

资料

在学了在学了! 2022-07-25 10:58:32
认可0

感谢分享

张大哥

2个粉丝

4

问答

4

专栏

5

资料

张大哥 2022-07-25 15:44:49
认可0

感谢分享

那一抹淡笑

0个粉丝

0

问答

0

专栏

4

资料

那一抹淡笑 2022-07-25 17:04:21
认可0

感谢分享

wedon

0个粉丝

0

问答

0

专栏

0

资料

wedon 2022-07-26 09:08:51
认可0

感谢分享

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区