与非网论坛

标题: 【野火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,
  1. void LCD_PXP_Config(void)
  2. {
  3.     PXP_Init(APP_PXP);

  4.     /* PS configure. */
  5.     const pxp_ps_buffer_config_t psBufferConfig = {
  6.         .pixelFormat = kPXP_PsPixelFormatRGB888,
  7.         .swapByte = false,
  8.         .bufferAddr = (uint32_t)s_psBufferPxp,
  9.         .bufferAddrU = 0U,
  10.         .bufferAddrV = 0U,
  11.         .pitchBytes = APP_PS_SIZE * APP_BPP,
  12.     };

  13.     PXP_SetProcessSurfaceBackGroundColor(APP_PXP, 0U);

  14.     PXP_SetProcessSurfaceBufferConfig(APP_PXP, &psBufferConfig);

  15.     /* Disable AS. */
  16.     PXP_SetAlphaSurfacePosition(APP_PXP, 0xFFFFU, 0xFFFFU, 0U, 0U);

  17.     /* Output config. */
  18.     outputBufferConfig.pixelFormat = kPXP_OutputPixelFormatRGB888;
  19.     outputBufferConfig.interlacedMode = kPXP_OutputProgressive;
  20.     outputBufferConfig.buffer0Addr = (uint32_t)s_frameBuffer[0];
  21.     outputBufferConfig.buffer1Addr = 0U;
  22.     outputBufferConfig.pitchBytes = APP_IMG_WIDTH * APP_BPP;
  23.     outputBufferConfig.width = APP_IMG_WIDTH;
  24.     outputBufferConfig.height = APP_IMG_HEIGHT;

  25.     PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);

  26.     /* Disable CSC1, it is enabled by default. */
  27.     PXP_EnableCsc1(APP_PXP, false);
  28. }
复制代码
图像缩放的显示

  1. void APP_Scale(void)
  2. {
  3.     uint8_t curLcdBufferIdx = 1U;

  4.     float downScaleStart = 0.5f;
  5.     float downScaleEnd = 4.0f;
  6.     float downScaleStep = 1.01f;
  7.     float downScaleFact;
  8.     uint16_t outputWidth, outputHeight;

  9.     for (;;)
  10.     {
  11.         for (downScaleFact = downScaleStart; downScaleFact <= downScaleEnd; downScaleFact *= downScaleStep)
  12.         {
  13.             outputWidth = (uint16_t)((float)APP_PS_SIZE / downScaleFact);
  14.             outputHeight = (uint16_t)((float)APP_PS_SIZE / downScaleFact);

  15.             /* Prepare next buffer for LCD. */
  16.             PXP_SetProcessSurfaceScaler(APP_PXP, APP_PS_SIZE, APP_PS_SIZE, outputWidth, outputHeight);
  17.             PXP_SetProcessSurfacePosition(APP_PXP, APP_PS_ULC_X, APP_PS_ULC_Y, APP_PS_ULC_X + outputWidth - 1U,
  18.                                           APP_PS_ULC_Y + outputHeight - 1U);

  19.             outputBufferConfig.buffer0Addr = (uint32_t)s_frameBuffer[curLcdBufferIdx];

  20.             PXP_SetOutputBufferConfig(APP_PXP, &outputBufferConfig);

  21.             PXP_Start(APP_PXP);

  22.             /* Wait for process complete. */
  23.             while (!(kPXP_CompleteFlag & PXP_GetStatusFlags(APP_PXP)))
  24.             {
  25.             }

  26.             PXP_ClearStatusFlags(APP_PXP, kPXP_CompleteFlag);

  27.             /* Now new frame is ready, pass it to LCDIF. */
  28.             ELCDIF_SetNextBufferAddr(APP_ELCDIF, (uint32_t)s_frameBuffer[curLcdBufferIdx]);

  29.             /*
  30.              * The new frame is not loaded untill current frame display finished. So
  31.              * wait until current frame finished.
  32.              */
  33.             ELCDIF_ClearInterruptStatus(APP_ELCDIF, kELCDIF_CurFrameDone);
  34.             while (!(kELCDIF_CurFrameDone & ELCDIF_GetInterruptStatus(APP_ELCDIF)))
  35.             {
  36.             }

  37.             /* Switch to the other LCD buffer. */
  38.             curLcdBufferIdx ^= 1U;
  39.         }
  40.     }
  41. }
复制代码

在主函数中,

  1.     /* 初始化LED */
  2.     LED_GPIO_Config();
  3.    
  4.     /* 初始化LCD */
  5.     LCD_Init(LCD_INTERRUPT_DISABLE);
  6.    
  7.     RGB_LED_COLOR_BLUE;

  8.     LCD_PXP_Config();
  9.    
  10.     LCD_Test();

  11.     APP_Scale();
复制代码

正常情况下,按照例程中的说明文档连接好 LCD 之后,编译下载PXP 例程到 RT1052 开发板,一个三色的正方形大小在有规律的改变。







欢迎光临 与非网论坛 (https://www.eefocus.com/forum/) Powered by Discuz! X3.5