📄 jpeg_mjpeg_yuvitu.c
字号:
/*****************************************************************************
Copyright (c) 2006 Analog Devices, Inc. All Rights Reserved.
This software is proprietary and confidential to Analog Devices, Inc.
and its licensors.
*****************************************************************************
$RCSfile: jpeg_mjpeg_yuvitu.c,v $
$Revision: 1.2 $
$Date: 2006/11/10 07:18:58 $
Project: BlackfinSDK (JPEG-MJPEG)
Title: YUV <-> ITU656 conversion
Author(s): bmk
Revised by:
Description:
Functions to manage YUV to ITU656 & ITU656 to YUV conversion
References:
None
*****************************************************************************
Tab Setting: 4
Target Processor: ADSP-BF5xx
Target Tools Revision: ADSP VisualDSP++ v4.5
******************************************************************************
Modification History:
====================
$Log: jpeg_mjpeg_yuvitu.c,v $
Revision 1.2 2006/11/10 07:18:58 bmk
merged BF533 & BF561 apps
Fixed BF561 caches issue
Revision 1.1 2006/11/03 07:12:08 bmk
SDK 2.0 files - Initial Entry
******************************************************************************
Include files
*****************************************************************************/
#include <jpeg_mjpeg_system.h> // system includes
#include <string.h>
/*****************
Macros
******************/
#define NUM_DESCRIPTORS 6 // Maximum number of descriptors to be used
/*************************
Local function prototypes
*************************/
// Installs Memory DMA for YUV <-> ITU656 conversion
void InstallMDMA_YUV_ITU656 (void);
// YUV <-> ITU656 conversion - MDMA callback function
static void MDMA_YUV_ITU656Callback(void *AppHandle, u32 Event, void *pArg);
/*****************
Globals
******************/
// MDMA channel handles for YUV to ITU656 conversion
static ADI_DMA_CHANNEL_HANDLE MDMAHandleSrc; // Source handle
static ADI_DMA_CHANNEL_HANDLE MDMAHandleDest; // Destination handle
// source and destination descriptors
ADI_DMA_DESCRIPTOR_UNION SrcDescriptor [NUM_DESCRIPTORS];
ADI_DMA_DESCRIPTOR_UNION DestDescriptor[NUM_DESCRIPTORS];
// variables to update source & destination descriptor addresses
u32 SrcDescAddrUpdate [NUM_DESCRIPTORS];
u32 DestDescAddrUpdate[NUM_DESCRIPTORS];
// pointer to start of source descriptor chain
ADI_DMA_DESCRIPTOR_UNION *pSrcDescriptor ;
// pointer to start of destination descriptor chain
ADI_DMA_DESCRIPTOR_UNION *pDestDescriptor;
/*********************************************************************
Function: SetupMDMA_YUV_ITU656
Description: Initialises Descriptors for MDMA
(for YUV <-> ITU656 frame conversion)
Create all descriptor pointers for the MDMA channels
MDMA copies from YUV buffers and builds a ITU656 Video Frame or
extracts YUV data from ITU656 frame and builds YUV buffer for
JPEG encoding
*********************************************************************/
#pragma optimize_off
section("sdram0_bank1_nocache")
void SetupMDMA_YUV_ITU656 (void)
{
int i;
for(i=0; i<NUM_DESCRIPTORS; i++)
{
// Clear all the descriptor elements first
memset(&SrcDescriptor[i],0,sizeof(ADI_DMA_DESCRIPTOR_UNION));
SrcDescriptor[i].Large.Config.b_WNR = 0; // source
SrcDescriptor[i].Large.Config.b_DMA2D = 1;
SrcDescriptor[i].Large.Config.b_RESTART = 1;
// Clear all the descriptor elements first
memset(&DestDescriptor[i],0,sizeof(ADI_DMA_DESCRIPTOR_UNION));
DestDescriptor[i].Large.Config.b_WNR = 1; // Destination
DestDescriptor[i].Large.Config.b_DMA2D = 1;
DestDescriptor[i].Large.Config.b_RESTART = 1;
}
// Create the linked list of descriptors
for(i=0; i<(NUM_DESCRIPTORS-1); i++)
{
SrcDescriptor [i].Large.pNext = (ADI_DMA_DESCRIPTOR_LARGE *)&SrcDescriptor [i+1];
DestDescriptor[i].Large.pNext = (ADI_DMA_DESCRIPTOR_LARGE *)&DestDescriptor[i+1];
}
// Create the termination descriptor for the list
SrcDescriptor [NUM_DESCRIPTORS-1].Large.pNext = NULL;
DestDescriptor[NUM_DESCRIPTORS-1].Large.pNext = NULL;
pSrcDescriptor = &SrcDescriptor [0]; // start of source descriptor chain
pDestDescriptor = &DestDescriptor[0]; // start of destination descriptor chain
// Install MDMA Driver for YUV to ITU656 conversion
InstallMDMA_YUV_ITU656();
return;
}
#pragma optimize_as_cmd_line
/*********************************************************************
Function: InstallMDMA_YUV_ITU656
Description: Installs Memory DMA for YUV <-> ITU656 conversion
*********************************************************************/
section("sdram0_bank1_nocache")
void InstallMDMA_YUV_ITU656(void)
{
// Open (memory)DMA channels
ezErrorCheck( adi_dma_Open( DMAManagerHandle, // DMA Manager Handle
YUV_ITU656_MDMA_SRC_CHANNEL, // MDMA Source channel ID
NULL, // No client Handle
&MDMAHandleSrc, // Address of Source Channel handle location
ADI_DMA_MODE_DESCRIPTOR_LARGE, // DMA Mode
DCBManagerHandle, // Deffered Callback Manager
NULL) ); // No callback function provided for source channel
ezErrorCheck( adi_dma_Open( DMAManagerHandle, // DMA Manager Handle
YUV_ITU656_MDMA_DEST_CHANNEL, // MDMA Destination channel ID
NULL, // No client Handle
&MDMAHandleDest, // Address of Destination Channel handle location
ADI_DMA_MODE_DESCRIPTOR_LARGE, // DMA Mode
DCBManagerHandle, // Deffered Callback Manager
MDMA_YUV_ITU656Callback) ); // Callback function for Destination channel
// Enable MDMA dataflow
ezErrorCheck(adi_dma_Control(MDMAHandleSrc, ADI_DMA_CMD_SET_DATAFLOW, (void*)TRUE) );
ezErrorCheck(adi_dma_Control(MDMAHandleDest, ADI_DMA_CMD_SET_DATAFLOW, (void*)TRUE) );
return;
}
/*********************************************************************
Function: KickOffMDMA_YUV_ITU656
Description: Kicks off MDMA for YUV <-> ITU656 conversion
*********************************************************************/
section("Callback_Code")
void KickOffMDMA_YUV_ITU656(void)
{
// Queue Source descriptor chain
ezErrorCheck( adi_dma_Queue(MDMAHandleSrc, pSrcDescriptor) );
// Queue Destination descriptor chain
ezErrorCheck( adi_dma_Queue(MDMAHandleDest, pDestDescriptor) );
return;
}
/*********************************************************************
Function: FreeMDMA_YUVtoITU656
Description: Frees MDMA channels used for YUV to ITU656 conversion
*********************************************************************/
section("sdram0_bank1_nocache")
void FreeMDMA_YUV_ITU656(void)
{
// stop the MDMA dataflow
ezErrorCheck(adi_dma_Control(MDMAHandleSrc, ADI_DMA_CMD_SET_DATAFLOW, (void*)FALSE) );
ezErrorCheck(adi_dma_Control(MDMAHandleDest, ADI_DMA_CMD_SET_DATAFLOW, (void*)FALSE) );
// close the MDMA channel
ezErrorCheck( adi_dma_Close(MDMAHandleSrc, FALSE) );
ezErrorCheck( adi_dma_Close(MDMAHandleDest, FALSE) );
return;
}
/*********************************************************************
Function: MDMA_YUV_ITU656Callback
Description: YUV <-> ITU656 conversion - MDMA callback function
*********************************************************************/
section ("Callback_Code")
static void MDMA_YUV_ITU656Callback(
void *AppHandle,
u32 Event,
void *pArg
){
// CASEOF (event type)
switch (Event)
{
// CASE (buffer processed)
case ADI_DMA_EVENT_DESCRIPTOR_PROCESSED:
// Update YUV buffer ID for MDMA processing
if (BufferLevel > 0)
{
YUV_MDMA_BufID++;
if (YUV_MDMA_BufID >= NUM_YUV_BUFS)
YUV_MDMA_BufID = 0;
// decrement buffer level
BufferLevel--;
}
// ITU656 Video Frame is ready
FrameReady = TRUE;
break;
// CASE (an error)
case ADI_DMA_EVENT_ERROR_INTERRUPT:
// turn on all LEDs and wait for help
ezTurnOnAllLEDs();
while (1) ;
}
return;
}
/*********************************************************************
Function: Update_MDMA_DescAddr
Description: Update source & destination Descriptor addresses
for YUV <-> Video (ITU656) frame conversion
*********************************************************************/
section ("Callback_Code")
void Update_MDMA_DescAddr(void)
{
// Update source descriptor chain start addresses (MDMA)
SrcDescriptor [0].Large.StartAddress = (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[0]);
SrcDescriptor [1].Large.StartAddress = (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[1]);
SrcDescriptor [2].Large.StartAddress = (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[2]);
SrcDescriptor [3].Large.StartAddress = (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[3]);
SrcDescriptor [4].Large.StartAddress = (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[4]);
SrcDescriptor [5].Large.StartAddress = (void *)(pSrcDescStartAddr + SrcDescAddrUpdate[5]);
// Update destination descriptor chain start addresses (MDMA)
DestDescriptor[0].Large.StartAddress = (void *)(pDestDescStartAddr + DestDescAddrUpdate[0]);
DestDescriptor[1].Large.StartAddress = (void *)(pDestDescStartAddr + DestDescAddrUpdate[1]);
DestDescriptor[2].Large.StartAddress = (void *)(pDestDescStartAddr + DestDescAddrUpdate[2]);
DestDescriptor[3].Large.StartAddress = (void *)(pDestDescStartAddr + DestDescAddrUpdate[3]);
DestDescriptor[4].Large.StartAddress = (void *)(pDestDescStartAddr + DestDescAddrUpdate[4]);
DestDescriptor[5].Large.StartAddress = (void *)(pDestDescStartAddr + DestDescAddrUpdate[5]);
return;
}
/*********************************************************************
Function: SetupMDMA_YUV420toITU656
Description: Configures MDMA Descriptors for YUV420 to
ITU656 frame conversion
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -