海思3516DV300使用mipi_tx驱动st7701s屏幕显示
向海思mpp框架中添加外设是首先要选取一个合适的demo来验证,在还是mpp框架中每一个模块都有着丰富的demo例程,由于笔者只有一块海思3516DV300的主板和一个st7701s 480 * 800分辨率的屏幕,因此选取了sample中的vdec作为测试例程,vdec例程中实现了将H264、H265、JPEG进行解码并将解码数据显示到VO设备上。
1.修改 SAMPLE_H264_VDEC_VPSS_VO demo
添加新的屏幕只需要测试初始化显示效果时可只对VO的部分进行修改,VPSS部分可保留例程原有设置,在此选用vdec的样例2进行修改,对VO配置部分进行修改设置屏幕的接口类型,分辨率
/************************************************step5: start VO*************************************************/RECT_S stDefDispRect = {0, 0, 480, 800};SIZE_S stDefImageSize = {480, 800};stVoConfig.VoDev = SAMPLE_VO_DEV_UHD;stVoConfig.enVoIntfType = VO_INTF_MIPI; // 屏幕使用mipi接口stVoConfig.enIntfSync = VO_OUTPUT_USER; // 方便配置添加屏幕的分辨率及初始化stVoConfig.enPicSize = enDispPicSize;stVoConfig.u32BgColor = COLOR_RGB_BLUE;stVoConfig.u32DisBufLen = 3;stVoConfig.enDstDynamicRange = DYNAMIC_RANGE_SDR8;stVoConfig.enVoMode = VO_MODE_1MUX;stVoConfig.enPixFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;#if 0 stVoConfig.stDispRect.s32X = 0;stVoConfig.stDispRect.s32Y = 0;stVoConfig.stDispRect.u32Width = stDispSize.u32Width;stVoConfig.stDispRect.u32Height = stDispSize.u32Height;stVoConfig.stImageSize.u32Width = stDispSize.u32Width;stVoConfig.stImageSize.u32Height = stDispSize.u32Height;#else // 使用用户设置的屏幕分辨率stVoConfig.stDispRect = stDefDispRect;stVoConfig.stImageSize = stDefImageSize;#endifstVoConfig.enVoPartMode = VO_PART_MODE_SINGLE;printf("screen w = %d h = %d\n", stVoConfig.stDispRect.u32Width, stVoConfig.stDispRect.u32Height);s32Ret = SAMPLE_COMM_VO_StartVO(&stVoConfig);if(s32Ret != HI_SUCCESS){SAMPLE_PRT("start VO fail for %#x!\n", s32Ret);goto END5;}
2.修改 SAMPLE_H264_VDEC_VPSS_VO ==》SAMPLE_COMM_VO_StartVO
修改屏幕分辨率接口类型,及默认参数的填充

3.修改 SAMPLE_H264_VDEC_VPSS_VO ==》SAMPLE_COMM_VO_StartVO ==》 SAMPLE_COMM_VO_StartDev
同步信息参数可通过文档手册中 ReleaseDoc\zh\02.only for reference\software\RGB_MIPI屏幕时钟时序计算器.xlsx --> MIPI屏配置VDP时钟时序,将屏幕参数填入输入值中获取输出参数,具体参数说明可参考 ReleaseDoc\zh\02.only for reference\software\屏幕对接 使用指南 文本
HI_S32 SAMPLE_COMM_VO_StartDev(VO_DEV VoDev, VO_PUB_ATTR_S* pstPubAttr)
{HI_S32 s32Ret = HI_SUCCESS;HI_U32 u32Framerate = 60;VO_USER_INTFSYNC_INFO_S stUserInfo = {0};/* Fill pub attr */pstPubAttr->enIntfType = VO_INTF_MIPI;pstPubAttr->enIntfSync = VO_OUTPUT_USER;pstPubAttr->stSyncInfo.bSynm = 0; pstPubAttr->stSyncInfo.bIop = 1; pstPubAttr->stSyncInfo.u8Intfb = 0; pstPubAttr->stSyncInfo.u16Vact = 800; // 垂直有效区域,单位行pstPubAttr->stSyncInfo.u16Vbb = 20; // 垂直消隐后肩,单位行pstPubAttr->stSyncInfo.u16Vfb = 18; // 垂直消隐前肩,单位行pstPubAttr->stSyncInfo.u16Hact = 480; // 水平有效区域,单位像素pstPubAttr->stSyncInfo.u16Hbb = 66; // 水平消隐后肩,单位像素pstPubAttr->stSyncInfo.u16Hfb = 60; // 水平消隐前肩,单位像素pstPubAttr->stSyncInfo.u16Hmid = 1; // 底场垂直同步有效像素pstPubAttr->stSyncInfo.u16Bvact = 1; // 底场垂直有效区域,逐行时有效,单位行pstPubAttr->stSyncInfo.u16Bvbb = 1; // 底场垂直消隐后肩,逐行时有效,单位行pstPubAttr->stSyncInfo.u16Bvfb = 1; // 底场垂直消隐前肩,逐行时有效,单位行pstPubAttr->stSyncInfo.u16Hpw = 60; // 水平同步信号宽度,单位像素pstPubAttr->stSyncInfo.u16Vpw = 10; // 垂直同步信号宽度,单位行pstPubAttr->stSyncInfo.bIdv = 0; // 数据有效信号极性,0为高有效,1为低有效pstPubAttr->stSyncInfo.bIhs = 0; // 水平有效信号极性,0为高有效,1为低有效pstPubAttr->stSyncInfo.bIvs = 0; // 垂直有效信号极性,0为高有效,1为低有效 s32Ret = HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr);if (s32Ret != HI_SUCCESS){SAMPLE_PRT("failed with %#x!\n", s32Ret);return HI_FAILURE;}/* Fill user sync info */stUserInfo.stUserIntfSyncAttr.enClkSource = VO_CLK_SOURCE_PLL;stUserInfo.stUserIntfSyncAttr.stUserSyncPll.u32Fbdiv = 60; //PLL整数倍频系数 0-0xfffstUserInfo.stUserIntfSyncAttr.stUserSyncPll.u32Frac= 0x535A85;stUserInfo.stUserIntfSyncAttr.stUserSyncPll.u32Refdiv = 4;stUserInfo.stUserIntfSyncAttr.stUserSyncPll.u32Postdiv1 = 3;stUserInfo.stUserIntfSyncAttr.stUserSyncPll.u32Postdiv2 = 2;stUserInfo.u32DevDiv = 2;stUserInfo.u32PreDiv = 1;/* Set user interface sync info */s32Ret = HI_MPI_VO_SetUserIntfSyncInfo(VoDev, &stUserInfo);if (s32Ret != HI_SUCCESS){printf("Set user interface sync info failed with %x.\n",s32Ret);return HI_FAILURE;}s32Ret = HI_MPI_VO_SetDevFrameRate(VoDev, u32Framerate);s32Ret = HI_MPI_VO_Enable(VoDev);if (s32Ret != HI_SUCCESS){SAMPLE_PRT("failed with %#x!\n", s32Ret);return HI_FAILURE;}return s32Ret;}
4.修改 SAMPLE_H264_VDEC_VPSS_VO ==》SAMPLE_COMM_VO_StartVO ==》 SAMPLE_COMM_VO_GetWH
在 VO_OUTPUT_USER 部分返回屏幕对应的分辨率和帧率

5.修改 SAMPLE_H264_VDEC_VPSS_VO ==》SAMPLE_COMM_VO_StartVO ==》 SAMPLE_COMM_VO_StartMipiTx
添加对应的屏幕屏幕配置
switch(enVoIntfSync){case VO_OUTPUT_576P50:pstMipiTxConfig = &MIPI_TX_720X576_50_CONFIG;break;case VO_OUTPUT_720P60:pstMipiTxConfig = &MIPI_TX_1280X720_60_CONFIG;break;case VO_OUTPUT_1080P60:pstMipiTxConfig = &MIPI_TX_1920X1080_60_CONFIG;break;case VO_OUTPUT_1024x768_60:pstMipiTxConfig = &MIPI_TX_1024X768_60_CONFIG;break;case VO_OUTPUT_1280x1024_60:pstMipiTxConfig = &MIPI_TX_1280x1024_60_CONFIG;break;case VO_OUTPUT_720x1280_60:pstMipiTxConfig = &MIPI_TX_720X1280_60_CONFIG;break;case VO_OUTPUT_1080x1920_60:pstMipiTxConfig = &MIPI_TX_1080X1920_60_CONFIG;break;case VO_OUTPUT_USER:pstMipiTxConfig = &MIPI_TX_480X800_60_CONFIG; // 用户添加屏幕的配置参数break;default :pstMipiTxConfig = &MIPI_TX_1080X1920_60_CONFIG;break;}
MIPI_TX_480X800_60_CONFIG 配置信息可仿照上面的进行修改
combo_dev_cfg_t MIPI_TX_480X800_60_CONFIG =
{.devno = 0,.lane_id = {0, 1, -1, -1}, // 选择屏幕使用的lan数,未使用填-1,如使用4lan时 {0, 1, 2, 3}.output_mode = OUTPUT_MODE_DSI_VIDEO, // 使用mipi下的dsi.output_format = OUT_FORMAT_RGB_24_BIT,.video_mode = BURST_MODE,.sync_info = {.vid_pkt_size = 480, // hact 水平有效长度 单位像素.vid_hsa_pixels = 31, // hsa 行同步脉冲区像素.vid_hbp_pixels = 12, // hbp 行同步脉冲后消隐区像素个数.vid_hline_pixels = 620, // hact + hsa + hbp + hfp 每行像素总数.vid_vsa_lines = 10, // vsa 帧同步脉冲区行数.vid_vbp_lines = 10, // vbp 帧同步脉冲后消隐区行数.vid_vfp_lines = 2, // vfp 帧同步脉冲前消隐区行数.vid_active_lines = 800, // vact 垂直有效长度 单位像素 822.edpi_cmd_size = 0,},.phy_data_rate = 367, // >= (hact + hsa + hbp + hfp) * (vact + vsa + vbp + vfp) * output format bit * framerate /lane_num/(10^6) Mbps.pixel_clk = 30578, // = (hact + hsa + hbp + hfp) * (vact + vsa + vbp + vfp) * framerate / 1000 KHz
};
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
