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.

The data transmission between the IPU and DSP is incorrect.

Part Number: TDA2HG

When I use the link_control() function to send 64 bits of data from IPU to DSP, why is 32 bits lost?

If the data transmitted between IPU and DSP can only be controlled within 32 bits, why can a total size of 64 bits array be accurately transmitted to DSP?

In addition, in the daily debugging, the problem of log loss often occurs, I would like to ask why this is, is there any way to improve?  

Below is the validation code and the corresponding log:

HMIManager.c

Void HMIManager_linkTskMain(struct Utils_TskHndl_t * pTsk, Utils_MsgHndl * pMsg)
{
    UInt64 num;
    UInt8 numArray[6] = {0,1,8,100,200,255};
    
    .......
    .......
    .......

    
    //test num
	num = 0X13572468abcddbca;          
	HM_LogD("HMIMANAGER sizeof(long) = %d\n", sizeof(long));
	HM_LogD("HMIMANAGER sizeof(UInt64) = %d\n", sizeof(UInt64));
	HM_LogD("HMIMANAGER sizeof(num) = %d\n", sizeof(num));

	HM_LogD("HMIMANAGER num p= %p\n", num);
	HM_LogD("HMIMANAGER num x= %x\n", num); 
	HM_LogD("HMIMANAGER num lx= %lx\n", num); 
	HM_LogD("HMIMANAGER num llx= %llx\n", num); 
	
	
	memcpy(buf32, &num, sizeof(num));
	HM_LogD("HMIMANAGER buf32[0],buf32[1]= %x, %x\n", buf32[0],buf32[1]);

	status = System_linkControl(CMS_LinkId(CMS_LINK_ID_HMIRENDERER),
							HM_CMD_TURNTO,
							&num,
							sizeof(num),
							TRUE);
	Utils_tskAckOrFreeMsg(pMsg, status);
	HM_LogD("%s: HMIMANAGER send Cmd: HM_CMD_TURNTO TO hmirenderer\n", __FUNCTION__);
	Task_sleep(50);


	/* test: send cmd to hmi renderer linktsk*/
	for(i = 0; i < 6; ++i){
		HM_LogD("HMIMANAGER numArray[%d] p= %p \n",i , numArray[i]);
		HM_LogD("HMIMANAGER numArray[%d] x= %x \n\n",i , numArray[i]);
	}
	status = System_linkControl(CMS_LinkId(CMS_LINK_ID_HMIRENDERER),
							HM_CMD_OPENDOOR,
							numArray,
							sizeof(numArray),
							TRUE);
	Utils_tskAckOrFreeMsg(pMsg, status);
	HM_LogD("%s: HMIMANAGER send Cmd: HM_CMD_OPENDOOR TO hmirenderer\n", __FUNCTION__);
	
	.......
	.......
	.......
	
}






HMIRenderer.c

Void HMIRenderer_linkTskMain(struct Utils_TskHndl_t * pTsk, Utils_MsgHndl * pMsg)
{
	UInt8 *numArray = NULL;
    UInt32 buf32[2];
    UInt32 i;
	
	......
	......
	......
	case HM_CMD_TURNTO:
            HR_LogD("HMIRenderer sizeof(long) = %d\n", sizeof(long));
            HR_LogD("HMIRenderer sizeof(UInt64) = %d\n", sizeof(UInt64));
            HR_LogD("HMIRenderer sizeof(num) = %d\n", sizeof(num));
            
            num = *(UInt64 *)Utils_msgGetPrm(pMsg);
            Utils_tskAckOrFreeMsg(pMsg, status);

            HR_LogD("HMIRenderer num p= %p\n", num);
            HR_LogD("HMIRenderer num x= %x\n", num); 
            HR_LogD("HMIRenderer num lx= %lx\n", num); 
            HR_LogD("HMIRenderer num llx= %llx\n", num);

            
            memcpy(buf32, &num, sizeof(num));
            HR_LogD("HMIRenderer buf32[0],buf32[1]= %x, %x\n", buf32[0],buf32[1]);
            
            ++num;
            HR_LogD("HMIRenderer num p= %p\n", num);
            HR_LogD("HMIRenderer num x= %x\n", num); 
            HR_LogD("HMIRenderer num lx= %lx\n", num); 
            HR_LogD("HMIRenderer num llx= %llx\n", num);
            
            num -= 2;
            HR_LogD("HMIRenderer num p= %p\n", num);
            HR_LogD("HMIRenderer num x= %x\n", num); 
            HR_LogD("HMIRenderer num lx= %lx\n", num); 
            HR_LogD("HMIRenderer num llx= %llx\n", num);

            break;
           
        case HM_CMD_OPENDOOR:
            numArray = (UInt8*)Utils_msgGetPrm(pMsg);
            /* ACK message */ 
            for(i = 0; i < 6; ++i){
                HR_LogD("HMIRenderer numArray[%d] p= %p \n",i , numArray[i]);
                HR_LogD("HMIRenderer numArray[%d] x= %x \n\n",i , numArray[i]);
            }
         
            // /* ACK message */
            Utils_tskAckOrFreeMsg(pMsg, status);
            break;
    .....
    .....
    .....

	
}

 [HOST] [IPU1-0]     61.712743 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER sizeof(long) = 4
 [HOST] [IPU1-0]     61.712865 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER sizeof(UInt64) = 8
 [HOST] [IPU1-0]     61.712956 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER sizeof(num) = 8
 [HOST] [IPU1-0]     61.713078 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER num p= abcddbca
 [HOST] [IPU1-0]     61.713170 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER num x= abcddbca
 [HOST] [IPU1-0]     61.713292 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER num lx= abcddbca
 [HOST] [IPU1-0]     61.713414 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER num llx= 13572468abcddbca
 [HOST] [IPU1-0]     61.713536 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER buf32[0],buf32[1]= abcddbca, 13572468
 [HOST] [IPU1-0]     61.714024 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIManager_linkTskMain: HMIMANAGER send Cmd: HM_CMD_TURNTO TO hmirenderer

 [HOST] [IPU1-0]     61.763740 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[0] p= 0
 [HOST] [IPU1-0]     61.763862 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[0] x= 0
 [HOST] [IPU1-0]     61.763984 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[1] p= 1
 [HOST] [IPU1-0]     61.764106 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[1] x= 1
 [HOST] [IPU1-0]     61.764198 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[2] p= 8
 [HOST] [IPU1-0]     61.764320 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[2] x= 8
 [HOST] [IPU1-0]     61.764442 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[3] p= 64
 [HOST] [IPU1-0]     61.764564 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[3] x= 64
 [HOST] [IPU1-0]     61.764686 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[4] p= c8
 [HOST] [IPU1-0]     61.764808 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[4] x= c8
 [HOST] [IPU1-0]     61.764930 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[5] p= ff
 [HOST] [IPU1-0]     61.765021 s: [DEBUG][HM]:HMIManager_linkTskMain: HMIMANAGER numArray[5] x= ff
 
 
 [HOST] [DSP1  ]     61.713810 s: [DEBUG][HR]:: HMIRenderer sizeof(long) = 4
 [HOST] [DSP1  ]     61.713841 s: [DEBUG][HR]:: HMIRenderer sizeof(UInt64) = 8
 [HOST] [DSP1  ]     61.713871 s: [DEBUG][HR]:: HMIRenderer sizeof(num) = 8
 [HOST] [DSP1  ]     61.713932 s: [DEBUG][HR]:: HMIRenderer num p= 0
 [HOST] [DSP1  ]     61.713932 s: [DEBUG][HR]:: HMIRenderer num x= 0
 [HOST] [DSP1  ]     61.713963 s: [DEBUG][HR]:: HMIRenderer num lx= 0
 [HOST] [DSP1  ]     61.713993 s: [DEBUG][HR]:: HMIRenderer num llx= abcddbca00000000
 [HOST] [DSP1  ]     61.714024 s: [DEBUG][HR]:: HMIRenderer buf32[0],buf32[1]= 0, abcddbca
 [HOST] [DSP1  ]     61.714024 s: [DEBUG][HR]:: HMIRenderer num p= 1
 [HOST] [DSP1  ]     61.714054 s: [DEBUG][HR]:: HMIRenderer num x= 1
 [HOST] [DSP1  ]     61.714085 s: [DEBUG][HR]:: HMIRenderer num lx= 1
 [HOST] [DSP1  ]     61.714085 s: [DEBUG][HR]:: HMIRenderer num llx= abcddbca00000001
 [HOST] [DSP1  ]     61.714115 s: [DEBUG][HR]:: HMIRenderer num p= ffffffff
 [HOST] [DSP1  ]     61.714146 s: [DEBUG][HR]:: HMIRenderer num x= ffffffff
 [HOST] [DSP1  ]     61.714146 s: [DEBUG][HR]:: HMIRenderer num lx= ffffffff
 [HOST] [DSP1  ]     61.714207 s: [DEBUG][HR]:: HMIRenderer num llx= abcddbc9ffffffff

 [HOST] [DSP1  ]     61.774141 s: [DEBUG][HR]:: HMIRenderer numArray[0] p= 0
 [HOST] [DSP1  ]     61.774202 s: [DEBUG][HR]:: HMIRenderer numArray[0] x= 0
 [HOST] [DSP1  ]     61.774232 s: [DEBUG][HR]:: HMIRenderer numArray[1] p= 1
 [HOST] [DSP1  ]     61.774263 s: [DEBUG][HR]:: HMIRenderer numArray[1] x= 1
 [HOST] [DSP1  ]     61.774293 s: [DEBUG][HR]:: HMIRenderer numArray[2] p= 8
 [HOST] [DSP1  ]     61.774293 s: [DEBUG][HR]:: HMIRenderer numArray[2] x= 8
 [HOST] [DSP1  ]     61.774324 s: [DEBUG][HR]:: HMIRenderer numArray[3] p= 64
 [HOST] [DSP1  ]     61.774354 s: [DEBUG][HR]:: HMIRenderer numArray[3] x= 64
 [HOST] [DSP1  ]     61.774385 s: [DEBUG][HR]:: HMIRenderer numArray[4] p= c8
 [HOST] [DSP1  ]     61.774385 s: [DEBUG][HR]:: HMIRenderer numArray[4] x= c8
 [HOST] [DSP1  ]     61.774415 s: [DEBUG][HR]:: HMIRenderer numArray[5] p= ff
 [HOST] [DSP1  ]     61.774446 s: [DEBUG][HR]:: HMIRenderer numArray[5] x= ff

  • Hi,

    The payload size is 4KB so it has no problem to send 64-bit data.

    Your problem is due to the use of uint64_t datatype and the pointer you pass by dereferencing "num" is not pointing to first bytes.

    You should use an array "uint8_t num[8]" to send 8 bytes data (64-bit) and num will point to the first byte.

    Regards,
    Stanley