From d09cb323cd2c0e46fbc53a72985e08fd48cdce60 Mon Sep 17 00:00:00 2001 From: "xinxin.li" Date: Thu, 25 Apr 2024 20:25:08 +0800 Subject: [PATCH] =?UTF-8?q?1.=20UCP4008-SL=20feature=20enhancement=20#1885?= =?UTF-8?q?;=202.=20=E4=BF=AE=E6=94=B9arm=20csu=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E6=A0=B8=E6=8A=A2=E5=8D=A0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- driver/arm_csu/src/arm_csu.c | 122 +++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 48 deletions(-) diff --git a/driver/arm_csu/src/arm_csu.c b/driver/arm_csu/src/arm_csu.c index f27053a..e554546 100644 --- a/driver/arm_csu/src/arm_csu.c +++ b/driver/arm_csu/src/arm_csu.c @@ -24,14 +24,27 @@ #include #include #include +#include +#include #include "ucp_utility.h" #include "ucp_printf.h" #include "drv_init.h" - +//#include "ospShell.h" uint8_t* virMemAddr = NULL; +uint32_t gTagStatus = 0; +pthread_spinlock_t gLockArmCsu; +#if 0 +void arm_csu_show() +{ + USHELL_PRINT("%d", gTagStatus); +} +#endif + int arm_csu_init() { + pthread_spin_init((pthread_spinlock_t *)&gLockArmCsu,PTHREAD_PROCESS_PRIVATE);//PTHREAD_PROCESS_SHARED + if (-1 == g_drv_mem_fd0) { // printf("open dev mem. \r\n"); @@ -72,6 +85,8 @@ int arm_csu_init() *((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK1)) = 0xFFFFFFFF; *((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK2)) = 0xFFFFFFFF; *((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK3)) = 0xFFFFFFFF; + + //osp_insert_cmd("sc", (OSP_FUNCPTR)arm_csu_show, "arm insert test", 0); return 0; } @@ -100,38 +115,42 @@ int arm_csu_wait_done(uint8_t tag) while (1) { status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS); - // printf("tag = %d, dmastatus = 0x%x. \r\n", tag, status); if (0 != (status&(1<>16) & 0xFF; - int ret = regGroup | (fifoNum<<8) | (tag<<16); - return ret; - } - } - } + for(int tag = 0; tag < 8; tag++) + { + if((1 << tag) == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1 << tag))) + { + if((1 << tag) & gTagStatus) + { + continue; + } + else + { + gTagStatus |= (1 << tag) ; //置上tag使用中 + uint8_t regGroup = tag; + uint8_t fifoNum = tag & 0x3; + int ret = regGroup | (fifoNum<<8) | (tag<<16); + pthread_spin_unlock((pthread_spinlock_t *)&gLockArmCsu); + return ret; + } + } + else + { + continue; + } + } } + } int arm_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen) @@ -233,9 +255,13 @@ int arm_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen dmaCmdL.dmaTag = tag; //(uint32_t)(VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0+(fifoNum<<2))) = (uint32_t)(*((uint32_t*)(&dmaCmdL))); memcpy((uint32_t*)(virMemAddr+AP_CSU_CMDFIFO0+(fifoNum<<2)), (uint32_t*)(&dmaCmdL), 4); + + //atomic_fetch_and(&gTagStatus, (~(1<