{
OS_X_Delay(1);
}
改为:
void GUI_X_ExecIdle (void)
{
OSTimeDly(1);
}
告诉OS_X_Delay没有定义,把设计到的这个函数换成 OSTimeDly(1)就可以了,因为我们带了操作系统
6.在main文件中,调用gui的api函数时,添加这个头文件即可#include "GUI.H"
移植步骤:
第一步:首先,得把你的TFT底层驱动写好,既在裸机下,可以正常显示。
第二步:加入UCGUI程序包。
第三步:配置LCDConf.h GUIConf.h GUITouchConf.h(由于我的液晶不带触摸功能,此配置在此不讲。)
配置LCDConf.h文件如下:
#ifndef LCDCONF_H
#define LCDCONF_H
#define LCD_XSIZE (160) //配置TFT的水平分辨率
#define LCD_YSIZE (128) //配置TFT的垂直分辨率
#define LCD_CONTROLLER (54124) //TFT控制器的名称
#define LCD_BITSPERPIXEL (16) //每个像素的位数
#define LCD_FIXEDPALETTE (565) //调色板格式
#define LCD_SWAP_RB (0) //红蓝反色交换
#define LCD_INIT_CONTROLLER() TFT_Init() ; //此处需要定义的是你的TFT初始化函数
#endif /* LCDCONF_H */
配置GUIConf.h文件如下:
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (1) //多任务
#define GUI_SUPPORT_TOUCH (0) //触摸
#define GUI_SUPPORT_UNICODE (1) //Unicode支持
#define GUI_DEFAULT_FONT &GUI_Font6x8 //GUI默认字体
#define GUI_ALLOC_SIZE 5000 //动态内存的大小
#define GUI_WINSUPPORT 1 //窗口控件支持
#define GUI_SUPPORT_MEMDEV 1 //支持内存设备
#define GUI_SUPPORT_AA 1 /* Anti aliasing available */
#endif /* Avoid multiple inclusion */
第四步:最关键的一步。那就是让GUI能够找到你的LCD驱动。修改LCDDriver。
在编写你的TFT底层驱动程序的时候,一定不能忘记编写这两个函数:设置一个像素和获取一个像素的颜色,因为后面很多UCGUI和你的TFT驱动关联起来需要这两个函数为前提。以我的TFT为例:
void LCD_SetPixel(unsigned short x, unsigned short y, unsigned short color)
{
….
…
}
unsigned short LCD_GetPixel(unsigned short x, unsigned short y)
{
…
…
}
这两个函数写好,并测试可以正常显示后,接下来需要修改TFT与UCGUI关联的函数(在一个C文件下(我的是ili9320_ucgui.c),建议大家在移植GCGUI之前最好下载个别人移植好的例程,对着修改这样难度降低很多):
int LCD_L0_Init(void)
{
TFT_Init();
return 0;
}
这个函数,是GCGUI初始化TFT需要调用的,里面的函数就是你TFT底层驱动的初始化函数。
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
LCD_SetPixel(x,y,PixelIndex);
}
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
return LCD_GetPixel(x,y);
}
上面两个函数是其他函数的最基本元素,其他函数比如画线、点、圆都需要调用改函数。里面的LCD_SetPixel(x,y,PixelIndex)、LCD_GetPixel(x,y);就是你TFT底层驱动设置像素和获取像素的两个函数。
紧接着把该ili9320_ucgui.c文件下其他函数修改一下(凡是遇到设置像素和获取像素的地方用以上两个函数代替。)
接着,修改另一个C文件(ili9320_api.c)这里修改很简单,仅仅也是将设置像素和获取像素的函数替换掉自己定义的即可。
二、移植过程
先来看看解压后都有些什么东西: 核心的东西包括Config和GUI两个文件夹,这里面是ucgui的所有源码和配置文件。ConvertColor包含彩色转换函数,ConvertMono包含灰度到彩色转换的函数,Core包含核心程序,Font是字体文件,LCDDriver包含多种控制器驱动,Widget是窗口控件库,WM是窗口库,提供复杂的功能。其他文件夹包含一些应用范例以及一些有用的工具,留待慢慢探索。
1、config文件的移植:
Config文件夹是ucgui的配置文件夹,里面有3个文件:
GUIConf.h:gui的基本属性配置文件,有很多开关可以配置,具体可以参考ucgui的用户手册,这里只需配置几个必要的参数如下:
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (1)
#define GUI_SUPPORT_TOUCH (1)
#define GUI_SUPPORT_MOUSE (0)
#define GUI_SUPPORT_UNICODE (1)
#define GUI_DEFAULT_FONT &GUI_Font6x8
#define GUI_ALLOC_SIZE 12500
#define GUI_WINSUPPORT 1
#define GUI_SUPPORT_MEMDEV 0
#define GUI_SUPPORT_AA 0
#endif
LCDConf.h:LCD控制器的硬件配置文件,这个文件与硬件直接相关,一般是根据你所使用的LCD的类型和所用的LCD控制器的类型来配置。我的配置是一块友晶公司的800*480的触摸屏,支持18位色,不过我只使用16位,RGB565色彩模式,足矣。LCD控制器就是写的一个硬件模块,挂在avalon总线上,负责读取显示缓冲区中的数据,然后按照该LCD的时序输出显示到LCD上。显示缓冲区直接开辟在系统内存中,系统使用一块512K SRAM作为系统内存,CPU可以直接对其进行16位读写访问。通过仔细阅读ucgui的用户手册,可以知道,在我这种硬件配置条件下,可以选择LCDLin.c这个驱动文件,那么对应了LCD_CONTROLLER 配置为1300。在实际配置时,LCD大小为400*240,这是因为在硬件工程的pixbuffer模块中对分辨率进行了硬扩。
#include <system.h> #include <altera_avalon_pio_regs.h>
#define LCD_XSIZE (400) #define LCD_YSIZE (240)
#define LCD_BITSPERPIXEL (16) #define LCD_CONTROLLER 1300
#define LCD_ENDIAN_BIG 0 #define LCD_FIXEDPALETTE 565 #define LCD_SWAP_RB 1 #define LCD_VRAM_ADR SRAM_BASE #define LCD_BUSWIDTH 16 #define LCD_OPTIMIZE 1
#define LCD_READ_MEM(Off) IORD_16DIRECT(LCD_VRAM_ADR,(Off<<1)) #define LCD_WRITE_MEM(Off,data) IOWR_16DIRECT(LCD_VRAM_ADR,(Off<<1),data)
#define LCD_INIT_CONTROLLER()
在这里,最重要的就是LCD_READ_MEM(Off),LCD_WRITE_MEM(Off,data)的定义,当时在LCD驱动文件上花了很大时间,仔细研究了LCDLin.c文件后,发现很多都是针对特定的LCD控制器写的,我们根本用不到,由于LCD控制器中已经对LCD屏进行了初始化,所以在这里LCD_INIT_CONTROLLER()也不必定义。
GUITouchConf.h:触摸屏的配置文件。
//#define GUI_TOUCH_AD_LEFT 100 //#define GUI_TOUCH_AD_RIGHT 4000 #define GUI_TOUCH_SWAP_XY 1 #define GUI_TOUCH_MIRROR_X 0 #define GUI_TOUCH_MIRROR_Y 1
这里要根据特定的触摸屏来定义,主要修改GUICoreGUI_TOUCH_DriverAnalog.c文件,在后面将会继续讲述。至此,config文件移植完毕。
2、LCD device驱动的移植
三、运行第一个程序:hello_gui
下面,我们就让刚移植好的gui到实际的系统上去运行一下。
1、配置好FPGA的硬件;
2、打开nios II IDE,以hello_world工程为模版建立一个新的工程hello_gui;
3、将ucgui的Config和GUI两个文件夹(包含有我们刚刚修改过的几个文件)复制到工程目录下;
5、修改hello_world.c的内容为:
#include "GUI.H"
#include <system.h>
void main(void) {
GUI_Init();
GUI_SetBkColor(GUI_BLUE);
GUI_Clear();
GUI_SetColor(GUI_RED);
GUI_DispString("Hello world!");
while(1);
}
6、在system library选项中选择RTOS为MicroC/OS-II;
这时如果编译工程,会出现一些未定义错误,类似于GUI_X_未定义等等,原来是缺少GUI_X.c文件,这个文件定义了gui与rtos的接口,以及debug错误报告等函数,于是我们需要添加这个文件。经过寻找,在Sample文件夹中发现了GUI_X这个文件夹,打开一看,里面有我们所需要的GUI_X.c文件,由于我们使用了MicroC/OS-II操作系统,所以我们使用其中的GUI_X_uCOS.c文件,将这个文件copy到工程目录下,并在文件结尾添加下面这几行:
void GUI_X_Log (const char *s) { GUI_USE_PARA(s); }
void GUI_X_Warn (const char *s) { GUI_USE_PARA(s); }
void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
并将其中的:
void GUI_X_ExecIdle (void)
{
OS_X_Delay(1);
}
改为:
void GUI_X_ExecIdle (void)
{
OSTimeDly(1);
}
方可编译通过。
7、Debug as hardware,这样,就可以看见结果了。我的结果是LCD上用篮底红字显示出了“hello world!”字样。表示ucgui3.98在Nios II上初步移植成功!
http://www.openedv.com/posts/list/20610.htm