魔仙小蓝黑化文:ucgui 3.90在ARM7+S6DO129上裸奔成功!(

来源:百度文库 编辑:九乡新闻网 时间:2024/05/09 05:52:13
ucgui 3.90在ARM7+S6DO129上裸奔成功!(木瓜) [转贴 2007-06-27 11:05:53 ] 发表者: cbqcgq    在移植前, 仔细阅读UC/GUI 3.90的用户手册中关于显示驱动与UC/GUI底层配置信息. 在UC/GUI用户手册中, UC/GUI按接口连接类型分成了几大类, 分别为完全总线型, 简单总线型, 4脚SPI, 3脚SPI, IIC型. 从手册中得知, 本电路中TFT4267与ARM的连接方式属于简单总线型.
移植工作主要是修改LCDConf.h和LCD驱动文件的编写, UC/GUI也提供了一些芯片的驱动文件, 可以从中选择一个接口连接类型相同的芯片驱动文件来修改. 本移植使用LCDSLin.c驱动文件作为参照.
LCDConf.h文件的修改
LCD的大小、颜色,对应的LCD控制器以及与硬件连接有关的LCD读写函数在该文件中定义, 按照UC/GUI 的规定,底层的读写LCD函数包括LCD_WRITE_A1()(即写LCD命令)、LCD_WRITE_A0()(写LCD数据)、 LCD_READ_A0()(读LCD状态)、LCD_READ_A1()(读LCD数据),以及LCD初始化函数 LCD_CONTROLLER_INIT(), 这些函数的实现与底层硬件有关,必须根据硬件连接的具体情况编写这些函数。其中LCD的四个读写函数不是都要编写的, 通常根据情况三个就可以了, LCD_READ_A0读状态函数在LCD_WAIT()中使用, 如果LCD写数据不需要等待, 该函数可以定义为空操作. LCD_READ_A1读数据函数在获取像素点颜色值_GetPixel()中时调用, 如果UC/GUI的显示缓存选项打开, 此函数也可定义为空操作. LCD_CONTROLLER_INIT()宏在LCD_L0_Init()函数中调用, 以初始化LCD, 此宏也非必需, 如果没有定义该宏, 必须提供一个LCD初始化函数给LCD_L0_Init()函数调用.
本文具体实现如下:
#define S6D0129_CMD        (*((volatile unsigned short *) 0x83200000))
#define S6D0129_DAT        (*((volatile unsigned short *) 0x83200002))
#define LCD_WRITE_A1(dat) LCD_Write01(dat)   //write command
#define LCD_WRITE_A0(dat) LCD_Write00(dat)   //write data
#define LCD_READ_A1()      LCD_Read01()    //read data

void LCD_Write00(unsigned short dat)
{
     S6D0129_DAT = dat;
}
void LCD_Write01(unsigned short dat)
{
     S6D0129_CMD = dat;
}
unsigned short LCD_Read01(void)
{
   unsigned short r;

   r= S6D0129_DAT;
   return(r);
}

驱动文件的编写
下表中的函数为UC/GUI上层各模块调用硬件功能的接口函数, 而它们又调用用户编写的几个基本的函数如画点, 获取单个像素的颜色值等, 因此最基本的移植只需向UC/GUI提供画点函数_SetPixel()和获取像素信息_GetPixel()函数. 下列函数中关于像素点位置坐标都为int型, 须注意与这些函数传递参数时的数据类型, 及发生类型传换时编译器的行为.
表1 硬件接口函数的名称和功能

函数名称    功     能      
LCD_L0_InIt()    显示初始化      
LCD_L0_ReInIt()    重新初始化而不擦除显示内容      
LCD_L0_OFF    关显示      
LCD_L0_ON    开显示      
LCD_L0_DrawBitmap()    画图      
LCD_L0_DrawPixel()    以指定颜色画点      
LCD_L0_DrwaVline()    画水平线      
LCD_L0_DrwaVline()    画垂直线      
LCD_L0_FillRect()    填充一矩形      
LCD_L0_XorPixel()    翻转指定点颜色   
根据不同的硬件特性, 可以对上表中一些函数实现进行优化, 比如UC/GUI提供的LCDSLin.c文件, 其中LCD_L0_DrawBitmap函数调用了一个DrawBitLine1BPP()画1BPP位图的函数, 驱动必须向DrawBitLine1BPP()提供XY20FF位置转换函数及LCD_WRITE, XY20FF的像素坐标(x,y)转换为显示缓冲的偏移量, LCD_WRITE根据偏移量进行画点的函数.
移植工作最基本的工作实现_SetPixel()和_GetPixel()函数两个函数就可以, 优化可以慢慢熟悉后再进行.