📄 blt.c
字号:
/**
*@author Zlatan Stanojevic
*/
#include <services/services.h>
//#include <services/adi_dma.h>
#include "blt.h"
ADI_DMA_MANAGER_HANDLE dma_man_handle;
BLT_RESULT blt( ADI_DMA_STREAM_ID stream_id, BLTBufferDesc *src, BLTBufferDesc *dest,
unsigned short src_x, unsigned short src_y, unsigned short dest_x,
unsigned short dest_y, unsigned short width, unsigned short height )
{
/* if( src_x + width > src->width )
return BLT_DIM;
if( src_y + height > src->height )
return BLT_DIM;
if( dest_x + width > dest->width )
return BLT_DIM;
if( dest_y + height > dest->height )
return BLT_DIM;
if( width % 2 )
return BLT_DIM;
*/
ADI_DMA_STREAM_HANDLE stream_handle;
ADI_DMA_2D_TRANSFER tsrc[2], tdest[2];
ADI_DMA_RESULT result;
result = adi_dma_MemoryOpen( dma_man_handle, stream_id, NULL, &stream_handle, NULL );
tsrc[0].XCount = tdest[0].XCount = tsrc[1].XCount = tdest[1].XCount = width / 2;
tsrc[0].YCount = tdest[0].YCount = tsrc[1].YCount = tdest[1].YCount = height / 2;
tsrc[0].XModify = tsrc[1].XModify = src->pixel_stride;
tdest[0].XModify = tdest[1].XModify = dest->pixel_stride;
if( src->interlaced )
{
tsrc[0].StartAddress = (void *)( (unsigned long)src->start_addr + src->offset + src->line_stride * src_y / 2 + src_x * src->pixel_stride / 2 );
tsrc[1].StartAddress = (void *)( (unsigned long)tsrc[0].StartAddress + src->field_stride );
tsrc[0].YModify = src->line_stride - width * src->pixel_stride / 2 + src->pixel_stride;
}
else
{
tsrc[0].StartAddress = (void *)( (unsigned long)src->start_addr + src->offset + src->line_stride * src_y + src_x * src->pixel_stride / 2 );
tsrc[1].StartAddress = (void *)( (unsigned long)tsrc[0].StartAddress + src->line_stride );
tsrc[0].YModify = 2 * src->line_stride - width * src->pixel_stride / 2 + src->pixel_stride;
}
tsrc[1].YModify = tsrc[0].YModify;
if( dest->interlaced )
{
tdest[0].StartAddress = (void *)( (unsigned long)dest->start_addr + dest->offset + dest->line_stride * dest_y / 2 + dest_x * dest->pixel_stride / 2 );
tdest[1].StartAddress = (void *)( (unsigned long)tdest[0].StartAddress + dest->field_stride );
tdest[0].YModify = dest->line_stride - width * dest->pixel_stride / 2 + dest->pixel_stride;
}
else
{
tdest[0].StartAddress = (void *)( (unsigned long)dest->start_addr + dest->offset + dest->line_stride * dest_y + dest_x * dest->pixel_stride / 2 );
tdest[1].StartAddress = (void *)( (unsigned long)tdest[0].StartAddress + dest->line_stride );
tdest[0].YModify = 2 * dest->line_stride - width * dest->pixel_stride / 2 + dest->pixel_stride;
}
tdest[1].YModify = tdest[0].YModify;
result = adi_dma_MemoryCopy2D( stream_handle, tdest, tsrc, 4, NULL );
if( result != ADI_DMA_RESULT_SUCCESS )
return BLT_ADI_DMA_ERROR;
result = adi_dma_MemoryCopy2D( stream_handle, tdest + 1, tsrc + 1, 4, NULL );
if( result != ADI_DMA_RESULT_SUCCESS )
return BLT_ADI_DMA_ERROR;
result = adi_dma_MemoryClose( stream_handle, TRUE );
if( result != ADI_DMA_RESULT_SUCCESS )
return BLT_ADI_DMA_ERROR;
return BLT_OK;
}
char adi_dma_working_buffer[ ADI_DMA_BASE_MEMORY + 2 * ADI_DMA_CHANNEL_MEMORY ];
BLT_RESULT blt_init()
{
u32 max_channels;
ADI_DMA_RESULT result = adi_dma_Init( adi_dma_working_buffer,
sizeof(adi_dma_working_buffer),
&max_channels,
&dma_man_handle,
NULL );
if( result != ADI_DMA_RESULT_SUCCESS )
return BLT_ADI_DMA_ERROR;
return BLT_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -