高级会员

- 积分
- 713
- 金钱
- 713
- 注册时间
- 2016-6-29
- 在线时间
- 165 小时
|
1金钱
其他地方不动,我如何在这个函数中旋转RGB屏的方向呢,求问
- //对于RGB屏,且是横屏模式,则可以利用DMA2D,直接将JPEG解码的YUV数据转换成RGB数据,
- //并填充到对应的GRAM里面,所有操作全硬件完成,速度非常快.
- //sx,sy:起始坐标
- //tjpeg:jpeg解码结构体
- void mjpeg_ltdc_dma2d_yuv2rgb_fill(u16 sx,u16 sy,jpeg_codec_typedef *tjpeg)
- {
- u32 timeout=0;
- u16 offline;
- u32 addr;
- u32 regval=0;
- u32 cm=0; //采样方式
- if(tjpeg->Conf.ChromaSubsampling==JPEG_420_SUBSAMPLING)cm=DMA2D_CSS_420; //YUV420转RGB
- if(tjpeg->Conf.ChromaSubsampling==JPEG_422_SUBSAMPLING)cm=DMA2D_CSS_422; //YUV422转RGB
- else if(tjpeg->Conf.ChromaSubsampling==JPEG_444_SUBSAMPLING)cm=DMA2D_NO_CSS;//YUV444转RGB
- offline=lcdltdc.pwidth-tjpeg->Conf.ImageWidth;
- addr=((u32)ltdc_framebuf[lcdltdc.activelayer]+lcdltdc.pwidth*(lcdltdc.pixsize*sy+sx));
- RCC->AHB3ENR|=1<<4; //使能DMA2D时钟
- RCC->AHB3RSTR|=1<<4; //复位DMA2D
- RCC->AHB3RSTR&=~(1<<4); //结束复位
- DMA2D->CR&=~(1<<0); //先停止DMA2D
- DMA2D->CR=1<<16; //MODE[1:0]=01,存储器到存储器,带PFC模式
- DMA2D->OPFCCR=0<<0; //CM[2:0]=010,输出为RGB565格式
- DMA2D->OOR=offline; //设置行偏移
- DMA2D->IFCR|=1<<1; //清除传输完成标志
- regval=11<<0; //CM[3:0]=1011,输入数据为YCbCr格式
- regval|=cm<<18; //CSS[1:0]=cm,Chroma Sub-Sampling:0,4:4:4;1,4:2:2;2,4:2:0
- DMA2D->FGPFCCR=regval; //设置FGPCCR寄存器
- DMA2D->FGOR=0; //前景层行偏移为0
- DMA2D->NLR=tjpeg->yuvblk_height|(tjpeg->Conf.ImageWidth<<16); //设定行数寄存器
- DMA2D->OMAR=addr; //输出存储器地址
- DMA2D->FGMAR=(u32)tjpeg->outbuf[tjpeg->outbuf_read_ptr].buf; //源地址
- DMA2D->CR|=1<<0; //启动DMA2D
- while((DMA2D->ISR&(1<<1))==0) //等待传输完成
- {
- timeout++;
- if(timeout>0X1FFFFFF)break; //超时退出
- }
- tjpeg->yuvblk_curheight+=tjpeg->yuvblk_height; //偏移到下一个内存地址
- //YUV2RGB转码结束后,再复位一次DMA2D
- RCC->AHB3RSTR|=1<<4; //复位DMA2D
- RCC->AHB3RSTR&=~(1<<4); //结束复位
- }
复制代码
|
|