/**************************************************************************//** * @file Smpl_Vdma.c * @brief Use VDMA to transfer data from memory to memory. * * SPDX-License-Identifier: Apache-2.0 * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. *****************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "N9H20.h" #if defined(__GNUC__) __attribute__((aligned(32))) UINT8 DestBuffer[480*272*2]; #else __align(32) UINT8 DestBuffer[480*272*2]; #endif #define DEST_ADDR ((UINT32)DestBuffer | NON_CACHE_BIT) #if defined(__GNUC__) extern __attribute__((aligned(32))) UINT8 LoadAddr[]; #else extern __align(32) UINT8 LoadAddr[]; #endif extern LCDFORMATEX lcdFormat; INT32 g_VdmaCh = 0; volatile BOOL g_bVdmaInt = FALSE; void EdmaIrqHandler(unsigned int arg) { EDMA_Free(g_VdmaCh); g_bVdmaInt = TRUE; } void ColorSpaceTransformTest(void) { UINT32 src_addr, dest_addr; src_addr = (UINT32)LoadAddr | NON_CACHE_BIT; dest_addr = DEST_ADDR; g_VdmaCh = VDMA_FindandRequest(); if (g_VdmaCh < 0) { sysprintf("Request VDMA fail.\n"); return; } EDMA_SetupCST(g_VdmaCh, eDRVEDMA_RGB565, eDRVEDMA_YCbCr422); EDMA_SetupSingle(g_VdmaCh, src_addr, dest_addr, 480*272*2); EDMA_SetupHandlers(g_VdmaCh, eDRVEDMA_BLKD_FLAG, EdmaIrqHandler, 0); EDMA_Trigger(g_VdmaCh); while(g_bVdmaInt == FALSE); EDMA_ClearCST(g_VdmaCh); g_bVdmaInt = FALSE; sysprintf("\nColor space transform test complete\n"); lcdFormat.ucVASrcFormat = DRVVPOST_FRAME_YCBYCR; vpostLCMInit(&lcdFormat, (UINT32*)dest_addr); } void TransferLengthTest(void) { UINT32 src_addr, dest_addr; src_addr = (UINT32)LoadAddr | NON_CACHE_BIT; dest_addr = DEST_ADDR; lcdFormat.ucVASrcFormat = DRVVPOST_FRAME_RGB565; vpostLCMInit(&lcdFormat, (UINT32*)LoadAddr); g_VdmaCh = VDMA_FindandRequest(); if (g_VdmaCh < 0) { sysprintf("Request VDMA fail.\n"); return; } EDMA_SetupSingle(g_VdmaCh, src_addr, dest_addr, 480*272*2); EDMA_SetupHandlers(g_VdmaCh, eDRVEDMA_BLKD_FLAG, EdmaIrqHandler, 0); EDMA_Trigger(g_VdmaCh); while(g_bVdmaInt == FALSE); g_bVdmaInt = FALSE; if(memcmp((UINT8*)src_addr, (UINT8*)dest_addr, 480*272*2) != 0) { sysprintf("\nCompare error\n"); while(1); } else sysprintf("\nTransfer length test complete\n"); }