与非网论坛
标题:
【野火i.MX RT1052】9.i.Maxrt1052之2D图形处理器pxp
[打印本页]
作者:
小马哥-1650185
时间:
2018-6-16 13:10
标题:
【野火i.MX RT1052】9.i.Maxrt1052之2D图形处理器pxp
本帖最后由 小马哥-1650185 于 2018-6-16 16:37 编辑
PXP 是 NXP 设计的一种高性能的 2D 图形处理微构架。用于图像数据发送到 LCD 或者 TV编码器之前的数据处理,例如图像缩放、旋转等。为无 SDRAM 和基于 SRAM 的系统提供占用内存最小的图像数据优化和性能。
PXP 能将以下内容组合到一个处理引擎中:
-图像缩放;
-图像色彩转换;
-图像旋转;
-alpha 混合;
-颜色键算法;
-像素校正。
PXP 由多个流水线块组成,共同完成复杂算法或组合操作。
PXP结构图
(, 下载次数: 51)
上传
点击文件名下载附件
配置步骤
选择 PXP 时钟源,配置时钟频率;
使能 PXP 时钟;
复位 PXP 外设;
根据要操作的具体内容配置 PXP 相应控制寄存器;
设置输入缓冲区配置,包括输入像素格式,输入缓冲区地址等;
设置输出缓冲区配置,包括输出像素格式,输出模式等;
如果使用中断需要置位相应中断位,并使能中断号;
若对中断优先级有要求,配置中断优先级;
填充要进行数据处理的缓冲数据区;
将数据区的地址填入 PXP 相应寄存器;
使能 PXP 进行数据处理。
官方sdk有如下几个demo
(, 下载次数: 45)
上传
点击文件名下载附件
气质:
blend:利用 PXP 进行图形混合操作;
flip: 利用 PXP 进行图形翻转操作;
queue:利用 PXP 命令队列进行图形翻转操作;
rotate:利用 PXP 进行图形旋转操作;
scale:利用 PXP 进行图形缩放操作;
通过调用官方库 #include "fsl_pxp.h"配置pxp,
void LCD_PXP_Config(void)
{
PXP_Init(APP_PXP);
/* PS configure. */
const pxp_ps_buffer_config_t psBufferConfig = {
.pixelFormat = kPXP_PsPixelFormatRGB888,
.swapByte = false,
.bufferAddr = (uint32_t)s_psBufferPxp,
.bufferAddrU = 0U,
.bufferAddrV = 0U,
.pitchBytes = APP_PS_SIZE * APP_BPP,
};
PXP_SetProcessSurfaceBackGroundColor(APP_PXP, 0U);
PXP_SetProcessSurfaceBufferConfig(APP_PXP, &psBufferConfig);
/* Disable AS. */
PXP_SetAlphaSurfacePosition(APP_PXP, 0xFFFFU, 0xFFFFU, 0U, 0U);
/* Output config. */
outputBufferConfig.pixelFormat = kPXP_OutputPixelFormatRGB888;
outputBufferConfig.interlacedMode = kPXP_OutputProgressive;
outputBufferConfig.buffer0Addr = (uint32_t)s_frameBuffer[0];
outputBufferConfig.buffer1Addr = 0U;
outputBufferConfig.pitchBytes = APP_IMG_WIDTH * APP_BPP;
outputBufferConfig.width = APP_IMG_WIDTH;
outputBufferConfig.height = APP_IMG_HEIGHT;
PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);
/* Disable CSC1, it is enabled by default. */
PXP_EnableCsc1(APP_PXP, false);
}
复制代码
图像缩放的显示
void APP_Scale(void)
{
uint8_t curLcdBufferIdx = 1U;
float downScaleStart = 0.5f;
float downScaleEnd = 4.0f;
float downScaleStep = 1.01f;
float downScaleFact;
uint16_t outputWidth, outputHeight;
for (;;)
{
for (downScaleFact = downScaleStart; downScaleFact <= downScaleEnd; downScaleFact *= downScaleStep)
{
outputWidth = (uint16_t)((float)APP_PS_SIZE / downScaleFact);
outputHeight = (uint16_t)((float)APP_PS_SIZE / downScaleFact);
/* Prepare next buffer for LCD. */
PXP_SetProcessSurfaceScaler(APP_PXP, APP_PS_SIZE, APP_PS_SIZE, outputWidth, outputHeight);
PXP_SetProcessSurfacePosition(APP_PXP, APP_PS_ULC_X, APP_PS_ULC_Y, APP_PS_ULC_X + outputWidth - 1U,
APP_PS_ULC_Y + outputHeight - 1U);
outputBufferConfig.buffer0Addr = (uint32_t)s_frameBuffer[curLcdBufferIdx];
PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);
PXP_Start(APP_PXP);
/* Wait for process complete. */
while (!(kPXP_CompleteFlag & PXP_GetStatusFlags(APP_PXP)))
{
}
PXP_ClearStatusFlags(APP_PXP, kPXP_CompleteFlag);
/* Now new frame is ready, pass it to LCDIF. */
ELCDIF_SetNextBufferAddr(APP_ELCDIF, (uint32_t)s_frameBuffer[curLcdBufferIdx]);
/*
* The new frame is not loaded untill current frame display finished. So
* wait until current frame finished.
*/
ELCDIF_ClearInterruptStatus(APP_ELCDIF, kELCDIF_CurFrameDone);
while (!(kELCDIF_CurFrameDone & ELCDIF_GetInterruptStatus(APP_ELCDIF)))
{
}
/* Switch to the other LCD buffer. */
curLcdBufferIdx ^= 1U;
}
}
}
复制代码
在主函数中,
/* 初始化LED */
LED_GPIO_Config();
/* 初始化LCD */
LCD_Init(LCD_INTERRUPT_DISABLE);
RGB_LED_COLOR_BLUE;
LCD_PXP_Config();
LCD_Test();
APP_Scale();
复制代码
正常情况下,按照例程中的说明文档连接好 LCD 之后,编译下载PXP 例程到 RT1052 开发板,一个三色的正方形大小在有规律的改变。
欢迎光临 与非网论坛 (https://www.eefocus.com/forum/)
Powered by Discuz! X3.5