170 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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
 |