zoukankan      html  css  js  c++  java
  • 基于RT1052 Aworks 测试PXP图像混合功能(十三)

    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发

    做了这么长的开发以来,从来没有使用过GPU2D,GPU3G进行编程。这次评估RT1052 PXP的图像混合功能,记录了本次的开发日记。

    1. 首先阅读芯片手册

    在这里插入图片描述

    说一下本人粗看该章节之后的感想,很少会极其详细查看芯片的手册,只要在遇到难以解决的问题时,才会详细看芯片手册,但是有一点就是模块的内部架构及相关参数还是要大体了解的,其实和编程接口是相关的,如果不了解这些信息的话,虽然会使用API进行编程,但是实际一旦遇到问题是缺少理论支撑,排查问题就会难一些。

    2. 设备宏开关

    在前面支持LCD的章节当中,其实PXP的设备宏开关就一起打开了。我们只要先把样例跑起来,就可以两个图像混合评估,即一秒内能做多少次两个满屏图像的混合。
    在这里插入图片描述

    3. 测试

    在目录examplesperipheralm105xpxpdemo_pxp_blend.c 为默认支持RGB565的样例。把相关input/output参数改为支持RGB24的即可,需要注意的话,对于PXP模块所需要input数据源为RGBA,它需要的时32位的数据,这个是需要注意的地方,否则会产生异常。

    4. 总结

    PXP输入、输出的数据源格式是最重要的,否则花屏,闪屏的现象会出现。希望大家别踏坑。本人设置的输入数据源为RGBA,输出为RGB.如下为笔者的测试代码。

    /*******************************************************************************
    *                                  AWorks
    *                       ----------------------------
    *                       innovating embedded platform
    *
    * Copyright (c) 2001-2017 Guangzhou ZHIYUAN Electronics Co., Ltd.
    * All rights reserved.
    *
    * Contact information:
    * web site:    http://www.zlg.cn
    * e-mail:      support@zlg.cn
    *******************************************************************************/
    
    /**
     * file
     * rief PXP像素处理例程
     *
     * - 操作步骤:
     *   1. 本例程需在aw_prj_params.h头文件里使能
     *      - 显示屏设备宏
     *      - 如果使用800 X 480显示屏,打开TEST_SCREEN_BIG,否则打开TEST_SCREEN_LITTER;
     *   2. 连接串口设备
     *
     * - 实验现象:
     *   1.蓝色矩形和黄色矩形在屏幕上移动,交汇界面为白色。
     */
    
    #include <stdio.h>
    #include <string.h>
    #include "aworks.h"
    #include "aw_delay.h"
    #include "aw_vdebug.h"
    #include "aw_fb.h"
    #include "aw_demo_config.h"
    #include "aw_cache.h"
    #include "aw_mem.h"
    #include "driver/pxp/awbl_imx1050_pxp.h"
    
    typedef struct pixel_24bpp {
      uint8_t b;
      uint8_t g;
      uint8_t r;
    	uint8_t a;
    } pixel_24bpp_t;
    
    //#define TEST_SCREEN_BIG             /*800 X 480显示屏*/
    #define TEST_SCREEN_LITTER          /*480 X 1920显示屏*/
    
    #ifdef TEST_SCREEN_BIG
    #define __APP_IMG_HEIGHT  480
    #define __APP_IMG_WIDTH   800
    #else
    #define __APP_IMG_HEIGHT  1920
    #define __APP_IMG_WIDTH   480
    #endif
    
    /* 定义全局的 frame buffer 设备 */
    static aw_fb_fix_info_t __fix_screen_info;
    static aw_fb_var_info_t __var_info;
    
    static uint8_t  *__gp_ps_buf;
    static uint8_t  *__gp_as_buf;
    
    /* PXP 输出 buffer 配置. */
    static pxp_output_buffer_config_t __g_output_buffer_config;
    
    /*像素深度*/
    #define __APP_BPP         3
    
    #define __APP_PS_WIDTH    (__APP_IMG_WIDTH  / 2)
    #define __APP_PS_HEIGHT   (__APP_IMG_HEIGHT / 2)
    
    #define __APP_AS_WIDTH    (__APP_IMG_WIDTH  / 2)
    #define __APP_AS_HEIGHT   (__APP_IMG_HEIGHT / 2)
    
    #define __APP_PS_ULC_X    ((__APP_IMG_WIDTH  / 2) - (__APP_PS_SIZE / 2))
    #define __APP_PS_ULC_Y    ((__APP_IMG_HEIGHT / 2) - (__APP_PS_SIZE / 2))
    #define __APP_PS_LRC_X    ((__APP_IMG_WIDTH  / 2) + (__APP_PS_SIZE / 2) - 1)
    
    static aw_err_t __fb_init (void)
    {
        void * p_fb = aw_fb_open(DE_FB, 0);
        if (p_fb == NULL) {
            aw_kprintf("open fb fail.
    ");
            return -AW_ERROR;
        }
    
        /* frame buffer 初始化 */
        aw_fb_init(p_fb);
    
        /*frame buffer 设备信息货物*/
        aw_fb_ioctl(p_fb, AW_FB_CMD_GET_FINFO, &__fix_screen_info);
        aw_fb_ioctl(p_fb, AW_FB_CMD_GET_VINFO, &__var_info);
        /* 设置背光亮度 */
        aw_fb_backlight(p_fb, 99);
        aw_fb_start(p_fb);
        /* 初始化屏幕背景色(白色) */
        memset((void *)__fix_screen_info.vram_addr, 
               0xFF,
               __var_info.buffer.buffer_size * __var_info.buffer.buffer_num);
    
        return AW_OK;
    }
    
    
    static void __as_ps_buf_init (void)
    {
        uint32_t i, j;
        pixel_24bpp_t *ps_buf = (pixel_24bpp_t *)__gp_ps_buf;
        pixel_24bpp_t *as_buf = (pixel_24bpp_t *)__gp_as_buf;
    
        /* The PS buffer is BLUE rectangle, the AS buffer is YELLOW rectangle. */
        for (i = 0; i < __APP_PS_HEIGHT; i++) {
            for (j = 0; j < __APP_PS_WIDTH; j++) {
                ps_buf[i * __APP_PS_WIDTH +  j].b = 0xFF;
    					  ps_buf[i * __APP_PS_WIDTH +  j].g = 0x00;
    					  ps_buf[i * __APP_PS_WIDTH +  j].r = 0x00;
            }
        }
    
        for (i = 0; i < __APP_AS_HEIGHT; i++) {
            for (j = 0; j < __APP_AS_WIDTH; j++) {
                as_buf[i * __APP_AS_WIDTH +  j].b = 0x00;
    					  as_buf[i * __APP_AS_WIDTH +  j].g = 0xFF;
    					  as_buf[i * __APP_AS_WIDTH +  j].r = 0xFF;
            }
        }
    
    }
    
    
    static void __app_pxp_config (void)
    {
        /* PS configure. */
        const pxp_ps_buffer_config_t ps_buffer_config = {
            .pixel_format   = kPXP_PsPixelFormatRGB888,
            .swap_byte      = 0,
            .buffer_addr    = (uint32_t)__gp_ps_buf,
            .buffer_addr_u  = 0,
            .buffer_addr_v  = 0,
            .pitch_bytes    = __APP_PS_WIDTH * __APP_BPP,
        };
    
        /* 复位PXP */
        pxp_hard_reset();
    
        /* 设置PS背景颜色 */
        pxp_set_process_surface_back_ground_color(0x00);
    
        /* 配置PS buffer */
        pxp_set_process_surface_buffer_config(&ps_buffer_config);
    
        /* AS config. */
        const pxp_as_buffer_config_t as_buffer_config = {
            .pixel_format = kPXP_AsPixelFormatRGB888,
            .buffer_addr  = (uint32_t)__gp_as_buf,
            .pitch_bytes  = __APP_AS_WIDTH * __APP_BPP,
        };
    
        /*配置AS buffer*/
        pxp_set_alpha_surface_buffer_config(&as_buffer_config);
    
        /*AS blend config*/
        const pxp_as_blend_config_t as_blend_config = {
            .alpha          = 0,
            .invert_alpha   = 0,
            .alpha_mode     = kPXP_AlphaRop,
            .rop_mode       = kPXP_RopMergeAs
        };
    
        /*设置AS blend*/
        pxp_set_alpha_surface_blend_config(&as_blend_config);
    
        /* Output config. */
        __g_output_buffer_config.pixel_format    = kPXP_OutputPixelFormatRGB888P;
        __g_output_buffer_config.interlaced_mode = kPXP_OutputProgressive;
        __g_output_buffer_config.buffer0_addr    = (uint32_t)__fix_screen_info.vram_addr;
        __g_output_buffer_config.buffer1_addr    = 0;
        __g_output_buffer_config.pitch_bytes     = __APP_IMG_WIDTH * 3;
        __g_output_buffer_config.width           = __APP_IMG_WIDTH;
        __g_output_buffer_config.height          = __APP_IMG_HEIGHT;
    
        /*配置输出pxp buffer*/
        pxp_set_output_buffer_config(&__g_output_buffer_config);
    
        /* 禁能 CSC1 */
        pxp_enable_csc1(0);
    }
    
    
    
    static void __app_blend (void)
    {
        uint8_t buf_index = 0U;
    
        /*a pointer to a array*/
        uint8_t (*p_vddr)[__APP_IMG_WIDTH * __APP_IMG_HEIGHT * __APP_BPP] = NULL;
    
        int8_t ps_inc_x = 1;
        int8_t ps_inc_y = 1;
        int8_t as_inc_x = -1;
        int8_t as_inc_y = -1;
        uint16_t ps_ulc_x = 0U;
        uint16_t ps_ulc_y = 0U;
        uint16_t as_ulc_x = __APP_IMG_WIDTH - __APP_AS_WIDTH;
        uint16_t as_ulc_y = __APP_IMG_HEIGHT - __APP_AS_HEIGHT;
        uint16_t ps_lrc_x, ps_lrc_y, as_lrc_x, as_lrc_y;
    
        ps_lrc_x = ps_ulc_x + __APP_PS_WIDTH - 1U;
        ps_lrc_y = ps_ulc_y + __APP_PS_HEIGHT - 1U;
        as_lrc_x = as_ulc_x + __APP_AS_WIDTH - 1U;
        as_lrc_y = as_ulc_y + __APP_AS_HEIGHT - 1U;
    
        p_vddr = (void *)__fix_screen_info.vram_addr;
    
        while (1) {
    
            /*将buffer放入缓存中*/
            aw_cache_flush((void *)__gp_ps_buf, __APP_PS_HEIGHT *  __APP_PS_WIDTH * __APP_BPP);
            aw_cache_flush((void *)__gp_as_buf, __APP_AS_HEIGHT *  __APP_AS_WIDTH * __APP_BPP);
    
            /*PS图形位置*/
            pxp_set_process_surface_position(ps_ulc_x, ps_ulc_y, ps_lrc_x, ps_lrc_y);
    
            /*AS图形位置*/
            pxp_set_alpha_surface_position(as_ulc_x, as_ulc_y, as_lrc_x, as_lrc_y);
    
            /*配置输出buffer的显存地址*/
            __g_output_buffer_config.buffer0_addr = (uint32_t)p_vddr[buf_index];
            pxp_set_output_buffer_config(&__g_output_buffer_config);
    
            /* Start PXP. */
            pxp_start();
    
            /* 等待PXP图形处理完成 */
            pxp_complete_status_sync();
    
            /*清空缓存中的buffer*/
            aw_cache_invalidate((void *)__gp_ps_buf, __APP_PS_HEIGHT *  __APP_PS_WIDTH * __APP_BPP);
            aw_cache_invalidate((void *)__gp_as_buf, __APP_AS_HEIGHT *  __APP_AS_WIDTH * __APP_BPP);
    
            aw_cache_flush(
                (void*)p_vddr[buf_index],
                __var_info.buffer.buffer_size * __var_info.buffer.buffer_num);
    
            /*切换显存*/
            buf_index++;
            if (buf_index >= __var_info.buffer.buffer_num) {
                buf_index = 0;
            }
    
            ps_lrc_x += ps_inc_x;
            ps_lrc_y += ps_inc_y;
            as_lrc_x += as_inc_x;
            as_lrc_y += as_inc_y;
    
            ps_ulc_x += ps_inc_x;
            ps_ulc_y += ps_inc_y;
            as_ulc_x += as_inc_x;
            as_ulc_y += as_inc_y;
    
            if (0 == as_ulc_x) {
                as_inc_x = 1;
            } else if (__APP_IMG_WIDTH - 1 == as_lrc_x) {
                as_inc_x = -1;
            }
    
            if (0 == as_ulc_y) {
                as_inc_y = 1;
            } else if (__APP_IMG_HEIGHT - 1 == as_lrc_y) {
                as_inc_y = -1;
            }
    
            if (0 == ps_ulc_x) {
                ps_inc_x = 1;
            } else if (__APP_IMG_WIDTH - 1 == ps_lrc_x) {
                ps_inc_x = -1;
            }
    
            if (0 == ps_ulc_y) {
                ps_inc_y = 1;
            } else if (__APP_IMG_HEIGHT - 1 == ps_lrc_y) {
                ps_inc_y = -1;
            }
            aw_mdelay(50);
        }
    }
    
    
    void demo_pxp_blend (void)
    {
        /* 初始化fram buffer */
        aw_err_t ret = __fb_init();
        if(ret != AW_OK){
            aw_kprintf("fb init fail.
    ");
            return;
        }
        extern void lt9211_init();
    		lt9211_init();
        __gp_ps_buf = (uint8_t *) aw_mem_align(__APP_PS_WIDTH * __APP_PS_HEIGHT * __APP_BPP,
                                               AW_CACHE_LINE_SIZE);
        __gp_as_buf = (uint8_t *) aw_mem_align(__APP_AS_WIDTH * __APP_AS_HEIGHT * __APP_BPP,
                                               AW_CACHE_LINE_SIZE);
        if (NULL == __gp_ps_buf || __gp_as_buf == NULL) {
            aw_kprintf("aw_mem_align error.
    ");
            return ;
        }
    
        /* 初始化buffer */
        __as_ps_buf_init();
    
        /* 配置pxp */
        __app_pxp_config();
    
        /* blend测试 */
        __app_blend();
    
        aw_mem_free(__gp_ps_buf);
        aw_mem_free(__gp_as_buf);
    }
    
    /* end of file */
    
    
    
  • 相关阅读:
    iOS 获取项目名称及版本号
    Xcode 使用自定义字体
    自己制作精美的App Store 软件截屏
    iOS 数据持久性存储-对象归档
    iOS 数据持久性存储-属性列表
    好长时间没回来了,回归本位!
    VBA删除表格最后一行
    VBA表格单元格替换文字
    VBA添加表格
    oracle语句
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/15169476.html
Copyright © 2011-2022 走看看