MXC-A36_2024.04.17/MXC-Screen_display/components/drivers/bsp/touchpad/driver_touchpad.c

171 lines
3.6 KiB
C

#include <stdint.h>
#include "driver_touchpad.h"
#include "FreeRTOS.h"
#include "task.h"
//#define TOUCHPAD_SH8601A
//#define TOUCHPAD_ICNA3310
//#define TOUCHPAD_CHSC586
//#define TOUCHPAD_CHSC6x
//#define TOUCHPAD_CTP820
#define TOUCHPAD_FT6336U
#ifdef TOUCHPAD_SH8601A
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x2C<<1) // from sh8601a
#endif
#ifdef TOUCHPAD_ICNA3310
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x48 << 1) // from icna3310
#endif
#ifdef TOUCHPAD_CTP820
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x15 << 1) // from ctp820
#endif
#ifdef TOUCHPAD_FT6336U
#define TOUCHPAD_IIC_SLAVE_ADDRESS (0x71) // from ft6336u
#endif
#ifdef TOUCHPAD_CHSC586
extern bool semi_touch_read_coordinate(int16_t *x, int16_t *y);
extern int semi_touch_init();
#endif
#ifdef TOUCHPAD_CHSC6x
bool chsc6x_read_touch_info(int16_t *x, int16_t *y);
void chsc6x_init(void);
#endif
bool touchpad_read(int16_t *x, int16_t *y)
{
#ifdef TOUCHPAD_SH8601A
uint8_t buffer[8];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0, buffer, 8);
if (buffer[2] != 0) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_ICNA3310
uint8_t buffer[9];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x1000, buffer, 9);
if (buffer[1] == 1) {
*x = ((buffer[4]&0x0f)<<8) | buffer[3];
*y = ((buffer[6]&0x0f)<<8) | buffer[5];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_CHSC586
return semi_touch_read_coordinate(x, y);
#endif
#ifdef TOUCHPAD_CHSC6x
return chsc6x_read_touch_info(x, y);
#endif
#ifdef TOUCHPAD_CTP820
uint8_t buffer[7];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
if (buffer[2] == 1) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
#ifdef TOUCHPAD_FT6336U
uint8_t buffer[7];
bool pressed = false;
i2c_memory_read(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0x00, buffer, 7);
if (buffer[2] == 1) {
*x = ((buffer[3]&0x0f)<<8) | buffer[4];
*y = ((buffer[5]&0x0f)<<8) | buffer[6];
pressed = true;
}
else {
pressed = false;
}
return pressed;
#endif
return false;
}
void touchpad_init(void)
{
#ifdef TOUCHPAD_ICNA3310
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_CLEAR();
__TOUCHPAD_DELAY_MS(5);
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(200);
#endif
#ifdef TOUCHPAD_CHSC586
semi_touch_init();
#endif
#ifdef TOUCHPAD_CHSC6x
chsc6x_init();
#endif
#ifdef TOUCHPAD_CTP820
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_CLEAR();
__TOUCHPAD_DELAY_MS(10);
__TOUCHPAD_RESET_SET();
__TOUCHPAD_DELAY_MS(50);
#endif
#ifdef TOUCHPAD_FT6336U
/* reset touch pad chip */
__TOUCHPAD_RESET_SET();
__TOUCHPAD_RESET_CLEAR();
vTaskDelay(10);
__TOUCHPAD_RESET_SET();
vTaskDelay(250);
#endif
}
void touchpad_sleep(void)
{
#ifdef TOUCHPAD_CTP820
uint8_t value = 0x03;
i2c_memory_write(&i2c_touchpad_handle, TOUCHPAD_IIC_SLAVE_ADDRESS, 0xE5, &value, 1);
#endif
}