/** * @brief Memory copy funtion * @param "void *Des" : destination address * @param "void *Src" : source address * @param "int size" : size * @return 0 : success ; -1 : fail */ int CacheMng_MemCpy( void *Des, void *Src, int size ) { if( Des == NULL || Src == NULL ) { return CACHE_PARM_ERR; } #if CACHEMNG_DMA DRV_DmaCopy1D copy1D; Sem_lock( STREAM_SEM_CACHECPY); copy1D.srcPhysAddr = (unsigned long)DRV_dmaGetPhysAddr((unsigned long)Src); copy1D.dstPhysAddr = (unsigned long)DRV_dmaGetPhysAddr((unsigned long)Des); copy1D.size = size; DRV_dmaCopy1D(&dmaHndl, ©1D, 1); Sem_unlock( STREAM_SEM_CACHECPY); #else memcpy( Des, Src , size ); #endif return 0; }
/** * @brief Do memory copy * @param "void *pDes" : destination address * @param "void *pSrc" : source address * @param "int size" : size * @return 0 : success ; others : fail */ int MemMng_memcpy(void *pDes, void *pSrc, int size ) { #if MEMMNG_DMA DRV_DmaCopy1D copy1D; Sem_lock( STREAM_SEM_MEMCPY); copy1D.srcPhysAddr = (unsigned long)DRV_dmaGetPhysAddr((unsigned long)pSrc); copy1D.dstPhysAddr = (unsigned long)DRV_dmaGetPhysAddr((unsigned long)pDes); copy1D.size = size ; DRV_dmaCopy1D(&dmaHndl, ©1D, 1); Sem_unlock( STREAM_SEM_MEMCPY); #else memcpy( pDes, pSrc, size ); #endif return 0; }
int DRV_frameCopy(DRV_DmaChHndl *dmaHndl, DRV_FrameCopyPrm *prm) { DRV_DmaCopy2D copy2D[2]; DRV_DmaFill2D fill2D[2]; unsigned long physAddr; Uint32 chromaOffset; int status; Bool doLock; if(prm->dstVirtAddr==NULL || prm->copyWidth<=0 || prm->copyHeight<=0 || prm->dstOffsetH<=0 || prm->dstOffsetV<=0 || prm->dstStartX < 0 || prm->dstStartY < 0 || prm->srcStartX < 0 || prm->srcStartY < 0 ) { OSA_ERROR("Invalid Parameters!!!\n"); return OSA_EFAIL; } if(dmaHndl==NULL) { doLock = TRUE; dmaHndl = &gDRV_frameCopyObj.dmaHndl; } else { doLock = FALSE; } prm->srcStartX = OSA_floor(prm->srcStartX, 2); prm->srcStartY = OSA_floor(prm->srcStartY, 2); prm->dstStartX = OSA_floor(prm->dstStartX, 2); prm->dstStartY = OSA_floor(prm->dstStartY, 2); prm->copyWidth = OSA_floor(prm->copyWidth, 2); prm->copyHeight= OSA_floor(prm->copyHeight, 2); if(prm->srcVirtAddr==NULL) { // do fill physAddr = (unsigned long)prm->dstPhysAddr; if(physAddr==(unsigned long)NULL) physAddr = DRV_dmaGetPhysAddr((unsigned long)prm->dstVirtAddr); fill2D[0].dstVirtAddr = (unsigned long)prm->dstVirtAddr; fill2D[0].dstPhysAddr = physAddr; fill2D[0].copyWidth = prm->copyWidth; fill2D[0].copyHeight = prm->copyHeight; fill2D[0].dstOffsetH = prm->dstOffsetH; fill2D[0].fillValue = 0x00000000; if(prm->dataFormat==DRV_DATA_FORMAT_YUV422) { fill2D[0].copyWidth *= 2; fill2D[0].dstOffsetH *= 2; fill2D[0].fillValue = 0x00800080; fill2D[0].dstVirtAddr += prm->dstStartX*2 + prm->dstStartY*fill2D[0].dstOffsetH; fill2D[0].dstPhysAddr += prm->dstStartX*2 + prm->dstStartY*fill2D[0].dstOffsetH; } else { fill2D[0].dstVirtAddr += prm->dstStartX + prm->dstStartY*fill2D[0].dstOffsetH; fill2D[0].dstPhysAddr += prm->dstStartX + prm->dstStartY*fill2D[0].dstOffsetH; } if(prm->dataFormat==DRV_DATA_FORMAT_YUV420) { chromaOffset = prm->dstOffsetH*prm->dstOffsetV; fill2D[1].dstVirtAddr = (Uint32)prm->dstVirtAddr + chromaOffset; fill2D[1].dstPhysAddr = physAddr + chromaOffset; fill2D[1].dstVirtAddr += prm->dstStartX + prm->dstStartY/2*fill2D[0].dstOffsetH; fill2D[1].dstPhysAddr += prm->dstStartX + prm->dstStartY/2*fill2D[0].dstOffsetH; fill2D[1].copyWidth = fill2D[0].copyWidth; fill2D[1].copyHeight = fill2D[0].copyHeight/2; fill2D[1].dstOffsetH = fill2D[0].dstOffsetH; fill2D[1].fillValue = 0x80808080; } if(doLock) OSA_mutexLock(&gDRV_frameCopyObj.lock); #if 0 OSA_printf(" DRV: FrameCopy: D(%08lx %d) C(%d %d)\n", fill2D[0].dstPhysAddr, fill2D[0].dstOffsetH, fill2D[0].copyWidth , fill2D[0].copyHeight ); OSA_printf(" DRV: FrameCopy: D(%08lx %d) C(%d %d)\n", fill2D[1].dstPhysAddr, fill2D[1].dstOffsetH, fill2D[1].copyWidth , fill2D[1].copyHeight ); #endif if(prm->dataFormat==DRV_DATA_FORMAT_YUV422) { status = DRV_dmaFill2D(dmaHndl, fill2D, 1); } else { status = DRV_dmaFill2D(dmaHndl, fill2D, 2); } if(doLock) OSA_mutexUnlock(&gDRV_frameCopyObj.lock); } else { if(prm->srcOffsetH<=0 || prm->srcOffsetV<=0) return OSA_EFAIL; physAddr = (unsigned long)prm->dstPhysAddr; if(physAddr==(unsigned long)NULL) physAddr = DRV_dmaGetPhysAddr((unsigned long)prm->dstVirtAddr); copy2D[0].dstPhysAddr = physAddr; copy2D[0].skipH = 0; physAddr = (unsigned long)prm->srcPhysAddr; if(physAddr==(unsigned long)NULL) physAddr = DRV_dmaGetPhysAddr((unsigned long)prm->srcVirtAddr); copy2D[0].srcPhysAddr = physAddr; copy2D[0].copyWidth = prm->copyWidth; copy2D[0].copyHeight = prm->copyHeight; copy2D[0].dstOffsetH = prm->dstOffsetH; copy2D[0].srcOffsetH = prm->srcOffsetH; if(prm->dataFormat==DRV_DATA_FORMAT_YUV422) { copy2D[0].copyWidth *= 2; copy2D[0].dstOffsetH *= 2; copy2D[0].srcOffsetH *= 2; copy2D[0].srcPhysAddr += prm->srcStartX*2 + prm->srcStartY*copy2D[0].srcOffsetH; copy2D[0].dstPhysAddr += prm->dstStartX*2 + prm->dstStartY*copy2D[0].dstOffsetH; } else { copy2D[0].srcPhysAddr += prm->srcStartX + prm->srcStartY*copy2D[0].srcOffsetH; copy2D[0].dstPhysAddr += prm->dstStartX + prm->dstStartY*copy2D[0].dstOffsetH; } if(prm->dataFormat==DRV_DATA_FORMAT_YUV420) { physAddr = (unsigned long)prm->dstPhysAddr; if(physAddr==(unsigned long)NULL) physAddr = DRV_dmaGetPhysAddr((unsigned long)prm->dstVirtAddr); copy2D[1].dstPhysAddr = physAddr + prm->dstOffsetH*prm->dstOffsetV; physAddr = (unsigned long)prm->srcPhysAddr; if(physAddr==(unsigned long)NULL) physAddr = DRV_dmaGetPhysAddr((unsigned long)prm->srcVirtAddr); copy2D[1].srcPhysAddr = physAddr + prm->srcOffsetH*prm->srcOffsetV; copy2D[1].copyWidth = copy2D[0].copyWidth; copy2D[1].copyHeight = copy2D[0].copyHeight/2; copy2D[1].dstOffsetH = copy2D[0].dstOffsetH; copy2D[1].srcOffsetH = copy2D[0].srcOffsetH; copy2D[1].skipH = 0; copy2D[1].srcPhysAddr += prm->srcStartX + prm->srcStartY/2*copy2D[1].srcOffsetH; copy2D[1].dstPhysAddr += prm->dstStartX + prm->dstStartY/2*copy2D[1].dstOffsetH; } #if 0 OSA_printf(" DRV: FrameCopy: S(%08lx %d) D(%08lx %d) C(%d %d %d)\n", copy2D[0].srcPhysAddr, copy2D[0].srcOffsetH, copy2D[0].dstPhysAddr, copy2D[0].dstOffsetH, copy2D[0].copyWidth , copy2D[0].copyHeight, copy2D[0].skipH ); OSA_printf(" DRV: FrameCopy: S(%08lx %d) D(%08lx %d) C(%d %d %d)\n", copy2D[1].srcPhysAddr, copy2D[1].srcOffsetH, copy2D[1].dstPhysAddr, copy2D[1].dstOffsetH, copy2D[1].copyWidth , copy2D[1].copyHeight, copy2D[1].skipH ); #endif if(doLock) OSA_mutexLock(&gDRV_frameCopyObj.lock); if(prm->dataFormat==DRV_DATA_FORMAT_YUV422) { status = DRV_dmaCopy2D(dmaHndl, copy2D, 1); } else { status = DRV_dmaCopy2D(dmaHndl, copy2D, 2); } if(doLock) OSA_mutexUnlock(&gDRV_frameCopyObj.lock); } if(status!=OSA_SOK) { OSA_ERROR("DRV_dmaCopyFill2D() (chId = %d)\n", gDRV_frameCopyObj.dmaHndl.chId); } return status; }