向各位大侠前辈请教一个有关640*480的BMP图片显示问题(已经转换成640*480*3的数据),经过PIXC的处理,然后由 PPI驱动到 外部640*480 24bit TFT屏。到底图片是如何被显示的。我的想法是
合成器主要代码如下:
ADI_DEV_HANDLE Pixc_Handle;
ADI_DEV_2D_BUFFER InmainBufPixc,OvrABufPixc, OvrBBuf
Pixc , OutBuf
Pixc;
ADI_DEV_BUFFER_PAIR PixInputBufs[] = { {ADI_DEV_2D, (ADI_DEV_BUFFER*)&InmainBufPixc},
{ADI_DEV_2D, (ADI_DEV_BUFFER*)&
OvrABufPixc },
{ADI_DEV_BUFFER_END, 0}};
static void PixCallback { .. .. .. }
void PixcConfig()
{
ADI_PIXC_CONVERSION_MODE PixcMode;
u32 Result;
do{
if(Result = adi_dev_open(..省略非重要 ^_^ ) != ADI_DEV_RESULT_SUCCESS)
{ printf(".....")
}
}
ADI_DEV_CMD_VALUE_PAIR PixcCFG[] =
{
ADI_DEV_CMD_SET_DATEFLOW_METHOD, ADI_DEV_MODE_CHAINED; //数据流形式
..省略非重要 ^_^
}
PixcMode.InputFrame = ADI_PIXC_FRAME_RGB888;
PixcMode.OvrAFrame = ADI_PIXC_FRAME_RGB888;
PixcMode.OvrBFrame = ADI_PIXC_FRAME_RGB888;
PixcMode.OutPutFrame= ADI_PIXC_FRAME_RGB888;
if(Result = adi_dev_control(Pixc_Handle, ADI_DEV_CMD_TABLE, (void*)PixcCFG) != ...)
{ printf(".....") }
if(Result = adi_dev_control(Pixc_Handle, ADI_DEV_CMD_ENABLE_ITU656_SUPPORT, (void*)FALSE) != ...)
{ printf(".....") } //
InMainBufPixc.Date = pInMainFrame;
InMainBufPixc.ElementWidth = 4; //DMA数据通道为 32bit
InMainBufPixc.Xcount = 640/4; //一行640个像素/宽4字节 = 160次
InMainBufPixc.Xmodify = 4;
InMainBufPixc.Ycount = 480; //行数 这里不除4
InMainBufPixc.Ymodify = 4;
InMainBufPixc.CallbackParameter = NULL;
InMainBufPixc.pNext = NULL; //请教? 这里的意思是否是 背景图无需更换吗? 如果我有2个以上背景图互相切换,那么就需要指向下一张图吗?
OvrABufPixc.Date = pOvrAFrame;
OvrABufPixc.ElementWidth = 4; //DMA数据通道为 32bit
OvrABufPixc.Xcount = 200/4; //Overlay A的 尺寸为 200 * 108
OvrABufPixc.Xmodify = 4;
OvrABufPixc.Ycount = 108; //行数 这里不除4
OvrABufPixc.Ymodify = 4;
OvrABufPixc.CallbackParameter = NULL;
OvrABufPixc.pNext = &OvrBBufPixc; // 为何指向 overlay B ?
OvrBBufPixc.Date = pOvrBFrame;
OvrBBufPixc.ElementWidth = 4; //DMA数据通道为 32bit
OvrBBufPixc.Xcount = 400/4; //Overlay A的 尺寸为 400 * 180
OvrBBufPixc.Xmodify = 4;
OvrBBufPixc.Ycount = 180;
OvrBBufPixc.Ymodify = 4;
OvrBBufPixc.CallbackParameter = NULL;
OvrBBufPixc.pNext =
NULL ;
OutBufferPixc.Date = pPixcOutFrame;
OutBufferPixc.ElementWidth = 4;
OutBufferPixc.Xcount = 640/4; //输出 640*480分辨率图片
OutBufferPixc.Xmodify = 4;
OutBufferPixc.Ycount = 480;
OutBufferPixc.Ymodify = 4;
OutBufferPixc.CallbackParameter = &OutBufferPixc; // ??
OvrBBufPixc.pNext = NULL ;
if(Result = adi_dev_Write(Pixc_Handle, ADI_DEV_BUFFER_TABLE, (void*)
PixInputBufs) != ...)
{ printf(".....") } //请高手 求解释 这里 写进去的
if(Result = adi_dev_Read(Pixc_Handle, ADI_DEV_2D, (void*)OutBufferPixc) != ...)
{ printf(".....") } //请高手 求解释 这里
}while(0) ;
}
说明: pInMainFrame = InMainFrame[640*480*3]; //把背景图的数据放在这个数组里
pOvrAFrame = OvrAFrame[200*108*3] ; //Overlay A的图片信息
pOvrBFrame = OvrBFrame[400*180*3] ; //Overlay B的图片信息
pPixcOutFrame = PixcOutFrame[640*480*3];
void PixCallback( .... )
{
if(Result = adi_dev_control(PPI输出句柄,ADI_DEV_CMD_SET_DATAFLOW, (void*)TRUE) != ADI_DEV_RESULT_SUCCESS) //这里是启动PPI 将图片信息输出到 TFT屏的启动吧 ??!
{....}
}
主要疑问: 1. 这个PixCallBack 函数执行 是否会阻塞? 因为EPPI虽然是后台 DMA驱动TFT 但是也需要一些处理?
2. EPPI的函数 我等会贴上 在把问题反馈