Mi10Pro_ISP568_FHD_BC/src/app/demo/app_tp_transfer.c

883 lines
30 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*******************************************************************************
*
*
* File: app_tp_transfer.c
* Description touch I2C/SPI 初始化、以及数据通信
* Version V0.1
* Date 2021-10-14
* Author zhanghz
*******************************************************************************/
#include "test_cfg_global.h"
#include "app_tp_transfer.h"
#include "hal_i2c_master.h"
#include "hal_i2c_slave.h"
#include "hal_spi_master.h"
#include "hal_spi_slave.h"
#include "tau_log.h"
#include "tau_delay.h"
#include "ap_demo.h"
#include "app_tp_st_touch.h"
#if 1//def AP_TP_TRANSFER
uint8_t read_point; //当前要读的报点数。一个报点8BYTE数据
uint8_t s_screen_number[2];
uint8_t s_screen_temp[2];
uint8_t s_screen_read_bak[80];
static uint8_t s_screen_read_buffer[BUFFER_SIZE_MAX];
static uint8_t s_phone_read_buffer[BUFFER_SIZE_MAX];
uint8_t s_screen_read_MI10Pro[8];
uint8_t s_screen_read_MI10Pro_1[100];
static bool s_spim_write = false; //记录SPI主机是否配置发送是的话需要清除RXFIFO
static bool s_screen_int_flag = false; //记录是否接收到屏幕的报点中断
static bool s_phone_reset_flag = false; //记录是否接收到手机的开机复位信号
static bool s_screen_int_transfer_status = false; //记录是否已经开始通信
bool s_screen_init_complate = false; //屏幕TP开机初始化完成标志
static uint8_t s_screen_const_transfer_count = 0xff; //记录当前通信到哪一步,初始值必须大于 screen_reg_start_data_size
#ifdef USE_FOR_SUMSUNG_S20
uint16_t u16TouchID;
#endif
static void app_tp_transfer_phone(size_t recieve_num);
//static void app_tp_reset_callback(void *data);
#if PHONE_SLAVE_TRANSFER_I2C //消除warning
static void app_tp_i2cs_callback(e_i2c_s_int_status int_status, size_t recieve_num);
#endif
#if PHONE_SLAVE_TRANSFER_SPI //消除warning
static void app_tp_spis_callback(hal_spis_event_e event, hal_spi_packet_info_t *packet_info);
#endif
#ifdef USE_FOR_MI10_PRO
uint8_t MI10_PRO_screen_init_data1[3] = {0xA0,0x00,0x01};
uint8_t MI10_PRO_screen_init_data2[6] = {0xA2,0x03,0x00,0x00,0x00,0x03};
uint8_t MI10_PRO_screen_init_data3[3] = {0xA2,0x02,0x00};
uint8_t MI10_PRO_screen_init_data4[3] = {0xC0,0x07,0x01};
uint8_t MI10_PRO_screen_init_data5[3] = {0xA4,0x06,0x70};
uint8_t MI10_PRO_screen_init_data6[3] = {0xA6,0x00,0x00};
uint8_t MI10_PRO_screen_init_data7[5] = {0xFA,0x20,0x00,0x00,0x78};
uint8_t MI10_PRO_screen_init_data8[6] = {0xA2,0x03,0x20,0x00,0x00,0x00};
uint8_t MI10_PRO_screen_init_data9[2] = {0xA0,0x01};
uint8_t MI10_PRO_screen_init_data10[3] = {0xA0,0x00,0x00};
uint8_t MI10_PRO_screen_init_data11[3] = {0xC0,0x07,0x00};
uint8_t MI10_PRO_screen_init_data12[3] = {0xA4,0x00,0x00};
#endif
#if 0//def ADD_TP_TUNING
uint8_t MI10_PRO_TP_Tuning_data1[3] = {0xA4,0x00,0x00}; // System Reset
uint8_t MI10_PRO_TP_Tuning_data2[3] = {0xA4,0x00,0x03}; // FPnl Init
uint8_t MI10_PRO_TP_Tuning_data3[3] = {0xA4,0x00,0x02}; // Pnl Init
uint8_t MI10_PRO_TP_Tuning_data4[4] = {0xA4,0x03,0x13,0x00}; // TuneM
uint8_t MI10_PRO_TP_Tuning_data5[4] = {0xA4,0x03,0x0C,0x00}; // TuneS
uint8_t MI10_PRO_TP_Tuning_data6[3] = {0xA4,0x05,0x01}; // SvCfg
uint8_t MI10_PRO_TP_Tuning_data7[3] = {0xA4,0x05,0x02}; // SvCx
uint8_t MI10_PRO_TP_Tuning_data8[3] = {0xA4,0x05,0x04}; // SvPnl
#endif
/**************************************************************************
* @name : app_tp_screen_int_callback
* @brief : screen 报点中断 回调函数
* @param[in] :
* @return :
* @retval :
**************************************************************************/
static void app_tp_screen_int_callback(void *data)
{
s_screen_int_flag = true;
}
/**************************************************************************
* @name : app_tp_screen_int_lvl_low
* @brief : 获取 screen 报点中断 IO 电平
* @param[in] :
* @return : trueIO 为低电平
* @retval :
**************************************************************************/
static bool app_tp_screen_int_lvl_low(void)
{
#if SCREEN_MASTER_TRANSFER_I2C
return false;
#elif SCREEN_MASTER_TRANSFER_SPI
return !hal_gpio_get_input_data(g_screen_input_int_pad); //应对SPI主机通信过程中偶尔突然拉低CS 导致通信异常
#else
return false;
#endif
}
/**************************************************************************
* @name : app_tp_screen_int_init
* @brief : screen 报点中断 IO 初始化
* @param[in] :
* @return :
* @retval :
**************************************************************************/
static void app_tp_screen_int_init(void)
{
hal_gpio_set_pull_state(g_screen_input_int_pad, ENABLE, DISABLE); // 1.配置上拉
hal_gpio_ctrl_eint(g_screen_input_int_pad, DISABLE); // 2.关闭中断
hal_gpio_init_eint(g_screen_input_int_pad, DETECT_FALLING_EDGE); // 3.中断初始化,TP一般都是下降沿触发中断
hal_gpio_reg_eint_cb(g_screen_input_int_pad, app_tp_screen_int_callback); // 4.注册回调
hal_gpio_ctrl_eint(g_screen_input_int_pad, ENABLE); // 5.使能中断
}
#if 0
/**************************************************************************
* @name : app_tp_phone_reset_init
* @brief : phone reset 中断 IO 初始化
* @param[in] :
* @return :
* @retval :
**************************************************************************/
static void app_tp_phone_reset_init(void)
{
/*0.配置为输入*/
hal_gpio_init_input(g_phone_input_rst_pad);
/*1.关闭中断*/
hal_gpio_ctrl_eint(g_phone_input_rst_pad, DISABLE);
/*2.中断初始化*/
hal_gpio_init_eint(g_phone_input_rst_pad, DETECT_RISING_EDGE);
/*3.注册回调*/
hal_gpio_reg_eint_cb(g_phone_input_rst_pad, app_tp_reset_callback);
/*4.使能中断*/
hal_gpio_ctrl_eint(g_phone_input_rst_pad, ENABLE);
}
#endif
/**************************************************************************
* @name : app_tp_screen_init
* @brief : screen IO 跳变,开始初始化
* @param[in] :
* @return :
* @retval :
**************************************************************************/
void app_tp_screen_init(void)
{
hal_gpio_init_output(g_screen_input_rst_pad, IO_LVL_HIGH);
delayUs(200);
hal_gpio_set_output_data(g_screen_input_rst_pad, IO_LVL_LOW);
delayUs(200);
hal_gpio_set_output_data(g_screen_input_rst_pad, IO_LVL_HIGH);
}
/**************************************************************************
* @name : app_tp_init
* @brief : 初始化通信相关
* @param[in] :
* @return :
* @retval :
**************************************************************************/
void app_tp_init(void)
{
#if 0//def DISABLE_TDDI_I2C_FUNCTION
// hal_gpio_init_output(g_phone_output_int_pad, IO_LVL_HIGH); //配置phone报点输出中断IO口
hal_gpio_init_output(g_screen_input_rst_pad, IO_LVL_HIGH); //配置模组TP RESET
// hal_gpio_set_mode(IO_PAD_TD_SPIM_CLK,IO_MODE_I2C1_SCL);
// hal_gpio_set_mode(IO_PAD_TD_SPIM_CSN,IO_MODE_I2C1_SDA);
return;
#else
hal_gpio_set_pull_state(IO_PAD_TD_SPIM_CLK, ENABLE, DISABLE);
hal_gpio_set_pull_state(IO_PAD_TD_SPIM_CSN, ENABLE, DISABLE);
#endif
app_tp_screen_init(); //初始化手机复位的IO口
// app_tp_screen_int_init(); //配置screen中断输入引脚
#ifdef G_PHONE_INT_DEFAULT_LOW
hal_gpio_init_output(g_phone_output_int_pad, IO_LVL_LOW); //配置phone报点输出中断IO口
#else
hal_gpio_init_output(g_phone_output_int_pad, IO_LVL_HIGH); //配置phone报点输出中断IO口
// hal_gpio_init_input(g_phone_output_int_pad);
hal_gpio_set_pull_state(g_screen_input_int_pad, ENABLE, DISABLE);
hal_gpio_init_input(g_screen_input_int_pad);
#endif
hal_gpio_init_output(g_screen_input_rst_pad, IO_LVL_HIGH); //配置模组TP RESET
#if SCREEN_MASTER_TRANSFER_I2C
hal_i2c_m_dma_init(SCREEN_I2C_ADDRESS, SCREEN_I2C_ADDR_BITS, I2C_MASTER_SPEED);
#elif SCREEN_MASTER_TRANSFER_SPI
hal_spi_m_dma_init(SPI_MASTER_SPEED, SCREEN_SPI_CPHA, SCREEN_SPI_CPOL);
#endif
#if PHONE_SLAVE_TRANSFER_I2C
hal_i2c_s_init(CHIP_I2C_ADDRESS, CHIP_I2C_ADDR_BITS);
hal_i2c_s_set_transfer(app_tp_i2cs_callback);
hal_i2c_s_nonblocking_read(s_phone_read_buffer, BUFFER_SIZE_MAX); //先配置接收 buffer
#elif PHONE_SLAVE_TRANSFER_SPI
hal_spi_slave_init(PHONE_SPI_CPHA, PHONE_SPI_CPOL, true); // 初始化spi以及dma
hal_spi_slave_register_callback(app_tp_spis_callback); // 注册回调
hal_spi_slave_auto_transfer_abort(); // 停止传输
hal_spi_slave_flush_fifo(); // Flush FIFO
/* 每个packet自动接收, circle mode 为false, 即收到buffer max size数据后buffer不再更新, packet完成后调用回调 */
hal_spi_slave_set_auto_rx_buffer(s_phone_read_buffer, BUFFER_SIZE_MAX, false); // 设置auto rx buffer
hal_spi_slave_set_auto_tx_buffer(phone_reg_const_data[0].write_back, phone_reg_const_data[0].write_back_size, false); // 配置TX BUFFER
hal_spi_slave_enable(); // 启动spis
hal_spi_slave_auto_transfer_start(); // 启动rx自动接收
#endif
}
/**************************************************************************
* @name : app_tp_m_transfer_complate
* @brief : 获取主机通信完成状态
* @param[in] :
* @return :true: 通信完成
* @retval :
**************************************************************************/
bool app_tp_m_transfer_complate(void)
{
#if SCREEN_MASTER_TRANSFER_I2C
return hal_i2c_m_transfer_complate();
#elif SCREEN_MASTER_TRANSFER_SPI
return hal_spi_m_get_transfer_complate();
#else
return true;
#endif
}
/**************************************************************************
* @name : app_tp_s_transfer_complate
* @brief : 获取从机通信完成状态
* @param[in] :
* @return :true: 通信完成
* @retval :
**************************************************************************/
bool app_tp_s_transfer_complate(void)
{
#if SCREEN_MASTER_TRANSFER_I2C
return hal_i2c_s_write_complate() && hal_i2c_s_read_complate();
#elif SCREEN_MASTER_TRANSFER_SPI
return !hal_spi_slave_busy();
#else
return true;
#endif
}
/**************************************************************************
* @name : app_tp_m_write
* @brief : 根据通信方式配置发送txbuffer中的数据
* @param[in] :txbuffer: 发送数据 buffer 头地址
* @param[in] :buffer_size: 发送数据 buffer 长度
* @return :
* @retval :
**************************************************************************/
void app_tp_m_write(const uint8_t *txbuffer, size_t buffer_size)
{
#if SCREEN_MASTER_TRANSFER_I2C
hal_i2c_m_dma_write(txbuffer, buffer_size);
#elif SCREEN_MASTER_TRANSFER_SPI
hal_spi_m_dma_write(txbuffer, buffer_size);
s_spim_write = true;
#endif
}
/**************************************************************************
* @name : app_tp_m_read
* @brief : 根据通信方式配置发送txbuffer中的数据和rxbuffer
* @param[in] :cmd: 发送命令 buffer 头地址
* @param[in] :cmd_size: 发送命令 buffer 长度
* @param[in] :data_buffer: 读取数据 buffer 头地址
* @param[in] :data_size: 读取数据 buffer 长度
* @return :
* @retval :
**************************************************************************/
void app_tp_m_read(const uint8_t *cmd, size_t cmd_size, uint8_t *data_buffer, size_t data_size)
{
#if SCREEN_MASTER_TRANSFER_I2C
uint8_t i = 0;
uint32_t address = 0;
for (i = 0; i < cmd_size; i++) //先将要发送的数据整合到 address
{
address |= (uint32_t)cmd[i] << i * 8;
}
hal_i2c_m_dma_read(address, cmd_size, data_buffer, data_size);
#elif SCREEN_MASTER_TRANSFER_SPI
hal_spi_m_dma_read(cmd, cmd_size, data_buffer, data_size);
#endif
}
/**************************************************************************
* @name : app_tp_s_write
* @brief : 根据通信方式配置发送txbuffer中的数据
* @param[in] :txbuffer: 发送数据 buffer 头地址
* @param[in] :buffer_size: 发送数据 buffer 长度
* @return :
* @retval :
**************************************************************************/
void app_tp_s_write(const uint8_t *txbuffer, size_t buffer_size)
{
#if PHONE_SLAVE_TRANSFER_I2C
hal_i2c_s_dma_write(txbuffer, buffer_size);
#elif PHONE_SLAVE_TRANSFER_SPI
//while (hal_spi_slave_busy());
hal_spi_slave_auto_transfer_abort();
hal_spi_slave_flush_fifo();
hal_spi_slave_set_auto_tx_buffer(txbuffer, buffer_size, true);
hal_spi_slave_auto_transfer_start();
#endif
}
/**************************************************************************
* @name : app_tp_s_read
* @brief : 根据通信方式配置rxbuffer
* @param[in] :rxBuffer: 读取数据 buffer 头地址
* @param[in] :data_size: 读取数据 buffer 长度
* @return :
* @retval :
**************************************************************************/
void app_tp_s_read(void *rxBuffer, size_t data_size)
{
#if PHONE_SLAVE_TRANSFER_I2C
hal_i2c_s_nonblocking_read(rxBuffer, data_size);
#endif
}
/**************************************************************************
* @name : app_tp_spis_callback
* @brief : SPI slave 中断处理函数
* @param[in] :
* @return :
* @retval :
**************************************************************************/
#if PHONE_SLAVE_TRANSFER_I2C //消除warning
//经测试。int_status=0为读命令。=2为STOP。=1未测试到。
//recieve_num为接收到的指令个数
static void app_tp_i2cs_callback(e_i2c_s_int_status int_status, size_t recieve_num)
{
#if 0 // 1: test
if (int_status >2)
{
s_phone_read_buffer[2]=int_status;
s_phone_read_buffer[3]=recieve_num;
app_tp_m_write(s_phone_read_buffer, 4);
}
#endif
app_tp_transfer_phone(recieve_num);
}
#endif
/**************************************************************************
* @name : app_tp_spis_callback
* @brief : SPI slave 中断处理函数
* @param[in] :
* @return :
* @retval :
**************************************************************************/
#if PHONE_SLAVE_TRANSFER_SPI //消除warning
static void app_tp_spis_callback(hal_spis_event_e event, hal_spi_packet_info_t *packet_info)
{
app_tp_transfer_phone(packet_info->packet_size);
}
#endif
#if 0
/**************************************************************************
* @name : app_tp_reset_callback
* @brief : 手机 IO跳变复位的中断处理函数
* @param[in] :
* @return :
* @retval :
**************************************************************************/
static void app_tp_reset_callback(void *data)
{
TAU_LOGD("app_tp_reset_callback\n");
s_phone_reset_flag = true;
app_tp_s_write(phone_reg_const_data[0].write_back, phone_reg_const_data[0].write_back_size);
#if PHONE_SLAVE_TRANSFER_SPI
hal_gpio_set_output_data(IO_PAD_AP_INT, IO_LVL_LOW);
#endif
}
#endif
/**************************************************************************
* @name : app_tp_transfer_screen_const
* @brief : 按照flow读写screen完成 开机 screen 初始化
* @param[in] :
* @return :
* @retval :
*修改TP第1步模组初始化
*执行数组screen_reg_start_data[]。
**************************************************************************/
static void app_tp_transfer_screen_const(void)
{
// static bool screen_const_transfer_buffer_ready = true; //发送 buffer 是否已准备好
uint8_t ii;
uint8_t len=0;
/**** 1. 判断当前状态通信已结束, 状态通信已结束,并且开机初始化流程还未走完****/
#if 1
if(phone_start_flag)
{
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, 8);
while(!hal_i2c_m_transfer_complate());
delayMs(2);
while(!hal_gpio_get_input_data(g_screen_input_int_pad))
{
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, 8);
while(!hal_i2c_m_transfer_complate());
delayMs(2);
}
app_tp_m_write(MI10_PRO_screen_init_data1, sizeof(MI10_PRO_screen_init_data1));//0xA0,0x00,0x01
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_screen_init_data2, sizeof(MI10_PRO_screen_init_data2));//0xA2,0x03,0x00,0x00,0x00,0x03
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_screen_init_data3, sizeof(MI10_PRO_screen_init_data3));//0xA2,0x02,0x00
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_screen_init_data4, sizeof(MI10_PRO_screen_init_data4));//0xC0,0x07,0x01
while(!hal_i2c_m_transfer_complate());
delayMs(1);
#ifdef ADD_TP_TUNING
app_tp_m_write(MI10_PRO_TP_Tuning_data1, sizeof(MI10_PRO_TP_Tuning_data1));
while(!hal_i2c_m_transfer_complate());
delayMs(10);
app_tp_m_write(MI10_PRO_TP_Tuning_data2, sizeof(MI10_PRO_TP_Tuning_data2));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_TP_Tuning_data3, sizeof(MI10_PRO_TP_Tuning_data3));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_TP_Tuning_data4, sizeof(MI10_PRO_TP_Tuning_data4));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_TP_Tuning_data5, sizeof(MI10_PRO_TP_Tuning_data5));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_TP_Tuning_data6, sizeof(MI10_PRO_TP_Tuning_data6));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_TP_Tuning_data7, sizeof(MI10_PRO_TP_Tuning_data7));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
app_tp_m_write(MI10_PRO_TP_Tuning_data8, sizeof(MI10_PRO_TP_Tuning_data8));
while(!hal_i2c_m_transfer_complate());
delayMs(1);
#endif
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, 8);
while(!hal_i2c_m_transfer_complate());
if(s_screen_read_buffer[7]>0)
{
len=s_screen_read_buffer[7]*8;
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, len);
while(!hal_i2c_m_transfer_complate());
}
#endif
if(hal_gpio_get_input_data(g_screen_input_int_pad))
{
s_screen_init_complate = true;
app_tp_screen_int_init();
phone_start_flag=0;
}
}
}
void ap_doubleclick(void)
{
// app_tp_m_write(MI10_PRO_screen_init_data8, sizeof(MI10_PRO_screen_init_data8));//0xA2,0x03,0x20,0x00,0x00,0x00
// while(!hal_i2c_m_transfer_complate());
// delayMs(1);
// app_tp_m_write(MI10_PRO_screen_init_data9, sizeof(MI10_PRO_screen_init_data9));//0xA0,0x01,
// while(!hal_i2c_m_transfer_complate());
// delayMs(1);
app_tp_m_write(MI10_PRO_screen_init_data10, sizeof(MI10_PRO_screen_init_data10));//0xA0,0x00,0x00
while(!hal_i2c_m_transfer_complate());
delayMs(1);
}
void ap_doubleclick_1(void)
{
app_tp_m_write(MI10_PRO_screen_init_data11, sizeof(MI10_PRO_screen_init_data11));//0xC0,0x07,0x00
while(!hal_i2c_m_transfer_complate());
delayMs(1);
}
/**************************************************************************
* @name : app_tp_transfer_screen_start
* @brief : 按照flow读写screen开始开机初始化
* @param[in] :
* @return :
* @retval :
**************************************************************************/
void app_tp_transfer_screen_start(void)
{
// s_screen_init_complate = false;
s_screen_const_transfer_count = 0;
//app_tp_screen_init();
#ifndef DISABLE_I2C_INIT_CODE
// app_tp_transfer_screen_const();
#endif
// s_screen_int_flag = false;
}
/**************************************************************************
* @name : app_tp_transfer_screen_int
* @brief : 接收screen中断后按照flow读写screen即报点协议转换
* @param[in] :
* @return :
* @retval :
*修改TP第2步读取模组报点
*执行数组screen_reg_int_data[]。也可以自己写。
**************************************************************************/
void app_tp_transfer_screen_int(void)
{
uint8_t len=0;
uint8_t i=0;
uint8_t count=0;
bool screen_gpio_int = false;
static uint8_t screen_int_transfer_count = 0; //记录当前通信到哪一步
static bool screen_int_transfer_buffer_ready = true; //发送 buffer 是否已准备好
// static uint8_t test_flag = 0;
if (!s_screen_init_complate) //TP 初始化还未完成,则先进行初始化操作
{
app_tp_transfer_screen_const();
// TAU_LOGD("tp screen init"); //debug
return;
}
#if 0 //test
test_flag++;
if (test_flag >1000000)
{
test_flag =0;
//TAU_LOGD("Run ok!!\n");
//app_tp_m_read(screen_reg_int_data[0].buffer, screen_reg_int_data[0].txbuffer_size, s_screen_number, screen_reg_int_data[0].rxbuffer_size);
//while(!hal_i2c_m_transfer_complate());
}
#endif
/**** 1. 判断 screen 是否发出中断信号 ****/
// s_screen_int_flag: 中断信号标志位
// app_tp_screen_int_lvl_low : SPI 长时间通信时偶尔会出现cs拉高导致通信异常卡死该标志位用于解决卡死的问题
screen_gpio_int = s_screen_int_flag || app_tp_screen_int_lvl_low();
if (((screen_gpio_int) || (s_screen_int_transfer_status)) && app_tp_m_transfer_complate()) //判断当前不处于通信状态,并且准备通信
{
s_screen_int_flag = false;
if (s_spim_write) //SPI 写数据后需要把接收FIFO的数据读出不然会影响下一次读取
{
hal_spi_m_clear_rxfifo();
s_spim_write = false;
}
/**** 2. 发送或读取从机数据 ****/
if (screen_int_transfer_buffer_ready)
{
#ifndef READ_MODULE_TP_ONE_BY_ONE
screen_int_transfer_buffer_ready = false;
s_screen_int_transfer_status = true;
#ifdef USE_FOR_MI10_PRO
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, 8);
while(!hal_i2c_m_transfer_complate());
if(s_screen_read_buffer[7]>0)
{
len=s_screen_read_buffer[7]*8;
app_tp_m_read(screen_reg_int_data[0].buffer, 1, &s_screen_read_buffer[8], len);
while(!hal_i2c_m_transfer_complate());
}
delayUs(100);
#if 0
if(!hal_gpio_get_input_data(g_screen_input_int_pad))
{
if((s_screen_read_MI10Pro[0]==0x43)&&(s_screen_read_MI10Pro[1]==0x0A)&&(s_screen_read_MI10Pro[2]==0x01))//根据蔚来星给出的建议检测到43 0A 01大面积触摸状态中断不拉高时进行一次 System Reset 是0xA4 00 00
{
app_tp_m_write(MI10_PRO_screen_init_data12, sizeof(MI10_PRO_screen_init_data12));//0xA4,0x00,0x00
while(!hal_i2c_m_transfer_complate());
s_screen_init_complate=0;
phone_start_flag=1;
// delayMs(40);
for(i=0;i<10;i++)
{
s_screen_read_MI10Pro[i*8+0]=0x43;
s_screen_read_MI10Pro[i*8+1]=((i+1)<<4)+1;
s_screen_read_MI10Pro[i*8+2]=0;
s_screen_read_MI10Pro[i*8+3]=0;
s_screen_read_MI10Pro[i*8+4]=0;
s_screen_read_MI10Pro[i*8+5]=0;
s_screen_read_MI10Pro[i*8+6]=0;
s_screen_read_MI10Pro[i*8+7]=9-i;
}
}
}
#endif
if(!hal_gpio_get_input_data(g_screen_input_int_pad))
{
// if((s_screen_read_MI10Pro[0]==0x43)&&(s_screen_read_MI10Pro[1]==0x0A))//根据蔚来星给出的建议检测到43 0A 01大面积触摸状态中断不拉高时进行一次 System Reset 是0xA4 00 00
{
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, 8);
while(!hal_i2c_m_transfer_complate());
if(s_screen_read_buffer[7]>0)
{
len=s_screen_read_buffer[7]*8;
app_tp_m_read(screen_reg_int_data[0].buffer, 1, &s_screen_read_buffer[8], len);
while(!hal_i2c_m_transfer_complate());
}
}
}
ap_tp_st_touch_scan_point_record_event(s_screen_read_buffer,len+8);
ap_tp_st_touch_error_handler_F3(s_screen_read_buffer);
ap_tp_st_touch_error_handler_FF(s_screen_read_buffer);
#else
app_tp_m_read(screen_reg_int_data[0].buffer, screen_reg_int_data[0].txbuffer_size, s_screen_temp, screen_reg_int_data[0].rxbuffer_size);
while(!hal_i2c_m_transfer_complate());
app_tp_m_read(screen_reg_int_data[1].buffer, screen_reg_int_data[1].txbuffer_size, s_screen_number, screen_reg_int_data[1].rxbuffer_size);
while(!hal_i2c_m_transfer_complate());
//TAU_LOGD("s_screen_number[%4x], size[%4x]", ((s_screen_number[1]<<8)|s_screen_number[0]), ((s_screen_temp[1]<<8)|s_screen_temp[0]));
if(s_screen_number[1])
{
if (s_screen_number[1]>3)
{
read_point =1;
s_screen_int_transfer_status = false;
}
else if (s_screen_number[1] &0x02)
read_point =10;
else
read_point =9;
}
else
{
if(s_screen_number[0] &0x80)
read_point =8;
else if(s_screen_number[0] &0x40)
read_point =7;
else if(s_screen_number[0] &0x20)
read_point =6;
else if(s_screen_number[0] &0x10)
read_point =5;
else if(s_screen_number[0] &0x08)
read_point =4;
else if(s_screen_number[0] &0x04)
read_point =3;
else if(s_screen_number[0] &0x02)
read_point =2;
else
read_point =1;
}
read_point =8*read_point;
app_tp_m_read(screen_reg_int_data[0].buffer, 1, s_screen_read_buffer, 8);
while(!hal_i2c_m_transfer_complate());
#endif
#else
if (!screen_reg_int_data[screen_int_transfer_count].read_flag) //当前通信不需要读回,直接写
{
app_tp_m_write(screen_reg_int_data[screen_int_transfer_count].buffer, screen_reg_int_data[screen_int_transfer_count].txbuffer_size);
}
else //当前通信需要读回,先写再读
{
s_screen_int_transfer_status = true;
if (screen_int_transfer_count==0)
{
app_tp_m_read(screen_reg_int_data[screen_int_transfer_count].buffer, screen_reg_int_data[screen_int_transfer_count].txbuffer_size, \
s_screen_temp, screen_reg_int_data[screen_int_transfer_count].rxbuffer_size);
screen_int_transfer_count =1;
}
else if (screen_int_transfer_count==1)
{
app_tp_m_read(screen_reg_int_data[screen_int_transfer_count].buffer, screen_reg_int_data[screen_int_transfer_count].txbuffer_size, \
s_screen_number, screen_reg_int_data[screen_int_transfer_count].rxbuffer_size);
screen_int_transfer_count =2;
}
else if (screen_int_transfer_count==2)
{
if(s_screen_number[1])
{
TAU_LOGD("s_screen_number[%4x], size[%4x]", ((s_screen_number[1]<<8)|s_screen_number[0]), ((s_screen_temp[1]<<8)|s_screen_temp[0]));
if (s_screen_number[1] &0x02)
read_point =10;
else
read_point =9;
}
else
{
if(s_screen_number[0] &0x80)
read_point =8;
else if(s_screen_number[0] &0x40)
read_point =7;
else if(s_screen_number[0] &0x20)
read_point =6;
else if(s_screen_number[0] &0x10)
read_point =5;
else if(s_screen_number[0] &0x08)
read_point =4;
else if(s_screen_number[0] &0x04)
read_point =3;
else if(s_screen_number[0] &0x02)
read_point =2;
else
read_point =1;
}
read_point =8*read_point;
app_tp_m_read(screen_reg_int_data[screen_int_transfer_count].buffer, screen_reg_int_data[screen_int_transfer_count].txbuffer_size, \
s_screen_read_buffer, read_point);
screen_int_transfer_count =0;
screen_int_transfer_buffer_ready = false;
}
}
#endif
}
/**** 3. 解析本次通信数据并准备下一次通信的buffer ****/
else
{
#if 1
#ifdef USE_FOR_SUMSUNG_S20
u16TouchID=0x0000;
#endif
// if(s_screen_read_buffer[0] == 0xF3 && s_screen_read_buffer[1] == 0x02 && s_screen_read_buffer[2] == 0x00) // 收到 TP 异常回复 0xF3 0x02 0x00 0x00 0x00 0x00 0x00 0x00
// {
// s_screen_read_buffer[0] =0;
// ap_tp_system_softReset();
// TAU_LOGD("TP system reset3\n");
// return;
// }
// else
// {
// // printf("%2x,%2d,%2d\n",s_screen_read_buffer[0],screen_reg_int_data[2].rxbuffer_size,screen_int_transfer_count);
// }
//
screen_int_transfer_buffer_ready = true;
phone_touch_flag=0;
screen_int_transfer_count = app_tp_screen_analysis_int(screen_int_transfer_count, s_screen_read_buffer,screen_reg_int_data[2].rxbuffer_size);
screen_int_transfer_count = 0;
s_screen_int_transfer_status = false;
#else
screen_int_transfer_buffer_ready = true;
screen_int_transfer_count = app_tp_screen_analysis_int(screen_int_transfer_count, s_screen_read_buffer, \
screen_reg_int_data[screen_int_transfer_count].rxbuffer_size);
if (screen_int_transfer_count > screen_reg_int_data_size) //解析需要等最后一次通信结束,最后一次数据解析后,停止通信
{
screen_int_transfer_count = 0;
s_screen_int_transfer_status = false;
return;
}
#endif
}
}
}
/**************************************************************************
* @name : app_tp_transfer_phone
* @brief : 根据数据解析进行相应的答复
* @param[in] : recieve_num接收数据长度
* @return :
* @retval :
**************************************************************************/
static void app_tp_transfer_phone(size_t recieve_num)
{
const uint8_t *phone_write_buffer;
size_t phone_write_buffer_size = 0;
/* 数据解析判断是否需要答复以及答复的buffer指针 */
if (recieve_num > 0)
{
#if 0// 1: test
s_phone_read_buffer[3]=recieve_num;
app_tp_m_write(s_phone_read_buffer, 4);
#endif
app_tp_phone_analysis_data(s_phone_read_buffer, recieve_num, &phone_write_buffer, &phone_write_buffer_size);
}
app_tp_s_read(s_phone_read_buffer, BUFFER_SIZE_MAX);
if (phone_write_buffer_size) //大于0表示需要答复手机配置发送buffer
{
app_tp_s_write(phone_write_buffer, phone_write_buffer_size);
}
}
/**************************************************************************
* @name : app_tp_phone_reset_on
* @brief : 获取手机复位信号的状态
* @param[in] :
* @return :
* @retval :
**************************************************************************/
bool app_tp_phone_reset_on(void)
{
return s_phone_reset_flag;
}
/**************************************************************************
* @name : app_tp_phone_clear_reset_on
* @brief : 清除手机复位信号的状态
* @param[in] :
* @return :
* @retval :
**************************************************************************/
void app_tp_phone_clear_reset_on(void)
{
s_phone_reset_flag = false;
}
#else
void app_tp_screen_init(void)
{
}
void app_tp_init(void)
{
}
void app_tp_transfer_screen_int(void)
{
}
void app_tp_transfer_screen_start(void)
{
}
bool app_tp_phone_reset_on(void)
{
return false;
}
void app_tp_phone_clear_reset_on(void)
{
}
void app_tp_s_write(const uint8_t *txbuffer, size_t buffer_size)
{
}
bool app_tp_enter_sleep_on(void)
{
return false;
}
#endif