This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:j721s2

Guru**** 1812430 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1421218/tda4vm-j721s2

器件型号:TDA4VM

工具与软件:

您好!

TDA4。 j721s2。

我们将 CSITX 节点添加到 basic_demos/app_multi_cam。 将输入摄像头图像定向到 CSITX 输出并修改 Graph、如下所示。

"\tiovx\kernels_j7\hwa\csitx\vx_csitx_target.c"中的回调函数"csitxDrvCallback"称为 periordly。

但它可能会在运行一段时间后停止调用"csitxDrvCallback"。 该图挂起在 func "tivxCsitxProcesses"中的"tivxEventWait (PRMs->FRAME_available、TIVX_EVENT_TIMEOUT_WAIT_FOREVERWER);"上。

请帮助检查此问题。 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请参阅以下常见问题解答以了解您的用例  

    (+)[常见问题解答] TDA4VM:在 vision_apps 的捕获演示中启用 CSI-TX 输出、而不是 DSS 输出-处理器论坛-处理器- TI E2E 支持论坛

    此致、

    Nikhil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是否引用了 csitx 的配置?  

    + local_csitx_config.instCfg[0U].laneBandSpeed = TIVX_CSITX_LANE_BAND_SPEED_1400_TO_1600_Mbps;
    + local_csitx_config.instCfg[0U].laneSpeedMbps = TIVX_CSITX_LANE_SPEED_Mbps_RESERVED;
    + local_csitx_config.instCfg[0U].numDataLanes = 4U;

    laneBandSpeed/laneSpeedMbps 的含义是什么?

    我们应该设置什么 laneBandSpeed/laneSpeedMbps 的值? 如果我们设置了较低或较高的值、是否有任何影响?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据 MIPI 标准、CSI2每通道支持的速率高达2.5Gbps (4个通道支持的速率高达10Gbps)

    这意味着、您可以使用 CSITX 通过 MIPI 通道每秒发送高达10千兆位。

    那么、您可以知道您必须每秒通过通道发送多少位? 即特定数据格式、在特定 FPS 下的"w x h"分辨率帧。  
    根据此计算结果、您可以设置  laneBandSpeed 的该值

    此致、

    Nikhil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们创建2个 csitx 节点以发送2个图像流(格式均相同:1280 (w) x 960 (h) x 2 (UYVY) x 30 (fps)= 73728000字节= 589.824Mbps)。
    (请参阅"">e2e.ti.com/.../5231962

    我们将相同的配置设置为2个 csitx 节点。 laneSpeedMbps = 392、numDataLanes = 2。
    每个 csitx 节点每秒可发送高达784 (392x2) Mbps。 我们认为它应该有足够的通道带来发送30fps 的图像流数据。
    但我们在运行一个 ment 的应用程序之后发现了 csitx 节点块。 (它可能类似于"">e2e.ti.com/.../tda4vm-csitx-node-block-sometimes")

    您能给我们一些建议吗?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我可以知道你说的  csitx 节点块是什么意思吗?  

    csitx 是否输入图形参数、并且此节点的出队是卡滞的? 还是其他问题?

    您能否分享一些日志以供参考?

    此致、

    Nikhil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们在 vx_csitx_target.c 中添加了一些测试日志、如下所示:

    // log

    e2e.ti.com/.../test-log.log

    它可能会在 tivxEventWait 处阻止。 (日志"printf ("@@@ tivxEventWait .......... 结束\n";"将不再打印)

    我们尝试修改 laneSpeedMbps、发现这样会在增加 laneSpeedMbps 时降低阻止的概率。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    pdk_j721s2_08_04_00_20的简单情况如下所示。

    设置较低的  laneSpeedMbps (通道频带不够)。 然后、csitx 节点将 阻止(位于 tivxEventWait)。

    这是预期行为吗?

    可以复制吗? 或者它只是发生在我们的平台上?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我可以在下周初结束时查看这一点。  

    同时、您能告诉我您当前正在运行的应用程序吗?

    它基于 OpenVX 还是基于 PDK?

    如果是 OpenVX、它是否仅具有 csirx 和 csitx 节点?

    您能否分享申请以供审核?

    此致、

    Nikhil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们的应用 main_test_csitx.c 基于 build basic_demos\app_multi_cam。 (替换为 在 main_linux_arm.c 上运行 app_test_csitx_main)

    e2e.ti.com/.../app_5F00_multi_5F00_cam.zip

    我们只在 图上添加一个 CsitxNode。 (无其他节点)

     如果在 vxProcessGraph 之后随机执行一些睡眠、则该引脚将被阻止。

    请帮助检查它。

    附加一些我们使用的定义:

    \PSDK_0804\PSDK_base\PSDK_RTOS\pdk_j721s2_08_04_00_20\packages\ti\drv\csitx\v0\csitx_soc.c soc

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    从代码中、我看到2个 csitx 节点从捕获节点传输捕获的帧、如下所示  

    obj->csitx_node1 = tivxCsitxNode (obj->graph、csitx_config2、obj->captureObj.raw_image_arr[0]);

    obj->csitx_node2 = tivxCsitxNode (obj->graph、csitx_config2、obj->captureObj.raw_image_arr[0]);

    并且还有一个执行相同操作的显示节点(假设未使用 LDC 和马赛克)

    display_in_image =(vx_image) vxGetObjectArrayItem (obj->captureObj.raw_image_arr[0]、0);

    状态= APP_CREATE_GRAPH_DISPLAY (obj->graph、&obj->displayObj、display_in_image);

    这是您预期的流程吗?

     captureObj.raW_image_arr 中有多少传感器输入? 它只是一个吗?

    此致、

    Nikhil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们的应用程序为 MAIN_TEST_csitx.c、并运行 APP_TEST_csitx_main。 请检查 MAIN_TEST_csitx.c

    (我们没有运行 APP_MULTI_CAM_MAIN。)

    我们发现、当将 CSITX_DPHY_CLK_MODE_DEF 设置为(CSITX_CLK_MODE_NON_CONTINUE)时、如果给出不稳定的帧周期、csitx 节点将阻塞。

    当将 CSITX_DPHY_CLK_MODE_DEF 设置为(CSITX_CLK_MODE_CONTINUENT)时、它可能不会阻止。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我在最新的 SDK 上运行了下面的操作,我能够在没有任何块的情况下获得 vxProcessGraph

    /**
     *
     *
     */
    #include <TI/tivx.h>
    #include <TI/tivx_task.h>
    #include <TI/tivx_target_kernel.h>
    #include "tivx_kernels_host_utils.h"
    
    #include <TI/j7_tidl.h>
    #include <tivx_utils_file_rd_wr.h>
    #include <tivx_utils_graph_perf.h>
    #include <utils/iss/include/app_iss.h>
    #include <TI/tivx_img_proc.h>
    #include <TI/tivx_fileio.h>
    #include <TI/video_io_csitx.h>
    
    #include <TI/video_io_kernels.h>
    
    #include <stdio.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    #include <sys/stat.h>
    #include <float.h>
    #include <math.h>
    #include <utils/perf_stats/include/app_perf_stats.h>
    
    
    #define NUM_CHANNELS        (1U)
    #define CSITX_INST_ID       (0U)
    #define CSITX_LANE_BAND_SPEED       (TIVX_CSITX_LANE_BAND_SPEED_390_TO_450_MBPS)//(TIVX_CSITX_LANE_BAND_SPEED_770_TO_870_MBPS)
    #define CSIRX_LANE_BAND_SPEED       (TIVX_CAPTURE_LANE_BAND_SPEED_720_TO_800_MBPS)
    #define CSITX_LANE_SPEED_MBPS       (392U)//(100U)//(392U)//(600)
    
    #define TEST_IMG_W          (1280u)//(1920u)
    #define TEST_IMG_H          (960u)//(1280u)
    #define TEST_FILE_PATH      (256u)
    
    typedef struct
    {
    	vx_context context;
        vx_graph graph;
    
    	vx_object_array input_image_arr;
    	vx_node csitx_node;
    
    	
    	tivx_task task;
        vx_uint32 stop_task;
        vx_uint32 stop_task_done;
    } appTestCsiTxInfo_t;
    
    
    static appTestCsiTxInfo_t g_stTestCsiTxInfo = {0};
    
    void app_read_test_img(appTestCsiTxInfo_t *obj)
    {
    #if 1
    		{
    			vx_image tx_frame_array_item=0;
    			vx_map_id map_id;
    			vx_int32 i,j;
    			vx_imagepatch_addressing_t addr;
    			uint16_t *ptr = NULL;
    			uint16_t frmIdx;
    	
    			static vx_rectangle_t rect;
    	
    			rect.start_x = 0;
    			rect.start_y = 0;
    			rect.end_x = TEST_IMG_W;
    			rect.end_y = TEST_IMG_H;
    	
    			/* this is currently supported for RAW formats only */
    			/* initialization of frames for each channel with unique pattern
    			   it is (channel no. + x) */
    			printf("2 Initializing Transmit Buffers...\n");
    			for (frmIdx = 0U ; frmIdx < NUM_CHANNELS ; frmIdx++)
    			{
    				tx_frame_array_item = (vx_image)vxGetObjectArrayItem(obj->input_image_arr, 0);
    				/* Initialize raw_image with running pattern using WRITE ONLY MAP */
    	
    				vxMapImagePatch((vx_image)tx_frame_array_item,
    										   &rect,
    										   0,
    										   &map_id,
    										   &addr,
    										   (void **)&ptr,
    										   VX_WRITE_ONLY,
    										   VX_MEMORY_TYPE_HOST,
    										   VX_NOGAP_X);
    		
    				//ASSERT(ptr != NULL);
    				for (i = 0; i <TEST_IMG_H; i++)
    				{
    					for(j=0; j<TEST_IMG_W; j++)
    					{
    						ptr[((i*TEST_IMG_W)+j)] = (i + frmIdx);
    					}
    				}
    				/* Do cache operations on each buffer to avoid coherency issues */
    				appMemCacheWb(ptr, (TEST_IMG_W * TEST_IMG_H * sizeof(uint16_t)));
    				vxUnmapImagePatch(tx_frame_array_item, map_id);
    				vxReleaseImage(&tx_frame_array_item);
    			}
    			printf("Initializing Transmit Buffers Done.\n");
    		}
    #endif
    }
    
    static void app_run_graph_task(void *app_var)
    {
    	appTestCsiTxInfo_t *obj = (appTestCsiTxInfo_t *)app_var;
    
    	//read test image;
    	app_read_test_img(obj);
    
    	printf("Run csi-tx graph start !!!!!!!!!!!!!!!!!!!\n");
    	while (!obj->stop_task)
    	{
    		printf("Process Graph Start\n");
    		vxProcessGraph(obj->graph);
    		printf("Process Graph End\n");
    		//put_disp_v2([],);
    		//tivxTaskWaitMsecs(33);
    		//tivxTaskWaitMsecs(7);
    
    		static int randomSleep = 1;
    		if(randomSleep == 0)
    		{
    			tivxTaskWaitMsecs(7);
    		}
    		else
    		{
    			static int testSleep = 123;
    			testSleep *=7;
    			testSleep = testSleep % 21;
    			testSleep *=3;
    			testSleep = testSleep % 33;
    			tivxTaskWaitMsecs(testSleep);
    		}
    
    	}
    	printf("Run csi-tx graph end !!!!!!!!!!!!!!!!!!!\n");
    	obj->stop_task_done = 1;
    }
    
    static void app_test_csitx_run(appTestCsiTxInfo_t *obj)
    {
    	char c;
    
    	do
    	{
    		c = getchar();
    
    		if ('x' == c)
    			break;
    		else if ('p' == c)
    		{
    			appPerfStatsPrintAll();
    			tivx_utils_graph_perf_print(obj->graph);
    		}
    
    	} while (1);
    	//
    	obj->stop_task = 1;
    	while (!obj->stop_task_done)
    		tivxTaskWaitMsecs(33);
    }
    
    int app_test_csitx_main(vx_int32 argc, vx_char* argv[])
    {
    	vx_status status;
    	appTestCsiTxInfo_t *obj = &g_stTestCsiTxInfo;
    
    	obj->context = vxCreateContext();
    	tivxVideoIOLoadKernels(obj->context);
    	obj->graph = vxCreateGraph(obj->context);
    
    	vx_image exemplar = vxCreateImage(obj->context, TEST_IMG_W, TEST_IMG_H, VX_DF_IMAGE_UYVY);
    
    	obj->input_image_arr = vxCreateObjectArray(obj->context, (vx_reference)exemplar, 1);
    	vxReleaseImage(&exemplar);
    
    	vx_user_data_object csitx_config;
        tivx_csitx_params_t local_csitx_config;
    	uint32_t loopCnt;
    	//tivx_csitx_params_init(&local_csitx_config);
    	tivx_csitx_params_init(&local_csitx_config);
    	local_csitx_config.numInst							= 1U;
    	local_csitx_config.numCh							= NUM_CHANNELS;
    	local_csitx_config.instId[0U]						= CSITX_INST_ID;
    	local_csitx_config.instCfg[0U].rxCompEnable 		= (uint32_t)vx_true_e;
    	local_csitx_config.instCfg[0U].rxv1p3MapEnable		= (uint32_t)vx_true_e;
    	local_csitx_config.instCfg[0U].laneBandSpeed		= CSITX_LANE_BAND_SPEED;
    	local_csitx_config.instCfg[0U].laneSpeedMbps		= CSITX_LANE_SPEED_MBPS;
    	local_csitx_config.instCfg[0U].numDataLanes 		= 2U;//4U;
    	for (loopCnt = 0U ;
    		loopCnt < local_csitx_config.instCfg[0U].numDataLanes ;
    		loopCnt++)
    	{
    		local_csitx_config.instCfg[0U].lanePolarityCtrl[loopCnt] = 0u;
    	}
    	for (loopCnt = 0U; loopCnt < NUM_CHANNELS; loopCnt++)
    	{
    		local_csitx_config.chVcNum[loopCnt]   = loopCnt;
    		local_csitx_config.chInstMap[loopCnt] = CSITX_INST_ID;
    	}
    
    	printf("@@@ CSITX_LANE_SPEED_MBPS=%u\n", CSITX_LANE_SPEED_MBPS);
    	printf("@@@ prms->instCfg[loopCnt].vBlank=%u\n", local_csitx_config.instCfg[0].vBlank);
    	printf("@@@ prms->instCfg[loopCnt].hBlank=%u\n", local_csitx_config.instCfg[0].hBlank);
    
    	csitx_config = vxCreateUserDataObject(obj->context, "tivx_csitx_params_t", sizeof(tivx_csitx_params_t), &local_csitx_config);
    
        obj->csitx_node = tivxCsitxNode(obj->graph, csitx_config, obj->input_image_arr);
    	vxSetNodeTarget(obj->csitx_node, VX_TARGET_STRING, TIVX_TARGET_CSITX);
    	//
    	status = vxVerifyGraph(obj->graph);
    	if (VX_SUCCESS == status)
    	{
    		tivx_task_create_params_t params;
        	vx_status status;
    
       	 	tivxTaskSetDefaultCreateParams(&params);
        	params.task_main = app_run_graph_task;
    		params.app_var = (void *)obj;
    
    		obj->stop_task = 0;
        	status = tivxTaskCreate(&obj->task, &params);
    		if (VX_SUCCESS == status)
    		{
    			app_test_csitx_run(obj);
    		}
    	}
    	else
    	{
    		printf("vxVerifyGraph fail !!\n");
    	}
    	vxReleaseNode(&obj->csitx_node);
    	vxReleaseObjectArray(&obj->input_image_arr);
    	vxReleaseUserDataObject(&csitx_config);
    	tivxHwaUnLoadKernels(obj->context);
    	vxReleaseGraph(&obj->graph);
    	vxReleaseContext(&obj->context);
    
    	return 0;
    }
    
    
    

    你到底是不是也一样? 这似乎是一个单个 csitx 节点应用程序对吗?

    [报价用户 id="430634" url="~/support/processors-group/processors/f/processors-forum/1421218/tda4vm-j721s2/5479340 #5479340"]

    我们发现、当将 CSITX_DPHY_CLK_MODE_DEF 设置为(CSITX_CLK_MODE_NON_CONTINUE)时、如果给出不稳定的帧周期、csitx 节点将阻塞。

    当将 CSITX_DPHY_CLK_MODE_DEF 设置为(CSITX_CLK_MODE_CONTINUENT)时、它可能不会阻止。

    [报价]

    从节点角度来看、它们没有变化。 您要修改它的任何特定原因?

    此致、

    Nikhil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、它是 单个 csitx 节点应用程序。  我们没有 在最新的 SDK 上运行它。

    //

    我们将改回 CSITX_CLK_MODE_CONTINUOUS. 它没有被阻止运行大约一周的测试。

    谢谢。

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然。 如果您对此主题还有任何疑问、请告诉我。