查看: 5212|回复: 0

[原创] 【野火i.MX RT1052】9.i.Maxrt1052之2D图形处理器pxp

[复制链接]
  • TA的每日心情
    擦汗
    2019-6-26 20:59
  • 签到天数: 235 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2018-6-16 13:10:46 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 小马哥-1650185 于 2018-6-16 16:37 编辑

         PXP 是 NXP 设计的一种高性能的 2D 图形处理微构架。用于图像数据发送到 LCD 或者 TV编码器之前的数据处理,例如图像缩放、旋转等。为无 SDRAM 和基于 SRAM 的系统提供占用内存最小的图像数据优化和性能。
        PXP 能将以下内容组合到一个处理引擎中:
    -图像缩放;
    -图像色彩转换;
    -图像旋转;
    -alpha 混合;
    -颜色键算法;
    -像素校正。
     PXP 由多个流水线块组成,共同完成复杂算法或组合操作。

    PXP结构图
    QQ截图20180616161027.jpg


    配置步骤
     选择 PXP 时钟源,配置时钟频率;
     使能 PXP 时钟;
     复位 PXP 外设;
     根据要操作的具体内容配置 PXP 相应控制寄存器;
     设置输入缓冲区配置,包括输入像素格式,输入缓冲区地址等;
     设置输出缓冲区配置,包括输出像素格式,输出模式等;
     如果使用中断需要置位相应中断位,并使能中断号;
     若对中断优先级有要求,配置中断优先级;
     填充要进行数据处理的缓冲数据区;
        将数据区的地址填入 PXP 相应寄存器;
     使能 PXP 进行数据处理。

    官方sdk有如下几个demo

    QQ截图20180616163404.jpg
    气质:
        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 开发板,一个三色的正方形大小在有规律的改变。


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 13:57 , Processed in 0.118965 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.