| /* | |
| * | |
| * FocalTech TouchScreen driver. | |
| * | |
| * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. | |
| * | |
| * This software is licensed under the terms of the GNU General Public | |
| * License version 2, as published by the Free Software Foundation, and | |
| * may be copied, distributed, and modified under those terms. | |
| * | |
| * This program is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| * GNU General Public License for more details. | |
| * | |
| */ | |
| /************************************************************************ | |
| * | |
| * File Name: focaltech_i2c.c | |
| * | |
| * Author: fupeipei | |
| * | |
| * Created: 2016-08-04 | |
| * | |
| * Abstract: i2c communication with TP | |
| * | |
| * Version: v1.0 | |
| * | |
| * Revision History: | |
| * v1.0: | |
| * First release. By fupeipei 2016-08-04 | |
| ************************************************************************/ | |
| /***************************************************************************** | |
| * Included header files | |
| *****************************************************************************/ | |
| #include "focaltech_core.h" | |
| /***************************************************************************** | |
| * Private constant and macro definitions using #define | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| * Private enumerations, structures and unions using typedef | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| * Static variables | |
| *****************************************************************************/ | |
| static DEFINE_MUTEX(i2c_rw_access); | |
| /***************************************************************************** | |
| * Global variable or extern global variabls/functions | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| * Static function prototypes | |
| *****************************************************************************/ | |
| /***************************************************************************** | |
| * functions body | |
| *****************************************************************************/ | |
| /************************************************************************ | |
| * Name: fts_i2c_read | |
| * Brief: i2c read | |
| * Input: i2c info, write buf, write len, read buf, read len | |
| * Output: get data in the 3rd buf | |
| * Return: fail <0 | |
| ***********************************************************************/ | |
| int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, | |
| char *readbuf, int readlen) | |
| { | |
| int ret = 0; | |
| mutex_lock(&i2c_rw_access); | |
| if (readlen > 0) { | |
| if (writelen > 0) { | |
| struct i2c_msg msgs[] = { | |
| { | |
| .addr = client->addr, | |
| .flags = 0, | |
| .len = writelen, | |
| .buf = writebuf, | |
| }, | |
| { | |
| .addr = client->addr, | |
| .flags = I2C_M_RD, | |
| .len = readlen, | |
| .buf = readbuf, | |
| }, | |
| }; | |
| ret = i2c_transfer(client->adapter, msgs, 2); | |
| if (ret < 0) { | |
| FTS_ERROR("[IIC]: i2c_transfer(write)" | |
| "error,ret=%d!!", ret); | |
| } | |
| } else { | |
| struct i2c_msg msgs[] = { | |
| { | |
| .addr = client->addr, | |
| .flags = I2C_M_RD, | |
| .len = readlen, | |
| .buf = readbuf, | |
| }, | |
| }; | |
| ret = i2c_transfer(client->adapter, msgs, 1); | |
| if (ret < 0) { | |
| FTS_ERROR("[IIC]: i2c_transfer(read)" | |
| "error, ret=%d!!", ret); | |
| } | |
| } | |
| } | |
| mutex_unlock(&i2c_rw_access); | |
| return ret; | |
| } | |
| /************************************************************************ | |
| * Name: fts_i2c_write | |
| * Brief: i2c write | |
| * Input: i2c info, write buf, write len | |
| * Output: no | |
| * Return: fail <0 | |
| ***********************************************************************/ | |
| int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen) | |
| { | |
| int ret = 0; | |
| mutex_lock(&i2c_rw_access); | |
| if (writelen > 0) { | |
| struct i2c_msg msgs[] = { | |
| { | |
| .addr = client->addr, | |
| .flags = 0, | |
| .len = writelen, | |
| .buf = writebuf, | |
| }, | |
| }; | |
| ret = i2c_transfer(client->adapter, msgs, 1); | |
| if (ret < 0) { | |
| FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", | |
| __func__, ret); | |
| } | |
| } | |
| mutex_unlock(&i2c_rw_access); | |
| return ret; | |
| } | |
| /************************************************************************ | |
| * Name: fts_i2c_write_reg | |
| * Brief: write register | |
| * Input: i2c info, reg address, reg value | |
| * Output: no | |
| * Return: fail <0 | |
| ***********************************************************************/ | |
| int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) | |
| { | |
| u8 buf[2] = { 0 }; | |
| buf[0] = regaddr; | |
| buf[1] = regvalue; | |
| return fts_i2c_write(client, buf, sizeof(buf)); | |
| } | |
| /************************************************************************ | |
| * Name: fts_i2c_read_reg | |
| * Brief: read register | |
| * Input: i2c info, reg address, reg value | |
| * Output: get reg value | |
| * Return: fail <0 | |
| ***********************************************************************/ | |
| int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) | |
| { | |
| return fts_i2c_read(client, ®addr, 1, regvalue, 1); | |
| } | |
| /************************************************************************ | |
| * Name: fts_i2c_init | |
| * Brief: fts i2c init | |
| * Input: | |
| * Output: | |
| * Return: | |
| ***********************************************************************/ | |
| int fts_i2c_init(void) | |
| { | |
| FTS_FUNC_ENTER(); | |
| FTS_FUNC_EXIT(); | |
| return 0; | |
| } | |
| /************************************************************************ | |
| * Name: fts_i2c_exit | |
| * Brief: fts i2c exit | |
| * Input: | |
| * Output: | |
| * Return: | |
| ***********************************************************************/ | |
| int fts_i2c_exit(void) | |
| { | |
| FTS_FUNC_ENTER(); | |
| FTS_FUNC_EXIT(); | |
| return 0; | |
| } |