码迷,mamicode.com
首页 > 其他好文 > 详细

【嵌入式程序设计】—— TP自适应

时间:2017-11-04 22:26:46      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:port   fine   minor   设备   power   else   des   stdin   conf   

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

当时调TP的时候,换了几个厂家,程序里要做自适应,还好TP控制器里都有唯一的特征值,所以可以识别出设备类型。这里都是i2c接口的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, 1);
    GPIO_PinOutSet(TP_REST_PORT, TP_REST_PIN);

    GPIO_PinModeSet(TP_INT_PORT,TP_INT_PIN, gpioModeInput,0);
    //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,0);
    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 =1000;
    while(--i);
    GPIO_PinOutClear(TP_REST_PORT, TP_REST_PIN);
    i =1000;
    while(--i);
    GPIO_PinOutSet(TP_REST_PORT, TP_REST_PIN);                  
}

static uint8_t search_device(void)
{
    uint8_t reset_data[4]={0};
    uint8_t tp_data[4]={0};
    
    tp_rest();
    uint32_t i= 6000000;
    while(--i);
    I2C->ReadBytesWithoutReg(0x15<<1,reset_data,4);
    if( (reset_data[0]==0x55) &&
        (reset_data[1]==0x55) &&
        (reset_data[2]==0x55) &&
        (reset_data[3]==0x55) 
       )
    {
        uint8_t fireware_id_cmd[4]=     {0x53, 0xf0, 0x00, 0x01};
        uint8_t fireware_id_major;
        uint8_t fireware_id_minor;
        uint16_t fireware_id;
        I2C->WriteBytesWithoutReg(0x15<<1,fireware_id_cmd,4);
        i=5000;
        while(--i);
        I2C->ReadBytesWithoutReg(0x15<<1,tp_data,4);
        fireware_id_major = ((tp_data[1]&0x0f)<<4) | ((tp_data[2]&0xf0)>>4) ;
        fireware_id_minor = ((tp_data[2]&0x0f)<<4) | ((tp_data[3]&0xf0)>>4) ;
        fireware_id = fireware_id_major<<8 | 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
        {
            tp_type  =  NULL;        
            GPIO_PinOutSet(TP_PW_PORT, TP_PW_PIN); //tp power down
            I2C->init();
            return 0;
        }
    }    
}


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=0;
        uint16_t *tp_y2=0;
        uint8_t tp_data[4]={0};
        uint8_t fireware_id_cmd[4]=     {0x53, 0xf0, 0x00, 0x01};
        uint8_t fireware_version_cmd[4]={0x53, 0x00, 0x00, 0x01};
        uint8_t boot_code_cmd[4]=       {0x53, 0x10, 0x00, 0x01};
        uint8_t x_resolution_cmd[4]=    {0x53, 0x60, 0x00, 0x00};
        uint8_t y_resolution_cmd[4]=    {0x53, 0x63, 0x00, 0x00};
        uint8_t tp_sleep_cmd[4]=        {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<<1,tp_data,8);
        *tp_x = ((uint16_t)((tp_data[1]&0xf0)<<4) | tp_data[2]) ;
        *tp_y = ((uint16_t)((tp_data[1]&0x0f)<<8) | tp_data[3]) ;
        
        //支持两点触碰
        //*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[4];
        uint8_t x_h=0, x_l=0, y_h=0, y_l=0;
        I2C->readbyte(I2C0, 0x7c, 0x03, &tp_data[0]);
        I2C->readbyte(I2C0, 0x7c, 0x04, &tp_data[1]);
        I2C->readbyte(I2C0, 0x7c, 0x05, &tp_data[2]);
        I2C->readbyte(I2C0, 0x7c, 0x06, &tp_data[3]);
        
        x_h= tp_data[0];
        x_l= tp_data[1];
        *tp_x = ((x_h <<8)&0xff)| x_l;
        y_h= tp_data[2];   
        y_l= tp_data[3];
        *tp_y = ((y_h <<8)&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=1,
    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

 

【嵌入式程序设计】—— TP自适应

标签:port   fine   minor   设备   power   else   des   stdin   conf   

原文地址:http://www.cnblogs.com/dong1/p/7784670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!