高级会员

- 积分
- 708
- 金钱
- 708
- 注册时间
- 2014-7-2
- 在线时间
- 137 小时
|
void LCD_CopyBuffer_YCbCr_To_RGB(uint32_t *pSrc, uint16_t x, uint16_t y,uint16_t xsize, uint16_t ysize,uint32_t ChromaSampling)
{
uint32_t psx,psy,xnum,ynum;
uint32_t cssMode = DMA2D_CSS_420;
uint32_t inputLineOffset = 0;
uint32_t destination;
uint32_t regValue, regMask;
uint32_t timeout=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;
}
}
destination = ((u32)ltdc_framebuf[lcdltdc.activelayer] + lcdltdc.pixsize*(lcdltdc.pwidth*y + x));
regValue = DMA2D_INPUT_YCBCR | (DMA2D_REPLACE_ALPHA << 16) | \
(DMA2D_REGULAR_ALPHA << 20)| \
(DMA2D_RB_REGULAR << 21) | \
(0xFFU << 24) | \
(cssMode << 18);
regMask = DMA2D_BGPFCCR_CM | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_ALPHA | DMA2D_BGPFCCR_AI | DMA2D_BGPFCCR_RBS | DMA2D_FGPFCCR_CSS;
RCC->AHB1ENR |= 1<<23; //使能DM2D时钟
DMA2D->CR = 1<<16; //Memory-to-memory with PFC
DMA2D->OPFCCR = DMA2D_OUTPUT_RGB565; //色彩
DMA2D->OOR = lcdltdc.pwidth - xsize; //行偏移量
DMA2D->OPFCCR |= (DMA2D_REGULAR_ALPHA << 20); //常规混合
DMA2D->OPFCCR |= (DMA2D_RB_REGULAR << 21); //Regular mode (RGB or ARGB)
DMA2D->FGPFCCR |= (regMask & regValue); //前景PFC控制
DMA2D->FGOR = inputLineOffset; //前景抵消
DMA2D->NLR = (uint32_t)(xsize << 16) | (uint16_t)ysize; //行和列
DMA2D->OMAR = (uint32_t)destination; //显示位置
DMA2D->FGMAR = (uint32_t)pSrc;
DMA2D->CR |= 1<<0; //启动DMA2D
while((DMA2D->ISR&(1<<1))==0) //等待传输完成
{
timeout++;
if(timeout>0X1FFFFF)break; //超时退出
}
DMA2D->IFCR|=1<<1; //清除传输完成标志
} |
|