我的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应用点击响应慢!我开始不以为然,于是拿着网页版的试了试,好像确实有一定延迟,于是开始了研究,最后选择了 ...
随机推荐
- html5 web worker
A web worker is a JavaScript running in the background, without affecting the performance of the pag ...
- accel-pptp 部署
accel-pptp 是 pptp-client 和 pptpd 的改进版,使用内核 pptp 模块,相比 raw socket 实现方式能提供更好的性能. Ubuntu 12.04 上启用内核 ...
- cp | mv | rm
linux下文件的复制.移动与删除命令为:cp,mv,rm 一.文件复制命令cp 命令格式: cp [-adfilprsu] 源文件(source) 目标文件(destination) cp [opt ...
- HDU 1796 Howmany integers can you find (容斥原理)
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- 什么是OAuth
什么是OAuth 如今很多网站的功能都强调彼此间的交互,因此我们需要一种简单,标准的解决方案来安全的完成应用的授权,于是,OAuth应运而生,看看官网对其的定义: An open protocol t ...
- mvc3.0防止跨站点请求伪造(CSRF)攻击
众所周知,asp.net mvc程序在浏览器运行是产生标准的Html标签,包括浏览器要发送的关键数据等内容都在html内容里面.听起来不错,但是假如我们伪造类似的html内容,更改里面的关键数据,在浏 ...
- Leetcode:best_time_to_buy_and_sell_stock_II题解
一.题目 如果你有一个数组,它的第i个元素是一个股票在一天的价格. 设计一个算法,找出最大的利润. 二.分析 假设当前值高于买入值,那么就卖出,同一时候买入今天的股票,并获利.假设当前值低于买入值,那 ...
- 使用 Oracle Sql plus的一点经验
1 当你输入的语句有错误的时候,不用重新输入语句,直接输入ed就会出现一个文本文档显示之前输入的语句,这样你可以在文本文档里面修改语句,最后点保存. 2 三个set:设置每行显示的记录长度:SE ...
- js获取url传递参数的写法
获取url地址?后面参数值的写法 正则: function GetQueryString(name) { var reg = new RegExp("(^|&)"+ nam ...