Other Parts Discussed in Thread: TDA4VL, TDA4VM, SYSCONFIG
Hi TI Expert
We use UDMA to capture USS data, and the code refers to the demo link below:
e2e.ti.com/.../faq-tda4vm-gpio-dma-trigger-in-tda4-and-test-in-sdk7-1
The current status is that data can be captured normally on tad4vm, but cannot be captured on tda4VL.
From the log of tda4VL, it can be seen that both UDMA and irq configurations were successful, but UDMA cannot capture any data, and the data is all 0
log:
[MCU2_1] 13.055499 s: snrDrvInit entry ... [MCU2_1] 13.055550 s: func:GpioDmaInit [MCU2_1] 13.058309 s: chIdx:0 UDMA channel open sucess! [MCU2_1] 13.059349 s: chIdx:1 UDMA channel open sucess! [MCU2_1] 13.060263 s: chIdx:2 UDMA channel open sucess! [MCU2_1] 13.061153 s: chIdx:3 UDMA channel open sucess! [MCU2_1] 13.062025 s: chIdx:4 UDMA channel open sucess! [MCU2_1] 13.062891 s: chIdx:5 UDMA channel open sucess! [MCU2_1] 13.063767 s: chIdx:6 UDMA channel open sucess! [MCU2_1] 13.064627 s: chIdx:7 UDMA channel open sucess! [MCU2_1] 13.065590 s: chIdx:8 UDMA channel open sucess! [MCU2_1] 13.066462 s: chIdx:9 UDMA channel open sucess! [MCU2_1] 13.067572 s: chIdx:10 UDMA channel open sucess! [MCU2_1] 13.068465 s: chIdx:11 UDMA channel open sucess! [MCU2_1] 13.068974 s: dst_host_irq=4 [MCU2_1] 13.069107 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069138 s: dst_host_irq=5 [MCU2_1] 13.069254 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069284 s: dst_host_irq=6 [MCU2_1] 13.069391 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069420 s: dst_host_irq=7 [MCU2_1] 13.069527 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069557 s: dst_host_irq=8 [MCU2_1] 13.069664 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069694 s: dst_host_irq=9 [MCU2_1] 13.069796 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069826 s: dst_host_irq=10 [MCU2_1] 13.069936 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.069965 s: dst_host_irq=11 [MCU2_1] 13.070077 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.070107 s: dst_host_irq=12 [MCU2_1] 13.070216 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.070246 s: dst_host_irq=13 [MCU2_1] 13.070350 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.070380 s: dst_host_irq=14 [MCU2_1] 13.070497 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.070527 s: dst_host_irq=15 [MCU2_1] 13.070638 s: Sciclient_rmIrqSetRaw Worked fine [MCU2_1] 13.071073 s: snr power on ... [MCU2_1] 13.071098 s: snrDrvInit exit ...
code:
uint32_t INTR_OFFSET = 0u; #define GPIOMUX_INTRTR0_OUTP_START_R5FSS0 (4u + INTR_OFFSET) static void App_setupPinmux() { *(volatile unsigned int *)(0x00011C0a8) = 0x60007; //GPII0_41 RFS_I AD19 *(volatile unsigned int *)(0x00011C0b0) = 0x60007; //GPII0_43 FLS_I AF28 *(volatile unsigned int *)(0x00011C0AC) = 0x60007; //GPII0_42 RRS_I AD18 *(volatile unsigned int *)(0x00011C0b8) = 0x60007; //GPII0_45 RLS_I AE27 *(volatile unsigned int *)(0x00011C084) = 0x60007; //GPII0_32 FLC_I AJ25 *(volatile unsigned int *)(0x00011C090) = 0x60007; //GPII0_35 FRM_I AH26 *(volatile unsigned int *)(0x00011C088) = 0x60007; //GPII0_33 FRC_I AH25 *(volatile unsigned int *)(0x00011C08C) = 0x60007; //GPII0_34 FLM_I AG25 *(volatile unsigned int *)(0x00011C094) = 0x60007; //GPII0_36 RLC_I AJ27 *(volatile unsigned int *)(0x00011C0A4) = 0x60007; //GPII0_40 RRM_I AH22 *(volatile unsigned int *)(0x00011C098) = 0x60007; //GPII0_37 RRC_I AJ26 *(volatile unsigned int *)(0x00011C0A0) = 0x60007; //GPII0_39 RLM_I AJ22 } void App_initGpio() { uint32_t chIdx, bitpos, gpio_id, bank_id; uint32_t offset = 0; for (chIdx = 0; chIdx < APP_NUM_CH; chIdx ++) { //gpio_id = GPIO_START + chIdx; gpio_id = gpio_input[chIdx]; bitpos = gpio_id % 32; bank_id = gpio_id / 16; offset = gpio_id/32 * 0x28; /*GPIO_BINTEN*/ //*(volatile uint32_t *)0x00600008 = (1u << bank_id); *(volatile uint32_t *)0x00600008 |= (1u << bank_id); /*GPIO_DIR*/ *(volatile uint32_t *)(0x00600010+offset) |= (1u << bitpos); /*GPIO_SET_RIS_TRIG*/ *(volatile uint32_t *)(0x00600024+offset) |= (1u << bitpos); /*GPIO_SET_FAL_TRIG*/ *(volatile uint32_t *)(0x0060002c+offset) |= (1u << bitpos); /*GPIO_INTSTAT*/ *(volatile uint32_t *)(0x00600034+offset) |= (1u << bitpos); } } static void App_setupGpioMuxIr() { int32_t status; uint32_t chIdx; struct tisci_msg_rm_irq_set_req rmIrqReq; struct tisci_msg_rm_irq_set_resp rmIrqResp; //int32_t i; memset(&rmIrqReq, 0x0, sizeof(rmIrqReq)); memset(&rmIrqResp, 0x0, sizeof(rmIrqResp)); rmIrqReq.valid_params = 0U; rmIrqReq.global_event = 0U; rmIrqReq.src_id = 0U; rmIrqReq.src_index = 0U; rmIrqReq.dst_id = 0U; rmIrqReq.dst_host_irq = 0U; rmIrqReq.ia_id = 0U; rmIrqReq.vint = 0U; rmIrqReq.vint_status_bit_index = 0U; rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST; rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST; for(chIdx = 0U; chIdx < APP_NUM_CH; chIdx++) { rmIrqReq.src_id = TISCI_DEV_GPIOMUX_INTRTR0; //rmIrqReq.src_index = GPIO_START + chIdx; rmIrqReq.src_index = gpio_input[chIdx]; /* Set the destination based on the core */ rmIrqReq.dst_id = TISCI_DEV_GPIOMUX_INTRTR0; rmIrqReq.dst_host_irq = GPIOMUX_INTRTR0_OUTP_START_R5FSS0 + chIdx; /* Set the destination interrupt */ rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_ID_VALID; rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID; printf("dst_host_irq=%d \n", rmIrqReq.dst_host_irq); status = Sciclient_rmIrqSetRaw( (const struct tisci_msg_rm_irq_set_req *)&rmIrqReq, &rmIrqResp, SCICLIENT_SERVICE_WAIT_FOREVER); if(status == CSL_PASS) { App_print ("Sciclient_rmIrqSetRaw Worked fine \n"); } else { printf("Sciclient_rmIrqSetRaw Failed :%d\n", status); } } } static int32_t App_init(App_Obj *appObj) { int32_t retVal = UDMA_SOK; int32_t chIdx; App_ChObj *appChObj; Udma_DrvHandle drvHandle; drvHandle = appObj->drvHandle = appUdmaGetObj(); /* Init channel parameters */ for(chIdx = 0U; chIdx < APP_NUM_CH; chIdx++) { appChObj = &appObj->appChObj[chIdx]; appChObj->chIdx = chIdx; appChObj->chHandle = &appChObj->chObj; appChObj->cqEventHandle = NULL; appChObj->tdCqEventHandle = NULL; appChObj->drvHandle = drvHandle; appChObj->transferDoneSem = NULL; appChObj->txRingMem = appMemAlloc(APP_MEM_HEAP_DDR, APP_RING_MEM_SIZE_ALIGN, UDMA_CACHELINE_ALIGNMENT); appChObj->txCompRingMem = appMemAlloc(APP_MEM_HEAP_DDR, APP_RING_MEM_SIZE_ALIGN, UDMA_CACHELINE_ALIGNMENT); appChObj->txTdCompRingMem = appMemAlloc(APP_MEM_HEAP_DDR, APP_RING_MEM_SIZE_ALIGN, UDMA_CACHELINE_ALIGNMENT); appChObj->trpdMem = appMemAlloc(APP_MEM_HEAP_DDR, APP_TRPD_SIZE_ALIGN, UDMA_CACHELINE_ALIGNMENT); //appChObj->destBuf = appMemAlloc(APP_MEM_HEAP_DDR_NON_CACHE, APP_BUF_SIZE_ALIGN*64, UDMA_CACHELINE_ALIGNMENT); appChObj->destBuf = appMemAlloc(APP_MEM_HEAP_DDR, APP_BUF_SIZE_ALIGN*128, UDMA_CACHELINE_ALIGNMENT); appChObj->trpd_mem_phy = appMemGetVirt2PhyBufPtr( (uint64_t) appChObj->trpdMem, APP_MEM_HEAP_DDR); } return (retVal); } static int32_t App_create(App_Obj *appObj) { int32_t retVal = UDMA_SOK; uint32_t chType; Udma_ChPrms chPrms; Udma_ChTxPrms txPrms; Udma_ChRxPrms rxPrms; Udma_EventHandle eventHandle; Udma_EventPrms eventPrms; SemaphoreP_Params semPrms; int32_t chIdx; App_ChObj *appChObj; Udma_ChHandle chHandle; Udma_DrvHandle drvHandle = appObj->drvHandle; for(chIdx = 0U; chIdx < APP_NUM_CH; chIdx++) { appChObj = &appObj->appChObj[chIdx]; chHandle = appChObj->chHandle; SemaphoreP_Params_init(&semPrms); appChObj->transferDoneSem = SemaphoreP_create(0, &semPrms); if(NULL == appChObj->transferDoneSem) { App_print("[Error] Sem create failed!!\n"); retVal = UDMA_EFAIL; } if(UDMA_SOK == retVal) { /* Init channel parameters */ chType = UDMA_CH_TYPE_TR_BLK_COPY; UdmaChPrms_init(&chPrms, chType); chPrms.fqRingPrms.ringMem = appChObj->txRingMem; chPrms.cqRingPrms.ringMem = appChObj->txCompRingMem; chPrms.tdCqRingPrms.ringMem = appChObj->txTdCompRingMem; chPrms.fqRingPrms.ringMemSize = APP_RING_MEM_SIZE; chPrms.cqRingPrms.ringMemSize = APP_RING_MEM_SIZE; chPrms.tdCqRingPrms.ringMemSize = APP_RING_MEM_SIZE; chPrms.fqRingPrms.elemCnt = APP_RING_ENTRIES; chPrms.cqRingPrms.elemCnt = APP_RING_ENTRIES; chPrms.tdCqRingPrms.elemCnt = APP_RING_ENTRIES; /* Open channel for block copy */ retVal = Udma_chOpen(drvHandle, chHandle, chType, &chPrms); if(UDMA_SOK != retVal) { App_print("[Error]: UDMA channel open failed!!\n"); printf("---------Error:%d\n", retVal); } else{ printf("chIdx:%d UDMA channel open sucess!\n" , chIdx); } } if(UDMA_SOK == retVal) { /* Config TX channel */ UdmaChTxPrms_init(&txPrms, chType); retVal = Udma_chConfigTx(chHandle, &txPrms); if(UDMA_SOK != retVal) { App_print("[Error] UDMA TX channel config failed!!\n"); } } if(UDMA_SOK == retVal) { /* Config RX channel - which is implicitly paired to TX channel in * block copy mode */ UdmaChRxPrms_init(&rxPrms, chType); retVal = Udma_chConfigRx(chHandle, &rxPrms); if(UDMA_SOK != retVal) { App_print("[Error] UDMA RX channel config failed!!\n"); } } if(UDMA_SOK == retVal) { /* Register ring completion callback - for the last channel only */ eventHandle = &appChObj->cqEventObj; UdmaEventPrms_init(&eventPrms); eventPrms.eventType = UDMA_EVENT_TYPE_DMA_COMPLETION; eventPrms.eventMode = UDMA_EVENT_MODE_SHARED; eventPrms.chHandle = chHandle; eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle); eventPrms.eventCb = &App_eventDmaCb; eventPrms.appData = appChObj; retVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms); if(UDMA_SOK != retVal) { App_print("[Error] UDMA CQ event register failed!!\n"); } else { appChObj->cqEventHandle = eventHandle; } } if(UDMA_SOK == retVal) { /* Register teardown ring completion callback */ eventHandle = &appChObj->tdCqEventObj; UdmaEventPrms_init(&eventPrms); eventPrms.eventType = UDMA_EVENT_TYPE_TEARDOWN_PACKET; eventPrms.eventMode = UDMA_EVENT_MODE_SHARED; eventPrms.chHandle = chHandle; eventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle); eventPrms.eventCb = &App_eventTdCb; eventPrms.appData = appChObj; retVal = Udma_eventRegister(drvHandle, eventHandle, &eventPrms); if(UDMA_SOK != retVal) { App_print("[Error] UDMA Teardown CQ event register failed!!\n"); } else { appChObj->tdCqEventHandle = eventHandle; } } if(UDMA_SOK == retVal) { /* Channel enable */ retVal = Udma_chEnable(chHandle); if(UDMA_SOK != retVal) { App_print("[Error] UDMA channel enable failed!!\n"); } } if(UDMA_SOK != retVal) { break; } } /* Setup GPIO Pinmux */ App_setupPinmux(); /* Initialize GPIO now here */ App_initGpio(); /* Configure GPIO Mux to output event on Interrupt Aggregrator */ App_setupGpioMuxIr(); /* Setup L2G register to map local event to Global event */ //App_setupL2G(appObj, 1); for(chIdx = 0U; chIdx < APP_NUM_CH; chIdx++) { appChObj = &appObj->appChObj[chIdx]; chHandle = appChObj->chHandle; GpioDmaSubmitTrpd(chIdx); retVal = Udma_chPause(chHandle); if(UDMA_SOK != retVal) { App_print("[Error] UDMA channel disable failed!!\n"); } } return (retVal); }
Please assist in analyzing, thank you~!