最近又要求职了,梳理了下这两年折腾的东西,发现有个产品很可惜,都开发完了,但是废掉了没上市。中兴的一款手表,我很喜欢那个金属壳子,结实,拿在手里沉甸甸,可以用来砸核桃。

当时调TP的时候,换了几个厂家,程序里要做自适应,还好TP控制器里都有唯一的特征值,所以可以识别出设备类型。这里都是i2c接口的TP,如果接口不一样还得调整。高通也提供了linux/android下的驱动程序,用的上报机制,框架太庞大,没办法用在小CPU上。在前同事的基础上改造了下,还不够通用,如果今后再有机会用到TP,再优化吧。

TP驱动程序

tp_driver.c

#include "tp_driver.h"
#include "em_gpio.h"
#include "i2c_driver.h" static void tp_init(void)
{
GPIO_PinModeSet(TP_REST_PORT, TP_REST_PIN, gpioModePushPull, );
GPIO_PinOutSet(TP_REST_PORT, TP_REST_PIN); GPIO_PinModeSet(TP_INT_PORT,TP_INT_PIN, gpioModeInput,);
//GPIO_PinModeSet(TP_INT_PORT,TP_INT_PIN, gpioModeInputPullFilter,0); GPIO_IntConfig(TP_INT_PORT, TP_INT_PIN, false, true, true); GPIO_PinModeSet(TP_PW_PORT,TP_PW_PIN, gpioModeWiredAnd,);
GPIO_PinOutClear(TP_PW_PORT, TP_PW_PIN); } static void tp_rest(void)
{
GPIO_PinOutClear(TP_PW_PORT, TP_PW_PIN);
GPIO_PinOutSet(TP_REST_PORT, TP_REST_PIN);
uint32_t i =;
while(--i);
GPIO_PinOutClear(TP_REST_PORT, TP_REST_PIN);
i =;
while(--i);
GPIO_PinOutSet(TP_REST_PORT, TP_REST_PIN);
} static uint8_t search_device(void)
{
uint8_t reset_data[]={};
uint8_t tp_data[]={}; tp_rest();
uint32_t i= ;
while(--i);
I2C->ReadBytesWithoutReg(0x15<<,reset_data,);
if( (reset_data[]==0x55) &&
(reset_data[]==0x55) &&
(reset_data[]==0x55) &&
(reset_data[]==0x55)
)
{
uint8_t fireware_id_cmd[]= {0x53, 0xf0, 0x00, 0x01};
uint8_t fireware_id_major;
uint8_t fireware_id_minor;
uint16_t fireware_id;
I2C->WriteBytesWithoutReg(0x15<<,fireware_id_cmd,);
i=;
while(--i);
I2C->ReadBytesWithoutReg(0x15<<,tp_data,);
fireware_id_major = ((tp_data[]&0x0f)<<) | ((tp_data[]&0xf0)>>) ;
fireware_id_minor = ((tp_data[]&0x0f)<<) | ((tp_data[]&0xf0)>>) ;
fireware_id = fireware_id_major<< | fireware_id_minor;
if(fireware_id == 0x1AB0)
{
return TP_eWD1000;
}
}
else
{
uint8_t vendor_id;
I2C->readbyte(I2C0, 0x7c, 0xA8, &vendor_id);
if(vendor_id == 0x5f)
{
return TP_FT3X07;
}
else
{
GPIO_PinOutSet(TP_PW_PORT, TP_PW_PIN); //tp power down
I2C->init();
return ;
}
}
} static void ReadXY(uint16_t *tp_x,uint16_t *tp_y)
{
uint8_t tp_type = search_device();
if (tp_type == TP_eWD1000)
{
uint16_t *tp_x1=;
uint16_t *tp_y2=;
uint8_t tp_data[]={};
uint8_t fireware_id_cmd[]= {0x53, 0xf0, 0x00, 0x01};
uint8_t fireware_version_cmd[]={0x53, 0x00, 0x00, 0x01};
uint8_t boot_code_cmd[]= {0x53, 0x10, 0x00, 0x01};
uint8_t x_resolution_cmd[]= {0x53, 0x60, 0x00, 0x00};
uint8_t y_resolution_cmd[]= {0x53, 0x63, 0x00, 0x00};
uint8_t tp_sleep_cmd[]= {0x54, 0x50, 0x00, 0x01}; // 可以不用写信息
/*
I2C->WriteBytesWithoutReg(0x15<<1,x_resolution_cmd,4);
int i = 2000;
while(--i);
I2C->ReadBytesWithoutReg(0x15<<1,tp_data,8);
*tp_x = (tp_data[2]) | ((tp_data[3]&0xf0)<<4); I2C->WriteBytesWithoutReg(0x15<<1,y_resolution_cmd,4);
i = 2000;
while(--i);
I2C->ReadBytesWithoutReg(0x15<<1,tp_data,8);
*tp_y = (tp_data[2]) | ((tp_data[3]&0xf0)<<4); */
I2C->ReadBytesWithoutReg(0x15<<,tp_data,);
*tp_x = ((uint16_t)((tp_data[]&0xf0)<<) | tp_data[]) ;
*tp_y = ((uint16_t)((tp_data[]&0x0f)<<) | tp_data[]) ; //支持两点触碰
//*tp_x1 = ((uint16_t)((tp_data[4]&0xf0)<<4) | tp_data[5]) ;
//*tp_y2 = ((uint16_t)((tp_data[4]&0x0f)<<8) | tp_data[6]) ;
}
else if(tp_type == TP_FT3X07)
{
uint8_t tp_data[];
uint8_t x_h=, x_l=, y_h=, y_l=;
I2C->readbyte(I2C0, 0x7c, 0x03, &tp_data[]);
I2C->readbyte(I2C0, 0x7c, 0x04, &tp_data[]);
I2C->readbyte(I2C0, 0x7c, 0x05, &tp_data[]);
I2C->readbyte(I2C0, 0x7c, 0x06, &tp_data[]); x_h= tp_data[];
x_l= tp_data[];
*tp_x = ((x_h <<)&0xff)| x_l;
y_h= tp_data[];
y_l= tp_data[];
*tp_y = ((y_h <<)&0xff)| y_l;
}
else
{
}
} static void tp_int_enable(void)
{
GPIO_IntConfig(TP_INT_PORT, TP_INT_PIN, true, true, true);
} static void tp_int_disable(void)
{
GPIO_IntConfig(TP_INT_PORT, TP_INT_PIN, true, true, false);
} static void tp_sleep(void){
//I2C->writebyte(I2C0, 0x7c, 0xa5, 0x03);
GPIO_PinOutSet(TP_PW_PORT, TP_PW_PIN);
}
TP_T TP_D=
{
tp_init,
tp_rest,
search_device,
ReadXY,
tp_int_enable,
tp_int_disable,
tp_sleep, };
TP_T *TP=&TP_D;

tp_driver.h

#ifndef __TOUCH_DRIVER_H
#define __TOUCH_DRIVER_H
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h> enum tp_type_t{ TP_FT3X07=,
TP_eWD1000 }; #define TOUCH_PANNEL_ADDR (0x7C) #define TP_INT_PORT (gpioPortA)
#define TP_INT_PIN (3) #define TP_PIN_IS_HI() ( ( GPIO->P[TP_INT_PORT].DIN & (0x1<<TP_INT_PIN)) == (0x1<<TP_INT_PIN))
#define TP_PIN_IS_LO() ( ( GPIO->P[TP_INT_PORT].DIN & (0x1<<TP_INT_PIN)) == 0x0 ) #define TP_REST_PORT (gpioPortA)
#define TP_REST_PIN (4) #define TP_PW_PORT (gpioPortE)
#define TP_PW_PIN (15) typedef struct
{
void (*init)(void);
void (*rest)(void);
void (*search_device)(void);
void (*ReadXY)(uint16_t *tp_x,uint16_t *tp_y);
void (*int_enable)(void);
void (*int_disable)(void);
void (*sleep)(void);
}TP_T; extern TP_T *TP; #endif

GUI导入,这里用的emWin,其他GUI也类似。

tp_driver_bsp.c

#include "GUI.h"
#include "touch_bsp.h"
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tp_driver.h" #define TP_X_OFFSET (18)
#define TP_Y_OFFSET (18) #define TP_MAPTO_LCD_LENGHT (94) void GetTouchXY(int16_t *Xmotion,int16_t *Ymotion)
{
TP->ReadXY(&x,&y);
if(tp_type == TP_eWD1000)
{
if(x==||y==)
return;
if(x==||y==)
return;
else
{
x=((TP_eWD1000_MAX_X-x)*LCD_MAX_X)/TP_eWD1000_MAX_X;
y=((TP_eWD1000_MAX_Y-y)*LCD_MAX_Y)/TP_eWD1000_MAX_Y;
}
}
else
{
if(x==||y==)
return;
if(x==0x00ff||y==0x00ff)
return;
else
{
#if 1
//触摸区域为内切矩形
x=((x)*TP_MAPTO_LCD_LENGHT)/TP_FT3X07_MAX_X+TP_X_OFFSET;
y=((y)*TP_MAPTO_LCD_LENGHT)/TP_FT3X07_MAX_Y+TP_Y_OFFSET;
#else
//触摸区域为全屏
x=((x)*LCD_MAX_X)/TP_FT3X07_MAX_X;
y=((y)*LCD_MAX_Y)/TP_FT3X07_MAX_Y; #endif
}
}
GUI_TOUCH_StoreState(x, y);
*Xmotion=x;
*Ymotion=y;
}

tp_driver_bsp.h

#ifndef __TOUCH_BSP_H
#define __TOUCH_BSP_H #include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tp_driver.h" #define TP_eWD1000_MAX_X (1024)
#define TP_eWD1000_MAX_Y (1024) #define TP_FT3X07_MAX_X (127)
#define TP_FT3X07_MAX_Y (127) #define LCD_MAX_X (127)
#define LCD_MAX_Y (127) #define TP_SCAN_INTERVAL (25) extern void GetTouchXY(int16_t *Xmotion,int16_t *Ymotion); #endif

TP自适应的更多相关文章

  1. [cocos2d-x]针对不同的设备,选取不同的自适应图片

    前言: 我们在进行移动设备开发的时候,我们常常会准备不同大小的图片资源以适应不同大小的设备,下面我称普清图片资源和高清图片资源.那么如何做到图片资源的自适应呢?下面我来用一个demo展示一下这个效果的 ...

  2. tp剩余未验证内容-4

    关于pop-up被blocked的问题 首先 这个pop-up的功能叫 popup blocker , 它是浏览器(包括ff, chrome等) 自身 所内置 的一个功能, 不是 安装的外部 插件/或 ...

  3. tp剩余未验证内容

    new Image(宽度,高度) $(image).attr('src', ...).load(function(){....}) load表示浏览器从服务器下载(装载)对象完成, 这个load方法很 ...

  4. web前端响应式布局,自适应全部分辨率

    写phpd的我. 近期公司要弄个app关键是没有web开发,而我有比較闲,那就扛枪上阵吧. 响应式布局,web端的?php我一直都是用tp框架,对于web首先想到的是bootstrap框架.仅仅是简单 ...

  5. HDU - 1724 Ellipse 自适应辛普森模板

    OJ 题解传送门 //Achen #include<algorithm> #include<iostream> #include<cstring> #include ...

  6. BACnet MS/TP转MQTT网关金鸽BL103

    BACnet MS/TP转MQTT网关金鸽BL103BL103是一款BACnet路由器,实现 BACnet MS/TP 总线和以太网 BACnetIP 之间通信路由功能,同时也是一款Modbus RT ...

  7. div实现自适应高度的textarea,实现angular双向绑定

    相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...

  8. iOS开发之多种Cell高度自适应实现方案的UI流畅度分析

    本篇博客的主题是关于UI操作流畅度优化的一篇博客,我们以TableView中填充多个根据内容自适应高度的Cell来作为本篇博客的使用场景.当然Cell高度的自适应网上的解决方案是铺天盖地呢,今天我们的 ...

  9. 浅谈Web自适应

    前言 随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难, ...

随机推荐

  1. C/C++中printf和C++中cout的输出格式

    一. Printf 输出格式 C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项.各项的意义介绍如下:1.类型类型字符用以表示输出数据的类型, ...

  2. hadoop杂记-为什么会有Map-reduce v2 (Yarn)

    转自:http://www.cnblogs.com/LeftNotEasy/archive/2012/02/18/why-yarn.html 前言: 有一段时间没有写博客了(发现这是我博客最常见的开头 ...

  3. 十步理解Sql

    很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语言.甚至是函数语言(尽管有些人认为 SQL 语言也是一种函数式语言) ...

  4. CefGlue 学习杂记

    1. hg clone代码回来后,还要下载对应的cef dll .  从http://xilium.bitbucket.org/cefglue/ 选择对应的. 然后把dll和resource目录里的内 ...

  5. linux配置防火墙打开3306端口

      安装完MYSQL服务器后在本机所有操作都正常, 但在其它机器上远程访问这个MYSQL服务器时怎么都连接不上.  shit! 怀疑是端口问题, 结果: telnet 192.168.1.245 33 ...

  6. 搭建 Docker-Registry 私有仓库

    官方已经提供了很多版本的 Linux 镜像,直接从官方仓库(Public Repositories)下载就可以了.如果考虑到安全性和速度,我们可能会想在自己局域网里架设一个私有仓库(Private R ...

  7. 集成学习AdaBoost算法——学习笔记

    集成学习 个体学习器1 个体学习器2 个体学习器3   ——> 结合模块  ——>输出(更好的) ... 个体学习器n 通常,类似求平均值,比最差的能好一些,但是会比最好的差. 集成可能提 ...

  8. 编程之美 set 5 寻找数组中最大值和最小值

    解法 1. 设置 min, max 两个变量, 然后遍历一遍数组, 比较次数为 2*N 2. 依然设置 min, max 两个变量并遍历数组, 但将遍历的 step 设置为 2, 比较次数为 1.5 ...

  9. Windows远程桌面没有密码的电脑

    你如果想远程一个密码为空的机器,默认情况下是不可以的,需要进行以下设置 1.windows家庭版不支持远程桌面 2. 3.搜索“本地安全策略”

  10. Linux命令之乐--cat

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 命令参数: -A, --show-all  ...