parent
adaced954a
commit
d09cb323cd
@ -24,14 +24,27 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <stdatomic.h>
|
||||||
|
#include <pthread.h>
|
||||||
#include "ucp_utility.h"
|
#include "ucp_utility.h"
|
||||||
#include "ucp_printf.h"
|
#include "ucp_printf.h"
|
||||||
#include "drv_init.h"
|
#include "drv_init.h"
|
||||||
|
//#include "ospShell.h"
|
||||||
|
|
||||||
uint8_t* virMemAddr = NULL;
|
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()
|
int arm_csu_init()
|
||||||
{
|
{
|
||||||
|
pthread_spin_init((pthread_spinlock_t *)&gLockArmCsu,PTHREAD_PROCESS_PRIVATE);//PTHREAD_PROCESS_SHARED
|
||||||
|
|
||||||
if (-1 == g_drv_mem_fd0)
|
if (-1 == g_drv_mem_fd0)
|
||||||
{
|
{
|
||||||
// printf("open dev mem. \r\n");
|
// 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_TAGMASK1)) = 0xFFFFFFFF;
|
||||||
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK2)) = 0xFFFFFFFF;
|
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK2)) = 0xFFFFFFFF;
|
||||||
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK3)) = 0xFFFFFFFF;
|
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK3)) = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
//osp_insert_cmd("sc", (OSP_FUNCPTR)arm_csu_show, "arm insert test", 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -100,38 +115,42 @@ int arm_csu_wait_done(uint8_t tag)
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS);
|
status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS);
|
||||||
// printf("tag = %d, dmastatus = 0x%x. \r\n", tag, status);
|
|
||||||
if (0 != (status&(1<<tag)))
|
if (0 != (status&(1<<tag)))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// while (0 == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1<<tag)));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int arm_csu_wait_all_done(void)
|
int arm_csu_wait_all_done(void)
|
||||||
{
|
{
|
||||||
#if 0
|
volatile uint32_t status = 0;
|
||||||
for (int i = 0; i < 32; i++)
|
while (1)
|
||||||
{
|
{
|
||||||
arm_csu_wait_done(i);
|
status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS);
|
||||||
}
|
if (0xFFFFFFFF == status)
|
||||||
#endif
|
{
|
||||||
while (1)
|
break;
|
||||||
{
|
}
|
||||||
int cmdNum = 0;
|
}
|
||||||
for (int i = 0; i < 4; i++)
|
#if 0
|
||||||
{
|
while (1)
|
||||||
cmdNum += VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0_NUM+(i<<2));
|
{
|
||||||
}
|
int cmdNum = 0;
|
||||||
if (0 == cmdNum)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
break;
|
cmdNum += VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0_NUM+(i<<2));
|
||||||
}
|
}
|
||||||
}
|
if (0 == cmdNum) // 命令字个数为0,也说明搬完了
|
||||||
|
{
|
||||||
return 0;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//CmdFIFO 0 1 2 3
|
//CmdFIFO 0 1 2 3
|
||||||
@ -173,34 +192,37 @@ int get_free_reg_group(uint8_t tag)
|
|||||||
|
|
||||||
return ((fifoNum<<16) | regGroup); // [31:16]fifoNum(0~3), [15:0]reg group(0~7)
|
return ((fifoNum<<16) | regGroup); // [31:16]fifoNum(0~3), [15:0]reg group(0~7)
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_free_channel()
|
int get_free_channel()
|
||||||
{
|
{
|
||||||
|
pthread_spin_lock((pthread_spinlock_t *)&gLockArmCsu);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
for (int tag = 0; tag < 32; tag++)
|
for(int tag = 0; tag < 8; tag++)
|
||||||
{
|
{
|
||||||
if (0 == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1<<tag)))
|
if((1 << tag) == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1 << tag)))
|
||||||
{
|
{
|
||||||
continue;
|
if((1 << tag) & gTagStatus)
|
||||||
}
|
{
|
||||||
else
|
continue;
|
||||||
{
|
}
|
||||||
uint32_t temp = get_free_reg_group(tag);
|
else
|
||||||
if (-1 == temp)
|
{
|
||||||
{
|
gTagStatus |= (1 << tag) ; //置上tag使用中
|
||||||
continue;
|
uint8_t regGroup = tag;
|
||||||
}
|
uint8_t fifoNum = tag & 0x3;
|
||||||
else
|
int ret = regGroup | (fifoNum<<8) | (tag<<16);
|
||||||
{
|
pthread_spin_unlock((pthread_spinlock_t *)&gLockArmCsu);
|
||||||
uint8_t regGroup = temp & 0xFF;
|
return ret;
|
||||||
uint8_t fifoNum = (temp>>16) & 0xFF;
|
}
|
||||||
int ret = regGroup | (fifoNum<<8) | (tag<<16);
|
}
|
||||||
return ret;
|
else
|
||||||
}
|
{
|
||||||
}
|
continue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int arm_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen)
|
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;
|
dmaCmdL.dmaTag = tag;
|
||||||
//(uint32_t)(VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0+(fifoNum<<2))) = (uint32_t)(*((uint32_t*)(&dmaCmdL)));
|
//(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);
|
memcpy((uint32_t*)(virMemAddr+AP_CSU_CMDFIFO0+(fifoNum<<2)), (uint32_t*)(&dmaCmdL), 4);
|
||||||
|
|
||||||
|
//atomic_fetch_and(&gTagStatus, (~(1<<tag)));
|
||||||
|
pthread_spin_lock((pthread_spinlock_t *)&gLockArmCsu);
|
||||||
|
gTagStatus &= (~(1<<tag));
|
||||||
|
pthread_spin_unlock((pthread_spinlock_t *)&gLockArmCsu);
|
||||||
|
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user