衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

移植Arm-2D到i.MX RT1050-EVKB并繪制圖形界面

痞子衡嵌入式 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-07-12 10:05 ? 次閱讀

一、引言

眾所周知,i.MX RT系列是MCU中的性能強者,超高的主頻、豐富的外設以及足夠大的存儲使其能輕松應用于各類領(lǐng)域。其中,在圖像視頻方面,i.MX RT1050及以上系列,集成了PXP圖形加速器,可用于對LCD顯示之前的圖像進行處理。

i.MX RT1170更是集成了支持OpenVG的GPU2D模塊,可用于矢量繪圖等操作,還集成了兩類LCD控制器eLCDIF和LCDIFv2,并且在物理接口方面增加了MIPI DSI的支持。

不過強大的硬件支持不是今天文章的重點,今天來玩點“軟”的。

去年,Arm在其Github上發(fā)布了一個針對全體Cortex-M處理器的2D圖形加速庫——Arm-2D(暫定名)。在其Github倉庫的文檔中可以看出,Arm-2D致力于打造一層抽象層,為芯片供應廠商提供的硬件以及GUI廠商提供的圖形圖形庫之間的接口設立一層驅(qū)動標準。并且Arm-2D也提供了一系列的2D圖形加速API。

本文以移植Arm-2D到i.MX RT1050-EVKB并繪制一些圖形界面為例,動手部署。

二、準備工作

1. 工程下載

首先,我們需要獲取Arm-2D庫,打開其官方github倉庫:https://github.com/ARM-software/EndpointAI,可以看到有四個branch可以選擇,此處選擇developing分支(用于開發(fā)的分支,更新相對頻繁)。

下載到本地后,將Arm-2D目錄(EndpointAI-main-arm-2d-developingKernelsResearchArm-2D)拷貝到我們的目標工程目錄下,這里我們選擇i.MX RT1050的SDK中elcdif_rgb工程,以IAR工程為例。打開IAR工程,將”Arm-2D”下的”Helper”和”Library”全部文件添加到工程中。

42fb6578-011c-11ed-ba43-dac502259ad0.png

2. 環(huán)境配置

將”Arm-2D/Library/Include”和”Arm-2D/Helper/Include”添加到Include搜索路徑列表里,接著開始配置工程所需的選項。

在Arm-2D的官方介紹中,我們知道其依賴于CMSIS,并且需要CMSIS 5.7.0及以上的版本。

打開IAR的安裝位置,轉(zhuǎn)到armCMSIS位置下,點開readme_patch.txt查看是否是5.7.0及以上版本。若你的CMSIS版本為5.7.0以下,請下載新版本,以替換原CMSIS文件。

確定了足夠高的版本后,在工程配置中的”General Options-Library Configuration”中勾選上”USECMSIS”和”DSP Library”。

4310f8fc-011c-11ed-ba43-dac502259ad0.png

3.關(guān)鍵函數(shù)

Arm-2D只負責軟件層面的圖形操作,而硬件部分則需要我們自己實現(xiàn),所以此處我們選用SDK中,已經(jīng)實現(xiàn)好LCD初始化的elcdif_rgb工程進行部署。

我們所需要做的是,提供一個向LCD指定區(qū)域傳送位圖的函數(shù)。而i.MX RT1050自帶LCD控制器,則更方便實現(xiàn)所需的操作。

所需傳送位圖的函數(shù)如下:

/* i.MX RT1050-EVK */
#define GLCD_WIDTH     480
#define GLCD_HEIGHT    272

#define LCD_BASE_ADDR   0x81E00000  //m_ncache_start 
#define frame_buf         ((volatile uint16_t *)LCD_BASE_ADDR)

int32_t GLCD_DrawBitmap (uint32_t x, uint32_t y, uint32_t width, uint32_t height, const uint8_t *bitmap)
{
    volatile uint16_t *phwDes = frame_buf + y * GLCD_WIDTH + x;
    const uint16_t *phwSrc = (const uint16_t *)bitmap;
    for (int_fast16_t i = 0; i < height; i++) {
        memcpy ((uint16_t *)phwDes, phwSrc, width * 2);
        phwSrc += width;
        phwDes += GLCD_WIDTH;
    }
    return 0;    
}

以上可以直接用存儲器讀寫操作將需要傳送的位圖傳到LCD指定位置,其中顯示緩存的基地址是linker文件中的m_ncache_start。

參數(shù)‘x’和’y’描述需要在LCD中顯示的起始位置;參數(shù)’width’和’height’描述所傳位圖的尺寸;而參數(shù)’bitmap’則代表位圖數(shù)據(jù)。

三、圖形繪制

1. 畫第一個方塊

接下來嘗試利用Arm-2D進行圖形繪制了。

首先,原工程中保留硬件配置以及外設初始化的部分,將frameBuffer的操作去除。

接著,在需要用到Arm-2D的地方包含頭文件”arm_2d.h”,并在主函數(shù)中進行初始化,調(diào)用”arm_2d_init();”。此處,我們需要用到Arm-2D的PFB(partial framebuffer),在需要用到PFB Helper的地方包含”arm-2d_helper.h”,建立一個PFB對象并利用其進行我們所需圖像的構(gòu)建。

以下為PFB的初始化代碼:

static arm_2d_helper_pfb_t s_tExamplePFB;

    //! initialise FPB helper
    if (ARM_2D_HELPER_PFB_INIT( 
            &s_tExamplePFB,                 //!< FPB Helper object
            APP_IMG_WIDTH,                //!< screen width
            APP_IMG_HEIGHT,                //!< screen height
            uint16_t,                        //!< color date type
            PFB_BLOCK_WIDTH,               //!< PFB block width
            PFB_BLOCK_HEIGHT,              //!< PFB block height
            1,                              //!< number of PFB in the PFB pool
            {
                .evtOnLowLevelRendering = {
                    //! callback for low level rendering 
                    .fnHandler = &__pfb_render_handler,                         
                },
                .evtOnDrawing = {
                    //! callback for drawing GUI 
                    .fnHandler = &__pfb_draw_handler, 
                },
            }
        ) < 0) {
        //! error detected
        assert(false);
    }

在此函數(shù)中,可以設置在屏中顯示的大小、像素的數(shù)據(jù)類型、PFB的規(guī)格以及PFB的數(shù)量,并設置底層渲染函數(shù)” __pfb_render_handler”以及圖形繪制函數(shù)”__pfb_draw_handler”。

底層渲染函數(shù)” pfb_render_handler”用來將PFB中處理好的圖像數(shù)據(jù)渲染到屏幕的指定位置進行顯示:

static IMPL_PFB_ON_LOW_LV_RENDERING(__pfb_render_handler)
{
    const arm_2d_tile_t *ptTile = &(ptPFB->tTile);

    ARM_2D_UNUSED(pTarget);
    ARM_2D_UNUSED(bIsNewFrame);

    GLCD_DrawBitmap(ptTile->tRegion.tLocation.iX,
                    ptTile->tRegion.tLocation.iY,
                    ptTile->tRegion.tSize.iWidth,
                    ptTile->tRegion.tSize.iHeight,
                    ptTile->pchBuffer);

    arm_2d_helper_pfb_report_rendering_complete(&s_tExamplePFB, 
                                                (arm_2d_pfb_t *)ptPFB);
}

而圖形繪制函數(shù)”__pfb_draw_handler”則是利用Arm-2D庫里的各類API進行圖形的繪制。下面就在此函數(shù)中簡單繪制一個圖形以演示:

static IMPL_PFB_ON_DRAW(__pfb_draw_handler)
{
    ARM_2D_UNUSED(pTarget);
    ARM_2D_UNUSED(bIsNewFrame);

    arm_2d_region_t tBox = {
        .tLocation = {50,50},    //設定目標坐標
        .tSize = {200, 100},     //設定目標大小
    };
    //! 利用此函數(shù)向整個PFB填充白色
    arm_2d_rgb16_fill_colour(ptTile, NULL, 0xFFFF);
    //! 向指定box區(qū)域填充黑色
    arm_2d_rgb16_fill_colour(ptTile, &tBox, 0x0000);
    //! 更改box的坐標,大小不變
    tBox.tLocation.iX -= 10;
    tBox.tLocation.iY -= 10;
    //! 向修改后的box指定區(qū)域填充藍色,并且使用 50%(128/255)的透明效果
    arm_2d_rgb565_fill_colour_with_alpha(   
        ptTile, 
        &tBox, 
        (arm_2d_color_rgb565_t){0x001F},     //填充藍色
        128);      //!< 透明度

    return arm_fsm_rt_cpl;
}

以上就繪制了如下圖的一個簡單圖標:

4324a92e-011c-11ed-ba43-dac502259ad0.png

這里是利用”arm_2d_rgb16_fill_colour”和” arm_2d_rgb565_fill_colour_with_alpha”兩個API進行矩形的繪制,可以看出這是16位RGB格式的色彩填充,當然庫中也提供了32位RGB格式以及8位圖的繪制函數(shù);庫中還提供”arm_2dp_rgb16_draw_point”的畫點函數(shù)和”arm_2dp_rgb16_draw_pattern”的畫圖函數(shù)。當然,想做一個圖形驅(qū)動標準,肯定不止有draw這么基礎的能力,Alpha blending,Rotation等一系列圖形處理的功能都需要支持。

2. 做一個表盤界面

現(xiàn)在,將各項功能綜合運用起來,做一個圖形界面試試。

首先,掏出我們“祖?zhèn)鳌盠OGO,將其轉(zhuǎn)化為特定格式的數(shù)組,用的是Arm-2D庫中提供的工具,具體位置為”EndpointAIKernelsResearchArm-2D ools”,用法也在其中,考慮到1050-EVK所用的屏幕為480*272,此處將logo圖壓縮成512*280(比屏幕大,可做出背景移動的效果):”python img2c.py -i .logo.jpg --dim 512 280 --name logo”。

將生成的logo.c文件放到工程中。

435be77c-011c-11ed-ba43-dac502259ad0.png

除了背景,其余的表盤以及指針等圖像文件我們就用Arm-2D提供的例程里的。

在工程欄中新建”asset”分組,將” ..Arm-2Dexamplescommonasset”中除了”background.c”之外的c文件都選進去,并將之前生成的”logo.c”文件也加入其中,以logo圖作為本次的背景。這一步是將所需的貼圖都加進去。

接著,按照”watch_panel”的工程布局將需要的文件添加:”example_gui.c”和”example_gui.h”,并且依據(jù)工程修改主函數(shù)、補齊相關(guān)的配置。

  1. 程序運行時,先進行相關(guān)的硬件配置及初始化操作,再進行Arm-2D的初始化” arm_2d_init()”,到這里都和上一節(jié)畫一個矩形是一樣的;
  2. 接著,我們需要對繪制界面中刷新層進行初始化“example_gui_init()”,函數(shù)定義在“example_gui.c”中;
  3. 進行PFB的配置,與上節(jié)不同的是,將” pfb_draw_handler”改成“pfb_draw_background_handler”,而” pfb_draw_handler”需要留到后面進行圖形繪制用;
  4. 在PFB配置完成后,調(diào)用PFB任務“arm_2d_helper_pfb_task(&s_tExamplePFB,NULL)”,其中第二個參數(shù)為所需刷新的臟矩陣(DirtyRegions)區(qū)域,“NULL”則表示需要全屏刷新;
  5. 調(diào)用圖形繪制函數(shù)“ARM_2D_HELPER_PFB_UPDATE_ON_DRAW_HANDLER(&s_tExamplePFB, &__pfb_draw_handler);”,其中繪制的部分都在“draw_handler”中的” example_gui_refresh”函數(shù)中,對之前添加進工程的貼圖進行各種操作就在這里進行,具體可見“example_gui.c”;
  6. 最后,通過“while(1)”使程序運行在“display_task”中,對顯示屏指定區(qū)域的刷新、圖像的一些更新都在此實現(xiàn)。

經(jīng)過以上的一通操作之后,效果如下動圖所示:

436b5630-011c-11ed-ba43-dac502259ad0.gif

從上可以看出,此工程中用了bit blit, alpha blending, rotation等效果:
  1. logo滾動背景利用一定范圍內(nèi)不斷變換坐標的貼圖來實現(xiàn);
  2. 表盤利用”arm_2d_rgb565_alpha_blending_with_colour_masking”確定指定的透明度顏色蒙版來實現(xiàn);
  3. 兩個旋轉(zhuǎn)齒輪以及一根旋轉(zhuǎn)表針,通過” arm_2dp_rgb565_tile_rotation_with_alpha”區(qū)分透明度以及確定旋轉(zhuǎn)中心來分別實現(xiàn)。

四、總結(jié)

至此,基本的Arm-2D圖形繪制功能在i.MX RT1050-EVK上的實現(xiàn)就介紹完了。

本文只是簡單移植一個包含Arm-2D繪圖庫實現(xiàn)某些動畫效果的例子,已經(jīng)可以看到其多樣的功能,至于更多的一些效果,留給我們的想象空間還很足......

本文只是開篇,后續(xù),還會有對于Arm-2D在i.MX RT上更多的應用介紹。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17317

    瀏覽量

    352639
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9165

    瀏覽量

    369189
  • 圖形界面
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    7407

原文標題:在i.MX RT平臺上部署Arm-2D

文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【大聯(lián)大品佳 NXP i.MX RT1050試用申請】基于 NXP i.MX RT1050工業(yè)機器人開發(fā)

    項目名稱:基于 NXP i.MX RT1050工業(yè)機器人開發(fā)試用計劃:1,熟悉板子硬件,RT1050驅(qū)動板子硬件,做GPIO測試,串口測試,SPI測試,IIC測試,PWM測試,每種出一片報告。
    發(fā)表于 08-10 18:23

    【大聯(lián)大品佳 NXP i.MX RT1050試用申請】i.MX RT1050 3D打印機控制器

    項目名稱:i.MX RT1050 3D打印機控制器試用計劃:申請理由本人在開源硬件行業(yè)有五年多的學習和開發(fā)經(jīng)驗,曾設計多款FDM,SLA,LCD 3D打印機控制板,參與公司3
    發(fā)表于 08-10 18:23

    【大聯(lián)大品佳 NXP i.MX RT1050試用申請】使用NXP i.MX RT1050開發(fā)板設計一款低成本CAN數(shù)據(jù)采集儀

    項目名稱:使用NXP i.MX RT1050開發(fā)板設計一款低成本CAN數(shù)據(jù)采集儀試用計劃:目前的CAN數(shù)據(jù)采集儀通常使用的是CAN采集儀+上位機的方法,這種方案非常不便捷,需要帶電腦現(xiàn)場去作業(yè)
    發(fā)表于 08-10 18:24

    i.MX RT1050平臺的相關(guān)資料推薦

    SylixOS 正式支持 i.MX RT1050平臺發(fā)布于2018年06月22日什么是 i.MXRT1050i.MX RT1050 是 N
    發(fā)表于 11-29 07:19

    arm cortex處理器能用Arm-2D實現(xiàn)圖形界面設計嗎

    如何使用Arm-2D在小資源Cortex-M處理器芯片中實現(xiàn)圖形界面,非arm cortex處理器能用Arm-2D嗎?
    發(fā)表于 08-04 14:14

    如何使用Arm-2D在小資源Cortex-M處理器芯片中實現(xiàn)圖形界面

    在如何使用Arm-2D在小資源Cortex-M處理器芯片中實現(xiàn)圖形界面中,效果器顯示效果和MDK調(diào)試代碼怎么關(guān)聯(lián)?模擬器不是單獨運行在PC環(huán)境里的嗎?
    發(fā)表于 08-26 14:40

    Arm-2D對LCD接口有要求嗎

    在如何使用Arm-2D在小資源Cortex-M處理器芯片中實現(xiàn)圖形界面中,Arm-2D對LCD接口有要求嗎,比如8位8080-i接口還是24位RGB接口?
    發(fā)表于 09-28 10:19

    Arm-2D對LCD接口有要求嗎

    在如何使用ARM-2D在小資源Cortex-M處理器芯片中實現(xiàn)圖形界面中,Arm-2D對LCD接口有要求嗎,比如8位8080-i接口還是24位RGB接口?
    發(fā)表于 10-21 14:08

    如何使用emWin的API繪制圖形

    界面( HMI) 很簡單。 這個示例代碼使用 M480 MCU , 使用 emWin 的 API 來繪制圖形, 可以用作更改面板文字編輯值的按鈕。 emWin 可以輕松地執(zhí)行如何使用圖形
    發(fā)表于 08-23 07:37

    M480使用emWin的API繪制圖形

    界面( HMI) 很簡單。 這個示例代碼使用 M480 MCU , 使用 emWin 的 API 來繪制圖形, 可以用作更改面板文字編輯值的按鈕。 emWin 可以輕松地執(zhí)行如何使用圖形
    發(fā)表于 08-30 08:58

    【044】SylixOS 正式支持 i.MX RT1050平臺

    SylixOS 正式支持 i.MX RT1050平臺發(fā)布于2018年06月22日什么是 i.MXRT1050i.MX RT1050 是 N
    發(fā)表于 11-19 12:51 ?14次下載
    【044】SylixOS 正式支持 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b>平臺

    RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界處理器系列。該系列下又包括 i.MX RT1020、i.MX
    發(fā)表于 12-07 13:06 ?2次下載
    <b class='flag-5'>RT</b>-Thread & NXP 發(fā)布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    移植Arm-2Di.MX RT1050-EVKB繪制圖形界面

    眾所周知,i.MX RT系列是MCU中的性能強者,超高的主頻、豐富的外設以及足夠大的存儲使其能輕松應用于各類領(lǐng)域。其中,在圖像視頻方面,i.MX RT1050及以上系列,集成了PXP
    的頭像 發(fā)表于 06-23 09:33 ?2313次閱讀

    基于 NXP i.MX RT1050 的 3D 打印機方案

    MCU-Healer 是基于 NXP i.MX RT1050 做的 3D 打印機方案,該方案主控 MCU i.MX RT1050是一顆 Co
    的頭像 發(fā)表于 04-06 15:06 ?1306次閱讀
    基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b> 的 3<b class='flag-5'>D</b> 打印機方案

    i.MX RT1050上如何實現(xiàn)雙大容量存儲(MSC)設備

    i.MX RT1050上如何實現(xiàn)雙大容量存儲(MSC)設備
    的頭像 發(fā)表于 10-30 17:08 ?683次閱讀
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1050</b>上如何實現(xiàn)雙大容量存儲(MSC)設備
    百家乐官网怎样概率大| 金域百家乐官网娱乐城| 合法赌博网站| 大发888网站多少| 威尼斯人娱乐城会员开户| 八大胜百家乐娱乐城| 赌百家乐波音备用网| 易学24山3d罗盘App| 澳门赌百家乐官网的玩法技巧和规则| 圣淘沙百家乐官网娱乐城| 宁明县| bet365资讯网| 新时代娱乐城开户| 大发888网络赌博害人| 幸运水果机小游戏| 为什么百家乐玩家越来越多选择网上百家乐 | 赌博堕天录漫画| 亿酷棋牌世界官网| 大发888备用a99.com| 大发888 迅雷快传| 威尼斯人娱乐场网站| 巴厘岛百家乐娱乐城| 百家乐赢钱面面观| 百家乐开户导航| 百家乐1元投注| 缅甸百家乐赌博有假吗| 百家乐小音箱| 百家乐技术论坛| 百家乐园百利宫娱乐城怎么样百家乐园百利宫娱乐城如何 | 跨国际百家乐官网的玩法技巧和规则| 注册百家乐官网送彩金 | 临漳县| 云霄县| 澳门百家乐官网加盟| 澳门百家乐官网论谈| 百家乐官网实战案例| 澳门百家乐官网皇冠网| 菲律宾在线游戏| 甘肃省| 百家乐官网缆的打法| 博九网百家乐官网游戏|