S5PV210开发系列四_uCGUI的移植

发布者:平和思绪最新更新时间:2024-12-20 来源: cnblogs关键字:S5PV210  uCGUI  移植 手机看文章 扫描二维码
随时随地手机看文章

GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体、菜单、按键等方式进行操作。

在某些场合,设计一款人机界面丰富友好的嵌入式产品能赢得很多其它的用户。笔者此处就S5PV210基于uCGUI图形用户界面的使用作一个简单的介绍。

1. uCGUI移植概述

1.1. S5PV210 Bootloader

笔者的S5PV210的Bootloader设置最高的CPU主频1GHZ,MMU进行1:1内存空间线性映射,并开启L1 I/D Cache、L2 Cache、硬件分支预測功能,使CPU能达到最大的吞吐量性能。初始化内存,可以识别sd/mmc启动和Nand flash启动,自己主动载入应用代码到RAM位置。统一的中断管理架构、重定向底层IO操作。支持代码直接下载内存执行以及Nandflash下载。可以更加专注于应用的开发。

1.2. uCGUI源代码

笔者以uCGUI 3.98这个版本号移植作为解说。这个版本号的uCGUI是开放源代码的最高版本号。之后版本号仅仅提供库文件,不再开源。关于uCGUI概述、使用、移植等具体内容,能够直接阅读uCGUI用户手冊。

1.3. uCGUI接口实现

uCGUI依据其使用的功能,必须先实现其对应的功能接口。对于uCGUI,显示以及时基计时这两部分是必须的。因此必须实现其接口。

显示即是实现对应的屏驱动。时基计时即是实现1ms/tick的定时计数,uCGUI用来实现时间计时。

此处还使用uCGUI触摸屏功能,因此也应实现对应的触摸屏驱动。


2. 接口移植驱动

2.1. 屏驱动

屏驱动主要提供设置某一坐标像素颜色接口Display_SetPixel 和从某一坐标读出像素颜色接口Display_GetPixel给uCGUI就可以。S5PV210具有RGB接口。因此屏驱动也主要是RGB接口的初始化。依据详细的屏,设置其水平分辩率、垂直分辩率、像素时钟、缓存位置等就可以。RGB控制器是通过DMA的方式把显存帧传输数据到外部接口。因此CPU对显存数据的更改均应写回显存所在的物理主存。不然会有Cache数据一致性的问题。


Bootloader对于Cache提供了相应的四种内存分配策略:

cached, write-back。写回模式,CPU的每次读写假设Cache命中则仅仅读写Cache,不读写主存。这样的模式不用过多地读写缓慢的主存,因此CPU具有最高的性能,默认的内存分配方式。


cached, write-through。写通模式。CPU每次读假设Cache命中则仅仅读Cache。不读主存。每次写即使Cache命中更新Cache外。还会随后写入主存,减少了系统的写速度,在Bootloader中的内存域为” .mem_cnb”。


non-cached, buffered,不可Cached,写缓存开启。CPU每次读写均不会Cache命中。CPU写数据时写入缓存后马上继续运行,缓存随后更新到主存。

未用Cache功能,CPU读写性能相对低下。在Bootloader中的内存域为” .mem_ncb”。

 non-cached, non-buffered,不可Cached。未开启写缓存。

CPU每次读写均从主存读写。因为主存的缓慢。这样的模式读写性能低下。在Bootloader中的内存域为” .mem_ncnb”。

对于RGB显存,除了写回模式外,其他模式写均会更新主存,不存在显示的一致性问题。为了达到最高的CPU性能,RGB显存应分配在写通模式内存区。

//16 bit(565)

uint16_tDisplayBuffer[HSize*VSize] @ '.mem_cnb'; // cached, write through

同一时候。对于数据DMA,为保证数据一致性总是,可用最简单的方式,DMA区域内存分配到non-cached, non-buffered域,尽管牺牲性能,但没有Cache一致性问题。

uint32_tDMA_Buffer[xxx] @ '.mem_ncnb';

2.2. 触摸屏驱动

触摸屏驱动主要提供有触摸时返回触摸点X位置接口TP_GetPoint1_X和返回触摸点Y位置接口TP_GetPoint1_Y给uCGUI就可以。

笔者使用的是电容屏,一般电容屏均是使用I2C接口。因此必须先实现I2C驱动。电容屏一般支持多点触摸。但uCGUI仅仅支持单点触摸。因此电容屏中断输出配置成查询方式,通过查询中断线的电平状态来确定有无触摸事件。

int32_tTP_GetPoint1_X(void)

{

    uint8_t Point1_X[2];

    if (!(GPH0DAT_REG & FT5206_INT)) { // 触屏按下时。INT拉低      

        // 获得12位X轴坐标

        TP_ReadRegs(FT5206_TOUCH1_XH, Point1_X,2);

        if (!(GPH0DAT_REG & FT5206_INT)) {

            //获得AD时应保持按下。不然AD值可能不准确。应丢弃

            return((((int32_t)(Point1_X[0]&0xf)) << 8) | Point1_X[1]);

        }  

    }  

    return -1; //返回无效值,表未按下或释放了

}

 

int32_tTP_GetPoint1_Y(void)

{

    uint8_t Point1_Y[2];

   

    if (!(GPH0DAT_REG & FT5206_INT)) { // 触屏按下时,INT拉低

        // 获得12位Y轴坐标

        TP_ReadRegs(FT5206_TOUCH1_YH, Point1_Y,2);

        if (!(GPH0DAT_REG & FT5206_INT)) {

            //获得AD时应保持按下,不然AD值可能不准确。应丢弃

            return((((int32_t)(Point1_Y[0]&0xf)) << 8) | Point1_Y[1]);

        }  

    }  

    return -1; //返回无效值,表未按下或释放了

}

 

int32_tTP_WriteRegs(uint8_t WriteAddr, uint8_t *pData,uint8_t Len)

{  

    uint8_t Packet[64];

    uint8_t i;

    if (Len >= sizeof(Packet)) {

        return -1;

    }

    Packet[0] = WriteAddr;

    for (i=0; i        Packet[i+1] = pData[i];

    }

    return I2C_WriteBytes(FT5206_ADDR, Packet,Len+1);

}

 

int32_tTP_ReadRegs(uint8_t ReadAddr, uint8_t *pData, uint8_t Len)

{

    int32_t Ret;

    // 写需读取的内部寄存器地址

    Ret = I2C_WriteBytes(FT5206_ADDR,&ReadAddr, 1);

    if (Ret == 0) {

        return I2C_ReadBytes(FT5206_ADDR, pData,Len); 

    }

    return Ret;

}

2.3. 定时器驱动

uCGUI通过OS_TimeMS来作为时基,因此须要一个定时器实现1ms/tick更新OS_TimeMS这个时基计数器。

此处採用S5PV210的Timer4。初始化并注冊对应的中断后。在当中断回调函数更新OS_TimeMS。同一时候处理uCGUI约100HZ频率查询触摸屏输入任务。


uint8_tTP_Period;

staticvoid Timer4_Callback(void)

{

    extern volatile int OS_TimeMS;

    OS_TimeMS++; // 1ms计数,在GUI_X.c中定义,用来uCGUI延时计数

#ifGUI_SUPPORT_TOUCH

    TP_Period++;

    if (TP_Period >= 10) { // 每隔10ms检查触摸屏输入

        TP_Period = 0;

        IRQ_DisableInt(INT_TIMER4); // 禁止同一中断重入

        IRQ_Enable(); // 在定时器中断处理中同意I2C嵌套中断

        GUI_TOUCH_Exec(); // 保证100HZ的触摸屏输入检查

        IRQ_EnableInt(INT_TIMER4);

    }

#endif

}

3. uCGUI改动

3.1. GUIConfig文件夹

进入GUIConfig文件夹,打开GUIConf.h对GUI进行整体的配置。因为内存充足。能够设置较大的动态内存以及支持内存设备。此处并不支持操作系统以及鼠标。改动后的内容例如以下:

#ifndef GUICONF_H

#define GUICONF_H

 

#define GUI_OS                    (0)  /* 不支持多任务 */

#defineGUI_SUPPORT_TOUCH         (1)  /* Support a touch screen (req. win-manager)*/

#define GUI_SUPPORT_MOUSE         (0) /* 不支持鼠标 */

#defineGUI_SUPPORT_UNICODE       (1)  /* Support mixed ASCII/UNICODE strings */

 

#defineGUI_DEFAULT_FONT         &GUI_Font6x8

#defineGUI_ALLOC_SIZE            (4*1024*1024)  /* 动态内存4M*/

 

/*********************************************************************

*

*         Configuration of available packages

*/

 

#defineGUI_WINSUPPORT            1  /* Window manager package available */

#defineGUI_SUPPORT_MEMDEV        1  /* Memory devices available */

#defineGUI_SUPPORT_AA            1  /* Anti aliasing available */

 

#endif  /* Avoidmultiple inclusion */

打开LCDConf.h对LCD进行配置。笔者使用的是16位(R:5-G:6-B:5)色深800*480的RGB屏,清空LCDConf.h中的全部内容,由于这是其他LCD屏的配置,与所用屏全然不一致。改动后的内容例如以下:

#ifndef LCDCONF_H

#define LCDCONF_H

 

/*********************************************************************

*                   Generalconfiguration of LCD

**********************************************************************

*/

#define LCD_XSIZE          (800)      /* 屏X水平像素点 */

#define LCD_YSIZE          (480)      /* 屏Y水平像素点 */

#define LCD_BITSPERPIXEL   (16)     /* 16位色深*/

#define LCD_CONTROLLER     (-1)       /* 宏开关,使用LCDDriver下的模板 */

#define LCD_FIXEDPALETTE   (565)      /* R:5-G:6-B:5 */

#define LCD_SWAP_RB        (1)      /*RB颜色调换 */

#define LCD_SWAP_XY        (0)      /* 屏x,y方向不调换 */

#define LCD_INIT_CONTROLLER()   Display_Init()/* 屏驱动初始化接口 */

 

#endif /* LCDCONF_H */

 

打开GUITouchConf.h对触摸屏进行配置,笔者使用的是电容屏,驱动IC已处理好返回的触摸坐标值与屏像素坐标一一相应,也能够在移植后进行校准。

#ifndefGUITOUCH_CONF_H

#defineGUITOUCH_CONF_H

 

#define GUI_TOUCH_AD_LEFT    0   /* 触摸屏能返回最左边的值 */

#defineGUI_TOUCH_AD_RIGHT   800  /* 触摸屏能返回最右边的值 */

#defineGUI_TOUCH_AD_TOP     0    /* 触摸屏能返回最上面的值 */

#defineGUI_TOUCH_AD_BOTTOM  480  /* 触摸屏能返回最以下的值 */  

#defineGUI_TOUCH_SWAP_XY    0    /* 触摸屏x,y方向不调换  */

#defineGUI_TOUCH_MIRROR_X   0    /* 触摸屏x方向不镜像调换*/

#defineGUI_TOUCH_MIRROR_Y   0    /* 触摸屏y方向不镜像调换*/

 

#endif /*GUITOUCH_CONF_H */

3.2. LCDDriver文件夹

进入GUI->LCDDriver文件夹,需改动uCGUI关于实际LCD的底层接口调用。

因为我们在LCDConf.h里配置LCD_CONTROLLER为-1,这个宏开关会选择LCDTemplate.c这个模板文件进行编译,其他的接口文件不会被编译。LCDTemplate.c里面已经有相关的模板代码,仅仅需增加LCD_L0_SetPixelIndex()和LCD_L0_GetPixelIndex()的实现就可以,LCD_L0_SetPixelIndex设置LCD某一坐标的像素值,LCD_L0_GetPixelIndex从LCD某一坐标读出像素值,分别相应RGB屏驱动底层函数Display_SetPixel ()和Display_GetPixel()。增加这两个底层函数就可以。

LCD_L0_SetPixelIndex()改动后代码例如以下:

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {

  GUI_USE_PARA(x);

  GUI_USE_PARA(y);

  GUI_USE_PARA(PixelIndex);

  /* Convert logical into physicalcoordinates (Dep. on LCDConf.h) */

  #if LCD_SWAP_XY | LCD_MIRROR_X|LCD_MIRROR_Y

    int xPhys = LOG2PHYS_X(x, y);

    int yPhys = LOG2PHYS_Y(x, y);

  #else

    #define xPhys x

    #define yPhys y

  #endif

  /* Write into hardware ... Adapt toyour system */

  {

    Display_SetPixel(x, y, (unsignedshort)PixelIndex);

  }

}

LCD_L0_GetPixelIndex()改动后的代码例如以下:

unsigned int LCD_L0_GetPixelIndex(int x, int y) {

  LCD_PIXELINDEX PixelIndex;

  GUI_USE_PARA(x);

  GUI_USE_PARA(y);

  /* Convert logical into physicalcoordinates (Dep. on LCDConf.h) */

  #if LCD_SWAP_XY | LCD_MIRROR_X|LCD_MIRROR_Y

    int xPhys = LOG2PHYS_X(x, y);

    int yPhys = LOG2PHYS_Y(x, y);

  #else

    #define xPhys x

    #define yPhys y

  #endif

  /* Read from hardware ... Adapt toyour system */

  {

[1] [2]
关键字:S5PV210  uCGUI  移植 引用地址:S5PV210开发系列四_uCGUI的移植

上一篇:S5PV210开发系列八_Yaffs的移植
下一篇:S5PV210中断体系结构分析

推荐阅读最新更新时间:2026-03-20 10:48

S5PV210 移植无线wifi网卡 MT7601
一、准备工作 1、MT7601驱动下载 点击下载 2、插入usb WiFi 启动开发板linux,lsusb查看usb驱动 Bus 001 Device 003: ID 148f:7601看到的是该驱动的厂家设备信息 3、解压源码到linux下,确认USB的VID和PID,在rtusb_dev_id.c中 USB_DEVICE_ID rtusb_dev_id = { #ifdef RT6570 {USB_DEVICE(0x148f,0x6570)}, /* Ralink 6570 */ #endif /* RT6570 */ {USB_DEVICE(0x148f, 0x7650)}, /* MT7650 */ #ifdef
[单片机]
<font color='red'>S5PV210</font> <font color='red'>移植</font>无线wifi网卡 MT7601
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC
这节我们实现nand的ecc,保存环境变量到nand flash 中。然后把我们之前的led灯烧写到nand flash 中。开机启动。在 tiny210.h 中定义宏 CONFIG_S5PV210_NAND_HWECC、CONFIG_SYS_NAND_ECCSIZE、CONFIG_SYS_NAND_ECCBYTES CONFIG_SYS_NAND_ECCSIZE 定义了消息长度。即每多少字节进行 1 次 ECC 校验 CONFIG_SYS_NAND_ECCBYTES 定义为 13Byte,将 drivers/mtd/nand/s5pv210_nand.c 中的 CONFIG_S3C2410_NAND_HWECC 替换为CON
[单片机]
tiny210(<font color='red'>s5pv210</font>)<font color='red'>移植</font>u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC
kernel 2.6.35.7向S5PV210移植
ARCH和CROSS_COMPILE配置   不详述,改就对了。 错误1   未出现Uncompressing Linux... done, booting the kernel.。   解压地址应当等于链接地址,否则自解压之后不可运行。   链接的物理地址可以在head.S的开头看到。那么解压缩地址在哪呢? // 内核运行的虚拟地址 0xC0008000 #define KERNEL_RAM_VADDR (PAGE_OFFSET + TEXT_OFFSET) // 内核运行的物理地址 0x30008000 #define KERNEL_RAM_PADDR (PHYS_OFFSET + TEXT_OFFSET)   arc
[单片机]
S5PV210开发系列八_Yaffs的移植
Nand作为市面上最基本的非易失性闪存技术之中的一个,应用在各种固态大容量存储解决方式中。因为Nand flash自身的特点,Nand存储器往往须要一款专用的Nand文件系统进行管理。开源的Yaffs文件系统因为其优异的性能,在Nand flash中受到广泛的应用,笔者此处就Yaffs的移植作一个简单的介绍。 1. Yaffs概述 Yaffs是由Aleph One公司所发展出来的Nand flash文件系统,专门为Nand flash存储器设计,适用于大容量的存储设备。在GPL协议下公布,可在其官网上免费获得源代码。 Yaffs是基于日志的文件系统,提供了坏块管理、磨损平衡和掉电恢复的健壮性,保证数据在系统对文件系统改动的过程
[单片机]
第七章之S5PV210移植到Nandflash
1,之前的操作都是基于SD卡进行运行的,如今在Nandfalsh中运行u-boot.因为s5p_goni.h配置文件没有配置Nand相关文件,所以先配置Nand文件. 在include/configs/s5p_goni.h中添加一个:#define CONFIG_CMD_NAND 2,根据board_init_r函数中nand_init()如下图: 3,进行nand_init(); 4,所以配置文件还需要添加#defnie CONFIG_SYS_MAX_NAND_DEVICE 1,及其 nand基地址#define CONFIG_SYS_NAND_BASE  0xB0E00000 5,查看common/Makefi
[单片机]
第七章之<font color='red'>S5PV210</font><font color='red'>移植</font>到Nandflash
S5PV210开发 -- QT4.8 移植
今天应网友要求给他,生成一下nand平台的根文件系统。由此简单的来讲解一下。 一、安装交叉编译器 前面讲过了,参看:S5PV210开发 -- 交叉编译器 二、安装 QT4.8 源码包 将光盘中的 QT4.8 源码包 qt_x210v3s_160307.tar.bz2 拷贝到 ubuntu 的用户目录并解压: tar -xvf qt_x210v3s_160307.tar.bz2 接下来分为 Nand和iNand平台编译方式不一样的。 三、nand 平台移植 (1)编译uboot 执行如下指令编译: ./mk -un 在 release 目录下生成 uboot.bin (2)编译内核 执行如
[单片机]
<font color='red'>S5PV210</font>开发 -- QT4.8 <font color='red'>移植</font>
uCGUI 移植到S3C44B0X实验
一、实验目的 1. 初步掌握uCGUI底层硬件驱动函数; 2. 掌握将uCGUI移植到ARM S3C44BOX上的方法和步骤。 二、实验内容 移植uCGUI到ARM处理器S3C44BOX上,并编写Hello World程序,在Micetek 44B0实验平台的LCD上显示“Hello World!”字符串,在LCD显示平面坐标(20,20)处,显示一个小于10000的整数,该整数不断循环加1,每次加1后立即更新显示,从而反应出显示输出的速度。 三、预备知识 1. uCGUI的体系结构: uCGUI包含三个总的文件夹:ApplicaTIon,Config,GUI.其中: Ⅰ ApplicaTIon是应用程序的文件夹,它中间包含
[单片机]
菜鸟福利!STM32学习之uCGUI移植详解
以下内容大多是网上资源,我只做一些修改和结合,为的是能够方便更多的和我一样的菜鸟们搞懂GUI的移植。 第一部分:在UCGUI移植之前 在移植之前,首先要了解在网上下的UCGUI 3.98源码的文件结构是。 UCGUI 3.98源码中有三个文件夹: 1)“tool文件夹”是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的. 2)“sample文件夹”下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能. 3)“Start文件夹”里面,这是我们最主要的文件夹.里面就包含了uCG
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved