1. 程式人生 > >嵌入式圖形使用者介面uc/gui在nios II上的移植

嵌入式圖形使用者介面uc/gui在nios II上的移植

uc/gui是一個優秀的嵌入式圖形使用者介面,這幾天的工作就是將它移植到nios II系統上。前人也做了一些工作,不過大部分都是針對其他硬核處理器,針對nios II軟核處理器的移植資料那簡直是鳳毛麟角。在閱讀了相關文件後,我決定自己親自動手實踐,這下面的很多過程都是自己摸索出來的,並通過了實驗的驗證。這只是一個初步的移植,也許在以後的更復雜的應用中,還需要對其進行調整。但對目前我的應用而言,應該足夠了。

寫這篇文章的目的一是由於自己記性不好,所以需要給自己留個備忘,免得以後忘的一乾二淨;二是給有需要的朋友提供一些參考,也好相互交流,共同進步。請大家多提寶貴意見。

一、原始碼和文件下載

上有很多不同版本的原始碼下載,目前能下到的最新版本是3.98

,不過還有一些元件不是很完整,但作基礎開發已經夠用了。

開發軟體:quartus II 6.0, Nios II IDE 6.0

二、移植過程

先來看看解壓後都有些什麼東西:

如圖,核心的東西包括ConfigGUI兩個資料夾,這裡面是ucgui的所有原始碼和配置檔案。ConvertColor包含彩色轉換函式,ConvertMono包含灰度到彩色轉換的函式,Core包含核心程式,Font是字型檔案,LCDDriver包含多種控制器驅動,Widget是視窗控制元件庫,WM是視窗庫,提供複雜的功能。其他資料夾包含一些應用範例以及一些有用的工具,留待慢慢探索。

1config檔案的移植:

Config

資料夾是ucgui的配置資料夾,裡面有3個檔案:

GUIConf.hgui的基本屬性配置檔案,有很多開關可以配置,具體可以參考ucgui的使用者手冊,這裡只需配置幾個必要的引數如下:

#ifndefGUICONF_H

#define GUICONF_H

#define GUI_OS(1)/* 支援作業系統,nios系統自帶了ucosII,所以我們選擇此項,使gui支援該作業系統 */

#define GUI_SUPPORT_TOUCH(0)/* 支援觸控式螢幕,由於暫時沒有用觸控式螢幕,所以關掉這個開關 */

#define GUI_SUPPORT_MOUSE(0)/* 支援滑鼠,暫時關閉 */

#define

GUI_SUPPORT_UNICODE(1)/* Unicode字串支援 */

#define GUI_DEFAULT_FONT&GUI_Font6x8/* 預設字型 */

#define GUI_ALLOC_SIZE12500/* WMmemery device分配的記憶體 */

#define GUI_WINSUPPORT1/* Window manager available */

#define GUI_SUPPORT_MEMDEV0/* Memory devices available,由於下載到的原始碼中缺少memery device元件的原始碼,所以關閉此項 */

#define GUI_SUPPORT_AA1/* Anti aliasing available */

#endif/* Avoid multiple inclusion */

LCDConf.hLCD控制器的硬體配置檔案,這個檔案與硬體直接相關,一般是根據你所使用的LCD的型別和所用的LCD控制器的型別來配置。我的配置是一塊640*480TFT LCD,支援18位色,不過我只使用16位,RGB565色彩模式,足矣。LCD控制器就是自己寫的一個硬體模組,掛在avalon總線上,負責讀取顯示緩衝區中的資料,然後按照該LCD的時序輸出顯示到LCD上。顯示緩衝區直接開闢在系統記憶體中,系統使用一塊SDRAM作為系統記憶體,CPU可以直接對其進行32位讀寫訪問。通過仔細閱讀ucgui的使用者手冊,可以知道,在我這種硬體配置條件下,可以選擇LCDLin32.c這個驅動檔案(後面將詳細講述對LCDLin32.c的修改與移植),那麼對應了LCD_CONTROLLER 必須配置為3200

#ifndef LCDCONF_H

#define LCDCONF_H

#define LCD_XSIZE(640)/* X-resolution of LCD, Logical coor. */

#define LCD_YSIZE(480)/* Y-resolution of LCD, Logical coor. */

#define LCD_BITSPERPIXEL (16) /* 每個象素點需要的Bit */

#define LCD_CONTROLLER 3200/* 控制器名稱 */

#define LCD_ENDIAN_BIG0/* 選擇little endian */

#define LCD_FIXEDPALETTE565 /* 選擇RGB565色彩模式 */

#define LCD_SWAP_RB1/* gui預設為GRB565,定義這個開關可以使之轉換為RGB565,即交換RB */

//#define LCD_VRAM_ADR0x20000000 /*顯示緩衝區起始地址,這個巨集定義定義了顯示緩衝區的地址,在驅動檔案LCDLin32.c中要用到這個地址。由於我的顯示緩衝區要在程式執行起來之後,由malloc函式在系統記憶體中分配,所以這個地址無法預先定義。於是我取消了這個巨集定義,而改為一個指標變數,直接放在LCDLin32.c中,通過修改其中的一些函式定義,完全可以實現這樣的改變。 */

//#define LCD_READ_MEM(Off)IORD_32DIRECT((U32 *)LCD_VRAM_ADR + ((U32)Off) << 2),0)

//#define LCD_WRITE_MEM(Off,data)IOWR_32DIRECT((U32 *)LCD_VRAM_ADR + ((U32)Off) << 2),0,Data)

/* 使用驅動LCDLin32.c需要定義的函式,用於讀寫顯示緩衝區,由於把顯示緩衝區的地址指標放到LCDLin32.c中去了,所以這兩個函式也直接放到LCDLin32.c中去,在這裡就可以不要了 */

#define LCD_INIT_CONTROLLER()LCD_Controller_Init()/* LCD 控制器初始化函式,由gui_init()呼叫,我在這裡替換為自己的控制器初始化函式LCD_Controller_Init(),該函式在後文中敘述 */

#endif/* LCDCONF_H */

GUITouchConf.h:觸控式螢幕的配置檔案,暫時沒有使用。

至此,config檔案移植完畢。

2LCD device驅動的移植

這裡所說的LCD device驅動移植主要是指前面所說的LCDLin32.c檔案的修改。LCDLin32.cGUI/LCDDriver資料夾中,其中定義了幾個關鍵的函式,用於gui對顯示緩衝區進行操作,如

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)/* 畫點 */

unsignedint LCD_L0_GetPixelIndex(int x, int y)/* 讀點 */

void LCD_L0_XorPixel(int x, int y)/* 異或點 */

void LCD_L0_DrawHLine(int x0, int y,int x1) /* 畫水平線 */

void LCD_L0_DrawVLine(int x, int y0,int y1) /* 畫垂直線 */

void LCD_L0_FillRect(int x0, int y0, int x1, int y1) /* 矩陣填充 */

void LCD_L0_DrawBitmap(int x0, int y0,

int xsize, int ysize,

int BitsPerPixel,

int BytesPerLine,

const U8 GUI_UNI_PTR * pData, int Diff,

const LCD_PIXELINDEX* pTrans) /* 畫點陣圖 */

void LCD_On (void) /* 開啟LCD */

void LCD_Off (void) /* 關閉LCD */

由於我的LCD不具備開啟和關閉功能,所以LCD_On()LCD_Off()定義為空函式。在上述的幾個畫點畫線函式中,與硬體(顯示緩衝區)直接相關的就是

LCD_WRITE_MEM(Off,data)/*寫儲存器*/

LCD_READ_MEM/*讀儲存器*/

我們只需要將這兩個巨集定義修改一下,使之指向我們自己定義的操作。由於這兩個函式是對顯示緩衝區進行讀寫操作,所以需要先知道顯示緩衝區的起始地址,在我的系統中該緩衝區由malloc函式得到,於是需要預先定義一個指標變數,用來儲存顯示緩衝區的首地址:

U32*lcd_framebuffer0;/* our frame buffer first address */

但是預編譯無法處理malloc函式,所以我將這個操作放到自定義的LCD_Controller_Init()函式中執行。這裡使用了Nios系統中hal庫的一些函式,所以需要先包含相應的標頭檔案:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <alt_types.h>

#include"io.h"

#include"sys/alt_alarm.h"

#include"sys/alt_cache.h"

#include"system.h"

#include"priv/alt_file.h"

這其中實際上有幾個標頭檔案是沒有必要包含進來的,不過我也沒去管它,所以就都寫在這裡了,應該不會有什麼害處。

#define LCD_BYTESPERFRAMELCD_XSIZE * LCD_YSIZE * LCD_BITSPERPIXEL / 8

void LCD_Controller_Init(void)

{

lcd_framebuffer0 = (U32 *)alt_uncached_malloc(LCD_BYTESPERFRAME);

memset( (void *)lcd_framebuffer0, 0x0, LCD_BYTESPERFRAME ) ; /* reset the frame buffer to 0x0 */

IOWR_32DIRECT( VGA_CONTROLLER_0_BASE, 0, 0x0 ); /* Reset the VGA controller */

IOWR_32DIRECT( VGA_CONTROLLER_0_BASE, 4, lcd_framebuffer0 ); /* Where our frame buffer starts */

IOWR_32DIRECT( VGA_CONTROLLER_0_BASE, 8, LCD_BYTESPERFRAME ); /* amount of memory needed */

IOWR_32DIRECT( VGA_CONTROLLER_0_BASE, 0, 0x1 ); /* Set the go bit. */

}

這個函式初始化了顯示緩衝區,並對LCD控制器進行配置,使之正確執行。其中,VGA_CONTROLLER_0_BASELCD控制器的基地址,由system.h檔案定義,所以要將它include進來。LCD_BYTESPERFRAME為每幀需要的位元組數。由巨集定義得到。這樣,在系統呼叫GUI_Init()函式時,LCD_Controller_Init()函式也會被呼叫,這就可以保證gui在做任何操作以前,顯示緩衝區都已經準備好了,LCD控制器也已經配置好並已經開始運行了。

實際上,LCDLin32.c檔案中對LCD_READ_MEMLCD_WRITE_MEM已經做了定義,有了lcd_framebuffer0這個指標變數之後,我們只需要對LCD_READ_MEMLCD_WRITE_MEM定義做一些修改,使之指向lcd_framebuffer0所指的緩衝區即可:

#defineLCD_READ_MEM(Off)(*((U32 *)lcd_framebuffer0 + ((U32)Off)))

#defineLCD_WRITE_MEM(Off, Data) *((U32 *)lcd_framebuffer0 + ((U32)Off)) = Data

這樣,LCDLin32.c就基本上修改完畢了。當然,我們還可以修改其畫點,畫線,矩陣填充,畫點陣圖等函式,使之對於我們特定的硬體更加優化,以提高執行效率,這是後話。到目前為止,gui已經能夠正確地操作我們的硬體了。

三、執行第一個程式:hello_gui

下面,我們就讓剛移植好的gui到實際的系統上去執行一下。

1、配置好FPGA的硬體;

2、開啟nios II IDE,以hello_world工程為模版建立一個新的工程hello_gui

3、將ucguiConfigGUI兩個資料夾(包含有我們剛剛修改過的幾個檔案)複製到工程目錄下;

4、在hello_gui工程選項中新增如下include paths

yourprojectdir/software/hello_gui/Config

yourprojectdir/software/hello_gui/GUI/Core

yourprojectdir/software/hello_gui/GUI/Widget

yourprojectdir/software/hello_gui/GUI/WM

5、修改hello_world.c的內容為:

#include"GUI.H"

void main(void) {

GUI_Init();/* 初始化GUI,同時初始化LCD控制器和顯示緩衝區 */

GUI_SetBkColor(GUI_BLUE); /* 設定背景色為藍色*/

GUI_Clear();/* 清屏為背景色 */

GUI_SetColor(GUI_RED);/* 設定前景色為紅色(後面畫圖操作將用該前景色) */

GUI_DispString("Hello world!"); /* 顯示hello world! */

相關推薦

嵌入式圖形使用者介面uc/gui在nios II移植

uc/gui是一個優秀的嵌入式圖形使用者介面,這幾天的工作就是將它移植到nios II系統上。前人也做了一些工作,不過大部分都是針對其他硬核處理器,針對nios II軟核處理器的移植資料那簡直是鳳毛麟角。在閱讀了相關文件後,我決定自己親自動手實踐,這下面的很多過程都是自己摸

遠端且無圖形介面時如何在linux安裝oracle

使用MobaXterm,連線上你的遠端linux系統,再shell中輸入export DISPLAY=IP地址:0.0,該ip地址為你現在所使用的電腦ip,而非遠端linux的ip。 然後就可以執行安裝./runInstaller,如果彈出視窗,點選“是”,就可以。依次執行dbca,netca等

嵌入式系統圖形使用者介面(GUI)的設計與研究

1 引 言 在工業控制領域裡,各種儀器儀表、智慧工控裝置也廣泛採用了嵌入式技術,但由於資源有限, 這些系統一般不希望建立在龐大累贅的、非常消耗系統資源的作業系統和GUI之上,比如Windows或X Window。這些系統對輕型GUI的需求更加突出。因此,在工業控制系統中實現

嵌入式實時作業系統uc/os-ii 原理及應用 讀書筆記

對任務就緒表的操作理解: 將優先級別為prio的任務置為就緒狀態,可使用如下程式碼 OSRdyGrp |= OSMapTbl[prio >>3];//將prio任務所在的組狀態置為1,表示該組有任務就緒。 OSRdyTbl[prio>>3] |= O

Java和C++在圖形使用者介面設計的對比

C/C++在編寫有圖形使用者介面(GUI)的應用程式可謂是風光無限,Windows和Linux本來就是用C寫的,這也使得C/C++成為在這平臺上開發應用的首選語言,畢竟,不需要安裝額外的軟體,只要按照各自系統的規範來編寫原始碼,編譯連線成一個應用即可。Windows下面的應用時所有作業系統中最多的,而其中絕

嵌入式實時作業系統uc-os-ii原理及應用 第三章 uc/os-ii中的任務

3.1-3.4.3  印象比較深的點在作業系統中程式叫做程序或執行緒。系統任務:空閒任務和統計任務。不同處理器,堆疊的增長方向不同。實時作業系統,時間操作必須為常量,所以不能用for,配合break或continue。不然每個任務執行時間不同。

在RHEL7安裝伺服器端的圖形介面

[[email protected] ~]# uname -a Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Thu Ja

嵌入式Linux移植unzip工具

16px 文件 bsp ont div 嵌入 for .gz .tar.gz   由於busybox編譯出來的unzip不支持有密碼的壓縮包解壓,因此基於unzip60源碼包,交叉編譯一個嵌入式Linux上的unzip工具。 1.下載地址是: http://sourcefo

centos安裝圖形介面

      用下面命令檢視檢視是哪個模式 systemctl get-default 開機啟動圖形介面 systemctl set-default graphical.target(圖形介面模式)

JAVA程式設計題解與上機指導 第四版 第8章 Java的圖形使用者介面設計 8.2 建立“My JFrame”

一、簡介:程式設計實現建立並顯示一個標題為“My Frame”,Frame背景為黑色,Panel背景為白色,其中,Panel中加入“開啟”“關閉”“返回”三個按鈕,並一行排開。 二、程式碼如下: import java.awt.*; import javax.swing.*; import ja

CentOS下靜默(無圖形介面)安裝Oracle11g

安裝要求(本人的配置):CentOS7虛擬機器,記憶體至少1G,磁碟大小40G往上(最低要求),不然後面空間不足你肯定裝不上,吃了大虧!!!後來本人擴充套件到60G。 以下為步驟,為確保可用,建議安裝時命令手動鍵入: 首先root身份進入系統: vi /etc/hosts A

井字棋遊戲C語言簡單思路人人對戰版(無圖形介面))

#include<stdio.h> #include<stdlib.h> #include<conio.h> #defineROW 3 #defineLINE 3 intsymbol1, symbol2, step; char a[10]; void

Java程式設計 圖形使用者介面 小巫版簡易計算器

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

GO-圖形使用者介面

  圖形使用者介面1:初識Walk Go與GUI——GO語言的圖形介面Walk GO沒有原生的介面庫,所以不能直接用來寫GUI介面。但最近網際網路上已經湧現出不少成熟、好用的第三方介面庫。使用它們,就同樣可以寫出同C#、C++的介面。而且效率還更勝一籌。 關於Walk介面庫

vue-cli3.0 使用圖形介面建立和管理專案

1.開啟終端輸入vue ui vue ui 2.建立專案 3.選擇一套預設,點選建立專案按鈕 4.等待安裝 5.安裝完成後    6.可以新增外掛 7.專案依賴管理 8.專案配置管理    9.

ubuntu以root身份進入圖形管理介面

nautilus 是gnome的檔案管理器,但是如果不是root賬號下,許可權受限,我們可以通過以下方式以root許可權使用! 一,快捷鍵“ctrl+alt+t”,調出shell。 二,在shell中輸入:“sudo nautilus ”,就可以以root許可

MariaDb資料庫管理系統學習(二)使用HeidiSQL資料庫圖形介面管理工具

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

使用vue-cli3&vue ui圖形介面建立專案

Vue CLI3 需要 Node.js 8.9 或更高版本  sudo npm install -g @vue/cli # OR sudo yarn global add @vue/cli vue create hello-world cd hello-wor

linux圖形介面工具VNC

竟然忘了這麼個東東,想了五分鐘都沒想起來,菜鳥至極,mark下 具體教程請見下連結: https://www.cnblogs.com/paul8339/p/5584449.html VNC輕鬆連線遠端Linux桌面 VNC連線Linux桌面,要想連線Linux遠端桌面,按照下面的步驟

MFC入門(一)-- 第一個簡單的windows圖形介面小程式(開啟計算器,記事本,查IP)

////////////////////////////////序////////////////////////////////   大約三年前,學過一些簡單的程式語言之後其實一直挺苦惱於所寫的程式總是拘泥於用的編譯器,脫離了編譯環境基本沒執行的可行性,故而寫一個在任意windows電腦下都能