nt9856x/code/driver/source/touch/touch_gt911/touch_common.c
2023-03-28 15:07:53 +08:00

170 lines
4.7 KiB
C
Executable File

#ifdef __KERNEL__
#include <linux/gpio.h>
#include <plat/nvt-gpio.h>
#include <kwrap/file.h>
#else
#include <stdio.h>
#endif
#include "kwrap/type.h"
//#include "touch_cfg.h"
#include "touch_dtsi.h"
#include "touch_common.h"
//=============================================================================
// dtsi file
//=============================================================================
#if 1//touch_dtsi_FROM_FILE
static TOUCH_DTSI_FILE gTOUCH_DTSI_FILE[TOUCH_DTSI_ITEM_MAX_NUM] = {
{ "i2c_cfg", "id", NULL, sizeof(UINT32) }, // 0
{ "i2c_cfg", "addr", NULL, sizeof(UINT32) },
{ "gpio_cfg", "pwr_pin", NULL, sizeof(UINT32) },
{ "gpio_cfg", "rst_pin", NULL, sizeof(UINT32) },
{ "gpio_cfg", "int_pin", NULL, sizeof(UINT32) },// 4
{ "rst_cfg", "rst_time", NULL, sizeof(UINT32) },
};
static UINT32 touch_big_little_swap(UINT8 *pvalue)
{
UINT32 tmp;
tmp = (pvalue[0] << 24) | (pvalue[1] << 16) | (pvalue[2] << 8) | pvalue[3];
return tmp;
}
ER touch_common_load_dtsi_file(UINT8 *node_path, UINT8 *file_path, UINT8 *buf_addr, void *param)
{
CHAR node_name[64];
UINT8 *pfdt_addr;
INT32 i, node_ofst = 0, data_size;
//UINT32 move_spd;
const void *pfdt_node;
ER rt = E_OK;
TOUCH_DRV_INFO *ptouch_info = (TOUCH_DRV_INFO *)param;
#ifdef __KERNEL__
UINT32 read_size = 2*1024;
VOS_FILE fp;
pfdt_addr = kzalloc(read_size, GFP_KERNEL);
if (pfdt_addr == NULL) {
DBG_WRN("fail to allocate pfdt_addr!\r\n");
return E_SYS;
}
fp = vos_file_open((CHAR *)file_path, O_RDONLY, 0x777);
if (fp == (VOS_FILE)(-1)) {
kfree(pfdt_addr);
pfdt_addr = NULL;
DBG_WRN("open %s fail!\r\n", file_path);
return -E_SYS;
}
if (vos_file_read(fp, pfdt_addr, read_size) < 1) {
vos_file_close(fp);
kfree(pfdt_addr);
pfdt_addr = NULL;
DBG_WRN("read %s fail!\r\n", file_path);
return -E_SYS;
}
vos_file_close(fp);
#else
pfdt_addr = buf_addr;
if (pfdt_addr == NULL) {
DBG_WRN("pfdt_addr is NULL!\r\n");
return E_SYS;
}
#endif
DBG_WRN("*** node_path = %s \r\n",node_path);
node_ofst = fdt_path_offset(pfdt_addr, (CHAR *)node_path);
if (node_ofst < 0) {
#ifdef __KERNEL__
kfree(pfdt_addr);
pfdt_addr = NULL;
#endif
DBG_WRN("%s not available!\r\n", node_path);
return E_SYS;
}
for (i = 0; i < TOUCH_DTSI_ITEM_MAX_NUM; i++) {
//DBG_WRN("*** gTOUCH_DTSI_FILE[%d].node_name = %s \r\n",i, gTOUCH_DTSI_FILE[i].node_name);
sprintf(node_name, "%s/%s", node_path, gTOUCH_DTSI_FILE[i].node_name);
node_ofst = fdt_path_offset(pfdt_addr, node_name);
if (node_ofst >= 0) {
//DBG_WRN("gTOUCH_DTSI_FILE[%d].data_name = %s \r\n",i,gTOUCH_DTSI_FILE[i].data_name);
//DBG_WRN("data_size = %d \r\n",data_size);
//DBG_WRN("gTOUCH_DTSI_FILE[%d].size = %d \r\n",i,gTOUCH_DTSI_FILE[i].size);
pfdt_node = fdt_getprop(pfdt_addr, node_ofst, (CHAR *)gTOUCH_DTSI_FILE[i].data_name, (int *)&data_size);
if ((pfdt_node != NULL) && (data_size == gTOUCH_DTSI_FILE[i].size)) {
gTOUCH_DTSI_FILE[i].pdata = (UINT8 *)pfdt_node;
} else {
gTOUCH_DTSI_FILE[i].pdata = NULL;
DBG_WRN("%s size not match (%d) (%d)!\r\n", node_name, data_size, gTOUCH_DTSI_FILE[i].size);
}
} else {
gTOUCH_DTSI_FILE[i].pdata = NULL;
DBG_WRN("%s not available!\r\n", node_name);
}
#if 0//for debug
if(i < 5)
{
if (gTOUCH_DTSI_FILE[0].pdata != NULL)
{
r_rslt = touch_big_little_swap(gTOUCH_DTSI_FILE[i].pdata);
DBG_WRN("r_rslt = %d \r\n",r_rslt);
}
}
rt = (int)r_rslt;
#endif
}
if (gTOUCH_DTSI_FILE[0].pdata != NULL) {
ptouch_info->tp_hw.i2c_cfg.i2c_id = touch_big_little_swap(gTOUCH_DTSI_FILE[0].pdata);
DBG_WRN("i2c_id = %d \r\n",ptouch_info->tp_hw.i2c_cfg.i2c_id);
}
if (gTOUCH_DTSI_FILE[1].pdata != NULL) {
ptouch_info->tp_hw.i2c_cfg.i2c_addr = touch_big_little_swap(gTOUCH_DTSI_FILE[1].pdata);
DBG_WRN("i2c_addr = 0x%x \r\n",ptouch_info->tp_hw.i2c_cfg.i2c_addr);
}
if (gTOUCH_DTSI_FILE[2].pdata != NULL) {
ptouch_info->tp_hw.gpio_cfg.gpio_pwr = touch_big_little_swap(gTOUCH_DTSI_FILE[2].pdata);
DBG_WRN("gpio_pwr = %d \r\n",ptouch_info->tp_hw.gpio_cfg.gpio_pwr);
}
if (gTOUCH_DTSI_FILE[3].pdata != NULL) {
ptouch_info->tp_hw.gpio_cfg.gpio_rst = touch_big_little_swap(gTOUCH_DTSI_FILE[3].pdata);
DBG_WRN("gpio_rst = %d \r\n",ptouch_info->tp_hw.gpio_cfg.gpio_rst);
}
if (gTOUCH_DTSI_FILE[4].pdata != NULL) {
ptouch_info->tp_hw.gpio_cfg.gpio_int = touch_big_little_swap(gTOUCH_DTSI_FILE[4].pdata);
DBG_WRN("gpio_int = %d \r\n",ptouch_info->tp_hw.gpio_cfg.gpio_int);
}
if (gTOUCH_DTSI_FILE[5].pdata != NULL) {
ptouch_info->tp_hw.reset_time.rst_time = touch_big_little_swap(gTOUCH_DTSI_FILE[5].pdata);
}
#ifdef __KERNEL__
kfree(pfdt_addr);
pfdt_addr = NULL;
#endif
return rt;
}
#endif