海思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启动过程分析

海思芯片(hi3516dv300)uboot镜像生成过程详解

hisi3516dv300芯片基于hwmon驱动框架的温度获取驱动源码分析

海思Hi3516DV300---部署yolov5检测+Sort跟踪算法