summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/msg2138/mstar_drv_main.c
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
committerYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
commit8e4bff4cab0ddac6060645b0715210484d02ff40 (patch)
tree3a5c3024371a04692a3a6d9974d001cdff8ebf84 /drivers/input/touchscreen/msg2138/mstar_drv_main.c
Initial file dump from open source releaseHEADmaster
Diffstat (limited to 'drivers/input/touchscreen/msg2138/mstar_drv_main.c')
-rw-r--r--drivers/input/touchscreen/msg2138/mstar_drv_main.c993
1 files changed, 993 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_main.c b/drivers/input/touchscreen/msg2138/mstar_drv_main.c
new file mode 100644
index 00000000..94f6be1e
--- /dev/null
+++ b/drivers/input/touchscreen/msg2138/mstar_drv_main.c
@@ -0,0 +1,993 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2006-2012 MStar Semiconductor, Inc.
+// All rights reserved.
+//
+// Unless otherwise stipulated in writing, any and all information contained
+// herein regardless in any format shall remain the sole proprietary of
+// MStar Semiconductor Inc. and be kept in strict confidence
+// (??MStar Confidential Information??) by the recipient.
+// Any unauthorized act including without limitation unauthorized disclosure,
+// copying, use, reproduction, sale, distribution, modification, disassembling,
+// reverse engineering and compiling of the contents of MStar Confidential
+// Information is unlawful and strictly prohibited. MStar hereby reserves the
+// rights to any and all damages, losses, costs and expenses resulting therefrom.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ *
+ * @file mstar_drv_main.c
+ *
+ * @brief This file defines the interface of touch screen
+ *
+ * @version v2.2.0.0
+ *
+ */
+
+/*=============================================================*/
+// INCLUDE FILE
+/*=============================================================*/
+
+#include "mstar_drv_main.h"
+#include "mstar_drv_utility_adaption.h"
+#include "mstar_drv_platform_porting_layer.h"
+#include "mstar_drv_ic_fw_porting_layer.h"
+
+/*=============================================================*/
+// CONSTANT VALUE DEFINITION
+/*=============================================================*/
+
+
+/*=============================================================*/
+// EXTERN VARIABLE DECLARATION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+extern FirmwareInfo_t g_FirmwareInfo;
+extern u8 *g_LogModePacket;
+extern u16 g_FirmwareMode;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+extern u16 g_GestureWakeupMode;
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+extern u8 g_ChipType;
+
+/*=============================================================*/
+// LOCAL VARIABLE DEFINITION
+/*=============================================================*/
+
+static u16 _gDebugReg[MAX_DEBUG_REGISTER_NUM] = {0};
+static u32 _gDebugRegCount = 0;
+
+static u8 *_gPlatformFwVersion = NULL; // internal use firmware version for MStar
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+static ItoTestMode_e _gItoTestMode = 0;
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+static u32 _gIsUpdateComplete = 0;
+
+static u8 *_gFwVersion = NULL; // customer firmware version
+
+static struct class *_gFirmwareClass = NULL;
+static struct device *_gFirmwareCmdDev = NULL;
+
+/*=============================================================*/
+// GLOBAL VARIABLE DEFINITION
+/*=============================================================*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+struct kset *g_TouchKSet = NULL;
+struct kobject *g_TouchKObj = NULL;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+u8 g_FwData[94][1024];
+u32 g_FwDataCount = 0;
+
+/*=============================================================*/
+// LOCAL FUNCTION DEFINITION
+/*=============================================================*/
+
+
+/*=============================================================*/
+// GLOBAL FUNCTION DEFINITION
+/*=============================================================*/
+
+ssize_t DrvMainFirmwareChipTypeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return sprintf(pBuf, "%d", g_ChipType);
+}
+
+ssize_t DrvMainFirmwareChipTypeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+// g_ChipType = DrvIcFwLyrGetChipType();
+
+ return nSize;
+}
+
+static DEVICE_ATTR(chip_type, SYSFS_AUTHORITY, DrvMainFirmwareChipTypeShow, DrvMainFirmwareChipTypeStore);
+
+ssize_t DrvMainFirmwareDriverVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return sprintf(pBuf, "%s", DEVICE_DRIVER_RELEASE_VERSION);
+}
+
+ssize_t DrvMainFirmwareDriverVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(driver_version, SYSFS_AUTHORITY, DrvMainFirmwareDriverVersionShow, DrvMainFirmwareDriverVersionStore);
+
+/*--------------------------------------------------------------------------*/
+
+ssize_t DrvMainFirmwareUpdateShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion);
+
+ return sprintf(pBuf, "%s\n", _gFwVersion);
+}
+
+ssize_t DrvMainFirmwareUpdateStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DrvPlatformLyrDisableFingerTouchReport();
+
+ DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount);
+
+ if (0 != DrvIcFwLyrUpdateFirmware(g_FwData, EMEM_ALL))
+ {
+ _gIsUpdateComplete = 0;
+ DBG("Update FAILED\n");
+ }
+ else
+ {
+ _gIsUpdateComplete = 1;
+ DBG("Update SUCCESS\n");
+ }
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvIcFwLyrRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DrvPlatformLyrEnableFingerTouchReport();
+
+ return nSize;
+}
+
+static DEVICE_ATTR(update, SYSFS_AUTHORITY, DrvMainFirmwareUpdateShow, DrvMainFirmwareUpdateStore);
+
+ssize_t DrvMainFirmwareVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion);
+
+ return sprintf(pBuf, "%s\n", _gFwVersion);
+}
+
+ssize_t DrvMainFirmwareVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u16 nMajor = 0, nMinor = 0;
+
+ DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion);
+
+ DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(version, SYSFS_AUTHORITY, DrvMainFirmwareVersionShow, DrvMainFirmwareVersionStore);
+
+ssize_t DrvMainFirmwareDataShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount);
+
+ return g_FwDataCount;
+}
+
+ssize_t DrvMainFirmwareDataStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 nCount = nSize / 1024;
+ u32 i;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (nCount > 0) // nSize >= 1024
+ {
+ for (i = 0; i < nCount; i ++)
+ {
+ memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024);
+
+ g_FwDataCount ++;
+ }
+ }
+ else // nSize < 1024
+ {
+ if (nSize > 0)
+ {
+ memcpy(g_FwData[g_FwDataCount], pBuf, nSize);
+
+ g_FwDataCount ++;
+ }
+ }
+
+ DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount);
+
+ if (pBuf != NULL)
+ {
+ DBG("*** buf[0] = %c ***\n", pBuf[0]);
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(data, SYSFS_AUTHORITY, DrvMainFirmwareDataShow, DrvMainFirmwareDataStore);
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+ssize_t DrvMainFirmwareTestShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("*** ctp mp test status = %d ***\n", DrvIcFwLyrGetMpTestResult());
+
+ return sprintf(pBuf, "%d", DrvIcFwLyrGetMpTestResult());
+}
+
+ssize_t DrvMainFirmwareTestStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 nMode = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (pBuf != NULL)
+ {
+ sscanf(pBuf, "%x", &nMode);
+
+ DBG("Mp Test Mode = 0x%x\n", nMode);
+
+ if (nMode == ITO_TEST_MODE_OPEN_TEST) //open test
+ {
+ _gItoTestMode = ITO_TEST_MODE_OPEN_TEST;
+ DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_OPEN_TEST);
+ }
+ else if (nMode == ITO_TEST_MODE_SHORT_TEST) //short test
+ {
+ _gItoTestMode = ITO_TEST_MODE_SHORT_TEST;
+ DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_SHORT_TEST);
+ }
+ else
+ {
+ DBG("*** Undefined MP Test Mode ***\n");
+ }
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(test, SYSFS_AUTHORITY, DrvMainFirmwareTestShow, DrvMainFirmwareTestStore);
+
+ssize_t DrvMainFirmwareTestLogShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 nLength = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvIcFwLyrGetMpTestDataLog(_gItoTestMode, pBuf, &nLength);
+
+ return nLength;
+}
+
+ssize_t DrvMainFirmwareTestLogStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(test_log, SYSFS_AUTHORITY, DrvMainFirmwareTestLogShow, DrvMainFirmwareTestLogStore);
+
+ssize_t DrvMainFirmwareTestFailChannelShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 nCount = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ DrvIcFwLyrGetMpTestFailChannel(_gItoTestMode, pBuf, &nCount);
+
+ return nCount;
+}
+
+ssize_t DrvMainFirmwareTestFailChannelStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(test_fail_channel, SYSFS_AUTHORITY, DrvMainFirmwareTestFailChannelShow, DrvMainFirmwareTestFailChannelStore);
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+
+ssize_t DrvMainFirmwareGestureWakeupModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+ DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode);
+
+ return sprintf(pBuf, "%x", g_GestureWakeupMode);
+}
+
+ssize_t DrvMainFirmwareGestureWakeupModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 nLength, nWakeupMode;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (pBuf != NULL)
+ {
+ sscanf(pBuf, "%x", &nWakeupMode);
+ DBG("nWakeupMode = 0x%x\n", nWakeupMode);
+
+ nLength = nSize;
+ DBG("nLength = %d\n", nLength);
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG) == GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG);
+ }
+
+ if ((nWakeupMode & GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG)
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG;
+ }
+ else
+ {
+ g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG);
+ }
+
+ DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode);
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(gesture_wakeup_mode, SYSFS_AUTHORITY, DrvMainFirmwareGestureWakeupModeShow, DrvMainFirmwareGestureWakeupModeStore);
+
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+
+/*--------------------------------------------------------------------------*/
+
+ssize_t DrvMainFirmwareDebugShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 i;
+ u8 nBank, nAddr;
+ u16 szRegData[MAX_DEBUG_REGISTER_NUM] = {0};
+ u8 szOut[MAX_DEBUG_REGISTER_NUM*25] = {0}, szValue[10] = {0};
+
+ DBG("*** %s() ***\n", __func__);
+
+ DbBusEnterSerialDebugMode();
+ DbBusStopMCU();
+ DbBusIICUseBus();
+ DbBusIICReshape();
+ mdelay(300);
+
+ for (i = 0; i < _gDebugRegCount; i ++)
+ {
+ szRegData[i] = RegGet16BitValue(_gDebugReg[i]);
+ }
+
+ DbBusIICNotUseBus();
+ DbBusNotStopMCU();
+ DbBusExitSerialDebugMode();
+
+ for (i = 0; i < _gDebugRegCount; i ++)
+ {
+ nBank = (_gDebugReg[i] >> 8) & 0xFF;
+ nAddr = _gDebugReg[i] & 0xFF;
+
+ DBG("reg(0x%X,0x%X)=0x%04X\n", nBank, nAddr, szRegData[i]);
+
+ strcat(szOut, "reg(");
+ sprintf(szValue, "0x%X", nBank);
+ strcat(szOut, szValue);
+ strcat(szOut, ",");
+ sprintf(szValue, "0x%X", nAddr);
+ strcat(szOut, szValue);
+ strcat(szOut, ")=");
+ sprintf(szValue, "0x%04X", szRegData[i]);
+ strcat(szOut, szValue);
+ strcat(szOut, "\n");
+ }
+
+ return sprintf(pBuf, "%s\n", szOut);
+}
+
+ssize_t DrvMainFirmwareDebugStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ u32 i;
+ char *pCh;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (pBuf != NULL)
+ {
+ DBG("*** %s() pBuf[0] = %c ***\n", __func__, pBuf[0]);
+ DBG("*** %s() pBuf[1] = %c ***\n", __func__, pBuf[1]);
+ DBG("*** %s() pBuf[2] = %c ***\n", __func__, pBuf[2]);
+ DBG("*** %s() pBuf[3] = %c ***\n", __func__, pBuf[3]);
+ DBG("*** %s() pBuf[4] = %c ***\n", __func__, pBuf[4]);
+ DBG("*** %s() pBuf[5] = %c ***\n", __func__, pBuf[5]);
+
+ DBG("nSize = %d\n", nSize);
+
+ i = 0;
+ while ((pCh = strsep((char **)&pBuf, " ,")) && (i < MAX_DEBUG_REGISTER_NUM))
+ {
+ DBG("pCh = %s\n", pCh);
+
+ _gDebugReg[i] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh));
+
+ DBG("_gDebugReg[%d] = 0x%04X\n", i, _gDebugReg[i]);
+ i ++;
+ }
+ _gDebugRegCount = i;
+
+ DBG("_gDebugRegCount = %d\n", _gDebugRegCount);
+ }
+
+ return nSize;
+}
+
+static DEVICE_ATTR(debug, SYSFS_AUTHORITY, DrvMainFirmwareDebugShow, DrvMainFirmwareDebugStore);
+
+/*--------------------------------------------------------------------------*/
+
+ssize_t DrvMainFirmwarePlatformVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion);
+
+ return sprintf(pBuf, "%s\n", _gPlatformFwVersion);
+}
+
+ssize_t DrvMainFirmwarePlatformVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DrvIcFwLyrGetPlatformFirmwareVersion(&_gPlatformFwVersion);
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ DrvIcFwLyrRestoreFirmwareModeToLogDataMode();
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(platform_version, SYSFS_AUTHORITY, DrvMainFirmwarePlatformVersionShow, DrvMainFirmwarePlatformVersionStore);
+
+/*--------------------------------------------------------------------------*/
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ssize_t DrvMainFirmwareModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ g_FirmwareMode = DrvIcFwLyrGetFirmwareMode();
+
+ DBG("%s() firmware mode = 0x%x\n", __func__, g_FirmwareMode);
+
+ return sprintf(pBuf, "%x", g_FirmwareMode);
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+
+ DBG("%s() firmware mode = 0x%x, can change firmware mode = %d\n", __func__, g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode);
+
+ return sprintf(pBuf, "%x,%d", g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode);
+#endif
+}
+
+ssize_t DrvMainFirmwareModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ u32 nMode;
+
+ if (pBuf != NULL)
+ {
+ sscanf(pBuf, "%x", &nMode);
+ DBG("firmware mode = 0x%x\n", nMode);
+
+ if (nMode == FIRMWARE_MODE_DEMO_MODE) //demo mode
+ {
+ g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEMO_MODE);
+ }
+ else if (nMode == FIRMWARE_MODE_DEBUG_MODE) //debug mode
+ {
+ g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE);
+ }
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ else if (nMode == FIRMWARE_MODE_RAW_DATA_MODE) //raw data mode
+ {
+ g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE);
+ }
+#endif
+ else
+ {
+ DBG("*** Undefined Firmware Mode ***\n");
+ }
+ }
+
+ DBG("*** g_FirmwareMode = 0x%x ***\n", g_FirmwareMode);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(mode, SYSFS_AUTHORITY, DrvMainFirmwareModeShow, DrvMainFirmwareModeStore);
+/*
+ssize_t DrvMainFirmwarePacketShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ u32 i = 0;
+ u32 nLength = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (g_LogModePacket != NULL)
+ {
+ DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]);
+ DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]);
+ DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7))
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62))
+#endif
+ {
+ for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++)
+ {
+ pBuf[i] = g_LogModePacket[i];
+ }
+
+ nLength = g_FirmwareInfo.nLogModePacketLength;
+ DBG("nLength = %d\n", nLength);
+ }
+ else
+ {
+ DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n");
+// nLength = 0;
+ }
+ }
+ else
+ {
+ DBG("g_LogModePacket is NULL\n");
+// nLength = 0;
+ }
+
+ return nLength;
+}
+
+ssize_t DrvMainFirmwarePacketStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return nSize;
+}
+
+static DEVICE_ATTR(packet, SYSFS_AUTHORITY, DrvMainFirmwarePacketShow, DrvMainFirmwarePacketStore);
+*/
+ssize_t DrvMainFirmwareSensorShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ if (g_FirmwareInfo.nLogModePacketHeader == 0xA5 || g_FirmwareInfo.nLogModePacketHeader == 0xAB)
+ {
+ return sprintf(pBuf, "%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy);
+ }
+ else if (g_FirmwareInfo.nLogModePacketHeader == 0xA7)
+ {
+ return sprintf(pBuf, "%d,%d,%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy, g_FirmwareInfo.nSs, g_FirmwareInfo.nSd);
+ }
+ else
+ {
+ DBG("Undefined debug mode packet format : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader);
+ return 0;
+ }
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ return sprintf(pBuf, "%d", g_FirmwareInfo.nLogModePacketLength);
+#endif
+}
+
+ssize_t DrvMainFirmwareSensorStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+/*
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+#endif
+*/
+ return nSize;
+}
+
+static DEVICE_ATTR(sensor, SYSFS_AUTHORITY, DrvMainFirmwareSensorShow, DrvMainFirmwareSensorStore);
+
+ssize_t DrvMainFirmwareHeaderShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf)
+{
+ DBG("*** %s() ***\n", __func__);
+
+ return sprintf(pBuf, "%d", g_FirmwareInfo.nLogModePacketHeader);
+}
+
+ssize_t DrvMainFirmwareHeaderStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize)
+{
+ DBG("*** %s() ***\n", __func__);
+/*
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+#endif
+*/
+ return nSize;
+}
+
+static DEVICE_ATTR(header, SYSFS_AUTHORITY, DrvMainFirmwareHeaderShow, DrvMainFirmwareHeaderStore);
+
+//------------------------------------------------------------------------------//
+
+ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf)
+{
+ u32 i = 0;
+ u32 nLength = 0;
+
+ DBG("*** %s() ***\n", __func__);
+
+ if (strcmp(pAttr->attr.name, "packet") == 0)
+ {
+ if (g_LogModePacket != NULL)
+ {
+ DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]);
+ DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]);
+ DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7))
+#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62))
+#endif
+ {
+ for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++)
+ {
+ pBuf[i] = g_LogModePacket[i];
+ }
+
+ nLength = g_FirmwareInfo.nLogModePacketLength;
+ DBG("nLength = %d\n", nLength);
+ }
+ else
+ {
+ DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n");
+// nLength = 0;
+ }
+ }
+ else
+ {
+ DBG("g_LogModePacket is NULL\n");
+// nLength = 0;
+ }
+ }
+ else
+ {
+ DBG("pAttr->attr.name = %s \n", pAttr->attr.name);
+// nLength = 0;
+ }
+
+ return nLength;
+}
+
+ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount)
+{
+ DBG("*** %s() ***\n", __func__);
+/*
+ if (strcmp(pAttr->attr.name, "packet") == 0)
+ {
+
+ }
+*/
+ return nCount;
+}
+
+static struct kobj_attribute packet_attr = __ATTR(packet, 0666, DrvMainKObjectPacketShow, DrvMainKObjectPacketStore);
+
+/* Create a group of attributes so that we can create and destroy them all at once. */
+static struct attribute *attrs[] = {
+ &packet_attr.attr,
+ NULL, /* need to NULL terminate the list of attributes */
+};
+
+/*
+ * An unnamed attribute group will put all of the attributes directly in
+ * the kobject directory. If we specify a name, a subdirectory will be
+ * created for the attributes with the directory being the name of the
+ * attribute group.
+ */
+struct attribute_group attr_group = {
+ .attrs = attrs,
+};
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+//------------------------------------------------------------------------------//
+
+s32 DrvMainTouchDeviceInitialize(void)
+{
+ s32 nRetVal = 0;
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ u8 *pDevicePath = NULL;
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ DBG("*** %s() ***\n", __func__);
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+ /* set sysfs for firmware */
+ _gFirmwareClass = class_create(THIS_MODULE, "ms-touchscreen-msg20xx");
+ if (IS_ERR(_gFirmwareClass))
+ DBG("Failed to create class(firmware)!\n");
+
+ _gFirmwareCmdDev = device_create(_gFirmwareClass, NULL, 0, NULL, "device");
+ if (IS_ERR(_gFirmwareCmdDev))
+ DBG("Failed to create device(_gFirmwareCmdDev)!\n");
+
+ // version
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_version) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_version.attr.name);
+ // update
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_update) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_update.attr.name);
+ // data
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_data) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_data.attr.name);
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+ // test
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_test) < 0)
+ pr_err("Failed to create device file(%s)!\n", dev_attr_test.attr.name);
+ // test_log
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_test_log) < 0)
+ pr_err("Failed to create device file(%s)!\n", dev_attr_test_log.attr.name);
+ // test_fail_channel
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_test_fail_channel) < 0)
+ pr_err("Failed to create device file(%s)!\n", dev_attr_test_fail_channel.attr.name);
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ // mode
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_mode) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_mode.attr.name);
+ // packet
+// if (device_create_file(_gFirmwareCmdDev, &dev_attr_packet) < 0)
+// DBG("Failed to create device file(%s)!\n", dev_attr_packet.attr.name);
+ // sensor
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_sensor) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_sensor.attr.name);
+ // header
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_header) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_header.attr.name);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ // debug
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_debug) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_debug.attr.name);
+ // platform version
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_platform_version) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_platform_version.attr.name);
+#ifdef CONFIG_ENABLE_GESTURE_WAKEUP
+ // gesture wakeup mode
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_gesture_wakeup_mode) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_gesture_wakeup_mode.attr.name);
+#endif //CONFIG_ENABLE_GESTURE_WAKEUP
+ // chip type
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_chip_type) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_chip_type.attr.name);
+ // driver version
+ if (device_create_file(_gFirmwareCmdDev, &dev_attr_driver_version) < 0)
+ DBG("Failed to create device file(%s)!\n", dev_attr_driver_version.attr.name);
+
+ dev_set_drvdata(_gFirmwareCmdDev, NULL);
+#endif /*CONFIG_UPDATE_FIRMWARE_BY_SW_ID*/
+
+#ifdef CONFIG_ENABLE_ITO_MP_TEST
+ DrvIcFwLyrCreateMpTestWorkQueue();
+#endif //CONFIG_ENABLE_ITO_MP_TEST
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+ /* create a kset with the name of "kset_example" which is located under /sys/kernel/ */
+ g_TouchKSet = kset_create_and_add("kset_example", NULL, kernel_kobj);
+ if (!g_TouchKSet)
+ {
+ DBG("*** kset_create_and_add() failed, nRetVal = %d ***\n", nRetVal);
+
+ nRetVal = -ENOMEM;
+ }
+
+ g_TouchKObj = kobject_create();
+ if (!g_TouchKObj)
+ {
+ DBG("*** kobject_create() failed, nRetVal = %d ***\n", nRetVal);
+
+ nRetVal = -ENOMEM;
+ kset_unregister(g_TouchKSet);
+ g_TouchKSet = NULL;
+ }
+
+ g_TouchKObj->kset = g_TouchKSet;
+
+ nRetVal = kobject_add(g_TouchKObj, NULL, "%s", "kobject_example");
+ if (nRetVal != 0)
+ {
+ DBG("*** kobject_add() failed, nRetVal = %d ***\n", nRetVal);
+
+ kobject_put(g_TouchKObj);
+ g_TouchKObj = NULL;
+ kset_unregister(g_TouchKSet);
+ g_TouchKSet = NULL;
+ }
+
+ /* create the files associated with this kobject */
+ nRetVal = sysfs_create_group(g_TouchKObj, &attr_group);
+ if (nRetVal != 0)
+ {
+ DBG("*** sysfs_create_file() failed, nRetVal = %d ***\n", nRetVal);
+
+ kobject_put(g_TouchKObj);
+ g_TouchKObj = NULL;
+ kset_unregister(g_TouchKSet);
+ g_TouchKSet = NULL;
+ }
+
+ pDevicePath = kobject_get_path(g_TouchKObj, GFP_KERNEL);
+ DBG("DEVPATH = %s\n", pDevicePath);
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+ g_ChipType = DrvIcFwLyrGetChipType();
+ if(g_ChipType != 2) {
+ pr_err("[Mstar] the chip id error %x\n", g_ChipType);
+ return -ENODEV;
+ }
+
+#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG
+#if defined(CONFIG_ENABLE_CHIP_MSG26XXM)
+ // get firmware mode for parsing packet judgement.
+ g_FirmwareMode = DrvIcFwLyrGetFirmwareMode();
+#endif //CONFIG_ENABLE_CHIP_MSG26XXM
+
+ memset(&g_FirmwareInfo, 0x0, sizeof(FirmwareInfo_t));
+
+ DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo);
+
+#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX)
+ g_FirmwareMode = g_FirmwareInfo.nFirmwareMode;
+#endif
+#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG
+
+#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+ DrvIcFwLyrCheckFirmwareUpdateBySwId();
+#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID
+
+ return nRetVal;
+}
+
+//------------------------------------------------------------------------------// \ No newline at end of file