非常久没有关注RTOS了,所以也一直没有更新。近期闲了,把GPIO I2C调通了。简单移植了Touch。在S5PV210上使用。

调试I2C时。废了非常多周折,最后借助示波器才发现一个小小的错误。折腾了非常久非常久。

简要说下步骤:

1、首先I2C驱动,使用GPIO I2C的方式

#include <stdio.h>
#include <touch.h> #define DELAY 10 #define SDA 0
#define SCL 1 #define GPD1CON (*(volatile unsigned long *) 0xE02000C0)
#define GPD1DAT (*(volatile unsigned long *) 0xE02000C4)
#define GPD1PUD (*(volatile unsigned long *) 0xE02000C8)
#define GPD1DRV (*(volatile unsigned long *) 0xE02000CC) #define SDA2_SET_INPUT (GPD1CON &= ~(0xf<<16))
#define SDA2_SET_OUTPUT (GPD1CON = (GPD1CON & (~(0x0f<<16))) | (0x1<<16))
#define SCL2_SET_INPUT (GPD1CON &= ~(0xf<<20));
#define SCL2_SET_OUTPUT (GPD1CON = (GPD1CON & (~(0x0f<<20))) | (0x1<<20)) #define SDA2_SET_VALUE(x) (GPD1DAT = (GPD1DAT & ~(1<<4)) | (x << 4))
#define SCL2_SET_VALUE(x) (GPD1DAT = (GPD1DAT & ~(1<<5)) | (x << 5)) #define SDA2_GET_VALUE ((GPD1DAT & (1<<4)) > 0 ? 1:0)
#define SCL2_GET_VALUE ((GPD1DAT & (1<<5)) > 0 ? 1:0) void gpio_i2c_init(void)
{
GPD1DRV = (GPD1DRV & ~(0x5 << 10) | (0x5 << 10));
GPD1PUD = (GPD1DRV & ~(0xf << 10) | 0xa << 10);
SCL2_SET_OUTPUT;
SDA2_SET_OUTPUT;
SDA2_SET_VALUE(1);
SCL2_SET_VALUE(1); }
void i2c_start(void)
{
SCL2_SET_OUTPUT;
SDA2_SET_OUTPUT;
SDA2_SET_VALUE(1);
SCL2_SET_VALUE(1); udelay(DELAY); SDA2_SET_VALUE(0);
udelay(DELAY); SCL2_SET_VALUE(0);
udelay(DELAY);
} void i2c_stop(void)
{
SCL2_SET_OUTPUT;
SDA2_SET_OUTPUT;
SDA2_SET_VALUE(0);
SCL2_SET_VALUE(0);
udelay(DELAY); SCL2_SET_VALUE(1);
udelay(DELAY);
SDA2_SET_VALUE(1);
udelay(DELAY);
} void i2c_send_ack(unsigned char ack)
{
SCL2_SET_OUTPUT;
SDA2_SET_OUTPUT; if(ack)
SDA2_SET_VALUE(1);
else
SDA2_SET_VALUE(0);
udelay(DELAY); SCL2_SET_VALUE(1);
udelay(DELAY); SCL2_SET_VALUE(0);
udelay(DELAY);
} char i2c_receive_ack(void)
{
char rc = 0; SCL2_SET_OUTPUT;
SDA2_SET_INPUT; SCL2_SET_VALUE(1);
udelay(DELAY); if(SDA2_GET_VALUE) {
rc = 1;
}
SCL2_SET_VALUE(0);
SDA2_SET_OUTPUT;
SDA2_SET_VALUE(1);
return rc;
} unsigned char i2c_send_byte(unsigned char send_byte)
{
unsigned char rc = 0;
unsigned char out_mask = 0x80;
unsigned char value;
unsigned char count = 8; SDA2_SET_OUTPUT;
SCL2_SET_OUTPUT; while(count > 0) {
value = ((send_byte & out_mask) ? 1 : 0);
if (value == 1) {
SDA2_SET_VALUE(1);
}
else {
SDA2_SET_VALUE(0);
}
udelay(DELAY); SCL2_SET_VALUE(1);
udelay(DELAY); SCL2_SET_VALUE(0);
udelay(DELAY); out_mask >>= 1;
count--;
} SDA2_SET_VALUE(1);
rc = i2c_receive_ack();
return rc;
} void i2c_read_byte(unsigned char *buffer, unsigned char ack)
{
unsigned char count = 0x08;
unsigned char data = 0x00;
unsigned char temp = 0; SDA2_SET_INPUT;
SCL2_SET_OUTPUT; while(count > 0) {
SCL2_SET_VALUE(1);
udelay(DELAY);
temp = SDA2_GET_VALUE;
data <<= 1;
if (temp)
data |= 0x01;
SCL2_SET_VALUE(0);
udelay(DELAY);
count--;
}
i2c_send_ack(ack);//0 = ACK 1 = NACK
*buffer = data;
} int gpio_i2c_master_send(unsigned int SlaveAddr, unsigned char *Data, unsigned int length)
{
unsigned int i, j;
int rc; SlaveAddr = (SlaveAddr << 1) & ~0x01; i2c_start();
rc = i2c_send_byte(SlaveAddr);
if(rc){
printf("i2c_send_byte no ack 1\n");
return -1;
} for(j = 0; j < length; j++) {
rc = i2c_send_byte(Data[j]);//发送data
if(rc){
printf("i2c_send_byte no ack 2\n");
return -1;
}
}
i2c_stop();//停止信号
udelay(10);
return 0;
} int gpio_i2c_master_recv(unsigned int SlaveAddr, unsigned char *Data, unsigned int length)
{
unsigned int i, j;
unsigned int data;
int rc; SlaveAddr = (SlaveAddr << 1) | 0x01; i2c_start(); rc = i2c_send_byte(SlaveAddr);
if(rc) {
printf("i2c_read_byte no ack 1\n");
return -1;
} for(j=0; j<length; j++){
i2c_read_byte(Data++, !(length - j -1));//读取数据;
} i2c_stop();//停止信号
return length;
} int i2c_read_data(unsigned int SlaveAddr,
char *reg, unsigned char *values, int length)
{
int ret;
int count = 0;
retry:
/* select register*/
ret = gpio_i2c_master_send(SlaveAddr, reg , 1);
if (ret < 0) {
udelay(DELAY * 2); if (++count < 2)
goto retry; return ret;
}
/* for setup tx transaction. */
udelay(DELAY);
ret = gpio_i2c_master_recv(SlaveAddr, values , length);
if (ret < 0)
return ret; udelay(DELAY);
return length;
}

2、Touch驱动

Touch IC为 FT5406, slave地址为0x70.

借助博友的一页芯片资料,写了最简单的单点读取:

多点也非常easy。能够參考android 多点触控协议上报点

#include <touch.h>
#include <exception.h> struct touch_data touch_data; int touch_irq()
{
int i;
int num = 0;
int x, y;
char reg[1] = {0};
unsigned char buf[10]; i2c_read_data(0x38, reg, buf, 7); if((num = (buf[2] & 0x0f)) == 0)
{
if(touch_data.isPress)
{
touch_data.isPress = 0;
touch_data.x = -1;
touch_data.y = -1;
touch_event(touch_data.x, touch_data.y);
}
//printf("release\r\n");
return 0;
}
x = (buf[3]&0x0f) << 8 | buf[4];
y = (buf[5]&0x0f) << 8 | buf[6];
//printf("num:%d, x:%d, y:%d\r\n", num, x, y);
touch_data.x = x;
touch_data.y = y;
if(touch_data.isPress == 0)
touch_data.isPress = 1;
touch_event(touch_data.x, touch_data.y);
return 0;
} void touch_init(void)
{
unsigned char uc_reg_value;
unsigned char uc_reg_addr;
unsigned char buf[1];
unsigned char dst[1]; touch_int_setup(); i2c_read_data(0x38, buf, dst, 1);
printf("touch fw:0x%x\r\n", dst[0]);
buf[0] = 0x88;
i2c_read_data(0x38, buf, dst, 1);
printf("report rate:0x%x\r\n", dst[0] * 10);
buf[0] = 0x80;
i2c_read_data(0x38, buf, dst, 1);
printf("touch threshold:0x%x\r\n", dst[0] * 4); intc_enable(NUM_EINT14);
}

在touch_init 初始化中可以取到touch固件信息。就说明i2c通信正常了。

3、看下效果^^

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1amlhMjEwMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1amlhMjEwMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

最后两张的动画比較卡。

4:、存在问题及缺点

因为是电容屏,中断出发,触摸的时候。会不停的上报中断,会导致其它线程block。发生卡顿的情况,尤其画面比較复杂的时候。后期能够採取查询的方法,放在单独的线程其中或者减少touch的报点率;

另外就是lcd仅仅有一层framebuffer,多层显示倒是ucgui的效率低下,后期优化能够同一时候打开至少两个framebuffer。

5、源代码

http://download.csdn.net/detail/liujia2100/8859911

后期尝试移植lwip,搭配arduino。物联网^^.

我的RTOS 之六 -- Touch移植(s5pv210+threadx+ucgui+touch)的更多相关文章

  1. 百度touch的手势框架,touch.js

    今天,随便搜搜看到了一个新的手势库,也许能让我为现在使用者的hammer.js的手势库带来的烦恼而消除. 它是百度团队开发的,现在由百度云Clouda进行维护. 官网   http://touch.c ...

  2. sencha touch 入门系列 (九) sencha touch 布局layout

    布局用来描述你应用程序中组件的大小和位置,在sencha touch中,为我们提供了下面几种布局: 1.HBox: HBox及horizontal box布局,我们这里将其称为水平布局,下面是一段演示 ...

  3. [Phonegap+Sencha Touch] 移动开发18 Sencha Touch项目通过phonegap打包后的程序名字的问题

    之前说过 sencha phonegap init com.pushsoft.myapp MyApp 之后打包的程序安装包apk的名字是"MyApp.apk",显示在手机桌面上的程 ...

  4. S5PV210开发系列四_uCGUI的移植

    S5PV210开发系列四 uCGUI的移植 象棋小子          1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...

  5. 3D Touch ? 木有6s,也阔以玩!!!

    3D Touch 之 Peek & Pop 3D Touch 是iOS9之后专为 iPhone6s 机型加入的新特性,这一新技术移植于 Mac Book 上的 ForceTouch 更准确地说 ...

  6. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件

    X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...

  7. Touch 方法&属性 映射工具

    Touch 方法&属性 映射工具(0.5 版本) 标签 : github 线上后门与接口调试: 原先需要测试一个接口(如Dubbo.DAO), 或为线上留后门, 需要写大量的Web层(Api. ...

  8. UC浏览器中touch事件的异常记录

    以前也在UC上面栽过几个坑,不过都是页面显示方面的.上个周的时候,商品详情页重做,要添加个上拉显示详情的效果. 有两个条件需要判断: 1.是否到达底部: 2.到达底部之后拖动的y轴距离. 效果写完后, ...

  9. 手持设备点击响应速度,鼠标事件与touch事件的那些事

    前言 现在一直在做移动端的开发,这次将单页应用的网页内嵌入了app,于是老大反映了一个问题:app应用点击响应慢!我开始不以为然,于是拿着网页版的试了试,好像确实有一定延迟,于是开始了研究,最后选择了 ...

随机推荐

  1. 在IE浏览器中iframe跨域访问cookie/session丢失的解决办法

    单点登录需要在需要进入的子系统B中添加一个类,用于接收A系统传过来的参数: @Action(value = "outerLogin", results = { @Result(na ...

  2. 伪造 UDP 包源 IP 地址

    Raw sockets 方式 raw socket 可通过参数  IPV6_HDRINCL 或 IP_HDRINCL 自定义IP头——伪造UDP报文源IP就全靠它了. 限制:从xp sp2之后的所有非 ...

  3. [Leetcode][Python]52: N-Queens II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 52: N-Queens IIhttps://oj.leetcode.com/ ...

  4. HDOJ-1007 Quoit Design(最近点对问题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 给出n个玩具(抽象为点)的坐标 求套圈的半径 要求最多只能套到一个玩具 实际就是要求最近的两个坐标的距离 ...

  5. 解决ZBarSDK 中文出现乱码

    使用ZBarSDK进行二维码解释时出现乱码是因为ZBarSDK在解释时使用的字符集不对,需在ZBarSDK的源码中更正. 1.可以到http://sourceforge.net/p/zbar/_lis ...

  6. 无限的路_hdu_2073(AC).java

    无限的路 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. hdu4331 Image Recognition 就暴力啊。。啊。。

    题意: 给一个1和0组成的正方形矩阵,求 四条边都由1构成的正方形的个数. 方法: 先统计矩阵中每一点,向四个方向,最多有多少个连续的1,这里用dp做也 与此同时,顺便求下 能向右下和 左上 两个方向 ...

  8. 浅析WebGIS

    浅析WebGIS 摘要:随着网络的发展,利用Web公布信息越来越普及化.而地理信息系统(GIS)与网络的结合就产生了万维网地理信息系统(WebGIS),它引起了地理信息公布的新的变革,对实现GIS信息 ...

  9. IOC原理分析

    IOC(inversion of control)控制反转 在我们的程序中,要实现某个功能,我们都会用到两个或两个以上的类来协同完成,那么在一个类中,我们就会要有它的合作类的引用,也就是说这个类依赖于 ...

  10. 《Effective C++ 》学习笔记——条款03

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...