海思3516DV300使用mipi_tx驱动st7701s屏幕显示
Posted 耳 东
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海思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;
#endif
stVoConfig.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-0xfff
stUserInfo.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
;
以上是关于海思3516DV300使用mipi_tx驱动st7701s屏幕显示的主要内容,如果未能解决你的问题,请参考以下文章
海思3516DV300使用mipi_tx驱动st7701s屏幕显示
海思3516DV300使用mipi_tx驱动st7701s屏幕显示
海思芯片(hi3516dv300)uboot镜像生成过程详解