我的RTOS 之六 -- Touch移植(s5pv210+threadx+ucgui+touch)
非常久没有关注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)的更多相关文章
- 百度touch的手势框架,touch.js
今天,随便搜搜看到了一个新的手势库,也许能让我为现在使用者的hammer.js的手势库带来的烦恼而消除. 它是百度团队开发的,现在由百度云Clouda进行维护. 官网 http://touch.c ...
- sencha touch 入门系列 (九) sencha touch 布局layout
布局用来描述你应用程序中组件的大小和位置,在sencha touch中,为我们提供了下面几种布局: 1.HBox: HBox及horizontal box布局,我们这里将其称为水平布局,下面是一段演示 ...
- [Phonegap+Sencha Touch] 移动开发18 Sencha Touch项目通过phonegap打包后的程序名字的问题
之前说过 sencha phonegap init com.pushsoft.myapp MyApp 之后打包的程序安装包apk的名字是"MyApp.apk",显示在手机桌面上的程 ...
- S5PV210开发系列四_uCGUI的移植
S5PV210开发系列四 uCGUI的移植 象棋小子 1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...
- 3D Touch ? 木有6s,也阔以玩!!!
3D Touch 之 Peek & Pop 3D Touch 是iOS9之后专为 iPhone6s 机型加入的新特性,这一新技术移植于 Mac Book 上的 ForceTouch 更准确地说 ...
- X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件
X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...
- Touch 方法&属性 映射工具
Touch 方法&属性 映射工具(0.5 版本) 标签 : github 线上后门与接口调试: 原先需要测试一个接口(如Dubbo.DAO), 或为线上留后门, 需要写大量的Web层(Api. ...
- UC浏览器中touch事件的异常记录
以前也在UC上面栽过几个坑,不过都是页面显示方面的.上个周的时候,商品详情页重做,要添加个上拉显示详情的效果. 有两个条件需要判断: 1.是否到达底部: 2.到达底部之后拖动的y轴距离. 效果写完后, ...
- 手持设备点击响应速度,鼠标事件与touch事件的那些事
前言 现在一直在做移动端的开发,这次将单页应用的网页内嵌入了app,于是老大反映了一个问题:app应用点击响应慢!我开始不以为然,于是拿着网页版的试了试,好像确实有一定延迟,于是开始了研究,最后选择了 ...
随机推荐
- 注册flash.ocx inno setup (转)
; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "xx模块" #de ...
- C语言的本质(18)——函数的可变参数
一般而言,在设计函数时会遇到许多数学和逻辑操作,是需要一些可变功能.例如,计算数字串的总和.字符串的联接或其它操作过程. 实现一个函数,要求在函数中计算传入的所有参数之和,并输出到屏幕上.这个函数实现 ...
- UML_交互图
交互图(Interaction Diagram)用来描述系统中的对象是如何进行相互作用的.即一组对象是如何进行消息传递的. 当交互图建模时,通常既包括对象(每个对象都扮演某一特定的角色),又包括消息( ...
- VRay 2.0 SP1 2.10.01 for 3ds max 9/2008/2009/2010/2011/2012 32/64位 顶渲简体中文版+英文版[中国室内设计论坛-室内人]
VRay 2.0 SP1 2.10.01 for 3ds max 9/2008/2009/2010/2011/2012 32/64位 顶渲简体中文版+英文版[中国室内设计论坛-室内人] 对最新版本的V ...
- [IOS]UIWebView 请求网络页面或者加载本地资源页面
UIWebView是一个能够显示网页的IOS视图控件,我们可以用它来访问一个网站.下面是具体的实例: 操作步骤: 1.首先在xib文件中拖放一个UIWebView控件到view中 2.将下载的页面以及 ...
- 网易云课堂_C++开发入门到精通_章节2:引用和函数的高级用法
课时6函数重载 函数重载 在C语言头文件中的extern "C" //常见的C语言头文件格式 #ifndef _FUNC_ #define _FUNC_ #ifdef __cplu ...
- hdu 2851(最短路)
点击打开链接 竟然是最短路!!!! 藏的好深啊 /* 求从路1走到路i的最小危险值, 给出n条路的起点和终点,当i,j两路有重合的,我们使map[i][j]=v[j]: 把路当作最短路中的点,如果有重 ...
- K-近邻算法python实现
内容主要来源于机器学习实战这本书.加上自己的理解. 1.KNN算法的简单描写叙述 K近期邻(k-Nearest Neighbor.KNN)分类算法能够说是最简单的机器学习算法了. 它採用測量不同特征值 ...
- scanf与printf用法详解
一.scanf家族 1.scanf家族的原型 int scanf(char const *format,...); int fscanf(FILE *stream,char const *format ...
- 好用的侧边栏菜单/面板jQuery插件
我想大家都用过一些APP应用,它们的菜单展示是以侧边栏滑动方式展现,感觉很新鲜,而现在网页设计也是如此,不少网站也效仿这样的方式来设计.使用侧边栏的好处就是可以节约空间,对于一些内容多或者喜欢简约的网 ...