非常久没有关注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. 李维作答 《insideVCL》——李维实在很勤奋,而且勇于突破,从不以旧的内容充数

    (编者按)<Inside VCL(VCL核心架构剖析)>一书出版以来,众多热心读者给李维先生.博文视点公司.CSDN写来信件,有更多朋友在各个论坛上发表关于该书的言论.读者们不但盛赞该书, ...

  2. __declspec,__cdecl,__stdcall都是什么意思?有什么作用?

    __cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...

  3. 关于select

    select 1与select * 的区别:“selelct 常量 from 表名” 对应所有行,返回的永远只有一个值,即常量 ,所以一般只用来判断是否有表记录:而“select * from 表名” ...

  4. UVA - 11020 Efficient Solutions(Multiset)

    本题利用multiset解决.根据题意,如果我们用P(x,y)表示一个人,因为人可以相同,所以用multiset.我们会发现,如果所有人群都是有优势的,那么这些点呈现一个递减的趋势.如果刚刚插入一个人 ...

  5. 性能强悍的开源关系数据库PostgreSQL

    性能强悍的开源关系数据库PostgreSQL

  6. C#中按指定质量保存图片的实例代码 24位深度

     /// <summary>        /// 按指定的压缩质量及格式保存图片(微软的Image.Save方法保存到图片压缩质量为75)        /// </summary ...

  7. ASPNET程序中常用的三十三种代码

    1. 打开新的窗口并传送参数 response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.S ...

  8. CSS3 过渡

    通过 CSS3,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 请把鼠标移动到右侧的元素上: 浏览器支持 Internet E ...

  9. UVA 246 10-20-30

    题意: 给52张的扑克堆,先从左往右发7张牌,之后连续不断从左往右发7张牌,如果有牌堆形成了以下3种情况(按顺序判断):1.头两张+尾一张和为10或20或30.2.头一张+尾两张和为10或20或30. ...

  10. mysql 重启

    /etc/init.d/mysql restart /etc/init.d/mysql stop /etc/init.d/mysql start