//使用時注意第62行的g_LcdWidth是表示顯示屏的寬度
//以及輸出是RGB565格式還是ARGB8888格式。
/*
- 函 數 名: DMA2D_Copy_YCbCr_To_RGB
- 功能說明: YCbCr轉RGB輸出
- 形 參: pSrc: 數據源地址
- pDst: 數據目的地址
- x: X軸首地址
- y: Y軸首地址
- xsize: 目的區域的X軸大小,即每行像素數
- ysize: 目的區域的Y軸大小,即行數
- PixelFormat: 目標區顏色格式
- ChromaSampling : YCbCr Chroma sampling : 4:2:0, 4:2:2 or 4:4:4
-
返 回 值: 無
/
static void DMA2D_Copy_YCbCr_To_RGB(uint32_t pSrc,
uint32_t *pDst,
uint16_t x,
uint16_t y,
uint16_t xsize,
uint16_t ysize,
uint32_t PixelFormat,
uint32_t ChromaSampling)
{
uint32_t cssMode = DMA2D_CSS_420;
uint32_t inputLineOffset = 0;
uint32_t destination = 0;/* 處理輸入行偏移 */ if(ChromaSampling == JPEG_420_SUBSAMPLING) { cssMode = DMA2D_CSS_420; inputLineOffset = xsize % 16; if(inputLineOffset != 0) { inputLineOffset = 16 - inputLineOffset; } } else if(ChromaSampling == JPEG_444_SUBSAMPLING) { cssMode = DMA2D_NO_CSS; inputLineOffset = xsize % 8; if(inputLineOffset != 0) { inputLineOffset = 8 - inputLineOffset; } } else if(ChromaSampling == JPEG_422_SUBSAMPLING) { cssMode = DMA2D_CSS_422; inputLineOffset = xsize % 16; if(inputLineOffset != 0) { inputLineOffset = 16 - inputLineOffset; } } /* 輸出地址,特別注意末尾乘以2的對RGB565,如果輸出格式是ARGB8888,需要乘以4 */ destination = (uint32_t)pDst + ((y * g_LcdWidth) + x) * 2; /* DMA2D採用存儲器到存儲器模式,並且執行FPC顏色格式轉換, 這種模式是前景層作爲DMA2D輸入 */ DMA2D->CR = 0x00010000UL | (1 << 9); DMA2D->OOR = g_LcdWidth - xsize; /* 輸出格式 */ DMA2D->OPFCCR = PixelFormat | (DMA2D_REGULAR_ALPHA << 20) | (DMA2D_RB_REGULAR << 21); /* 前景層輸入格式 */ DMA2D->FGPFCCR = DMA2D_INPUT_YCBCR | (DMA2D_REPLACE_ALPHA << 16) | (DMA2D_REGULAR_ALPHA << 20) | (DMA2D_RB_REGULAR << 21) | (0xFFU << 24) | (cssMode << 18); DMA2D->FGOR = inputLineOffset; DMA2D->NLR = (uint32_t)(xsize << 16) | (uint16_t)ysize; DMA2D->OMAR = (uint32_t)destination; DMA2D->FGMAR = (uint32_t)pSrc; /* 啓動傳輸 */ DMA2D->CR |= DMA2D_CR_START; /* 等待DMA2D傳輸完成 */ while (DMA2D->CR & DMA2D_CR_START) {}
}