diff options
author | Satoshi Noguchi <satoshi.noguchi@jp.synaptics.com> | 2014-09-29 02:47:25 -0700 |
---|---|---|
committer | Satoshi Noguchi <satoshi.noguchi@jp.synaptics.com> | 2014-09-29 13:50:05 -0700 |
commit | 3020cbb062d094612429051eec89f268133799ac (patch) | |
tree | d2bf0c4bf712586528f667697c490fb9d4889998 | |
parent | 2230416db6b17770d7006b37bef08bff5c48cbf0 (diff) | |
download | platform_external_rmi4utils-3020cbb062d094612429051eec89f268133799ac.tar.gz platform_external_rmi4utils-3020cbb062d094612429051eec89f268133799ac.tar.bz2 platform_external_rmi4utils-3020cbb062d094612429051eec89f268133799ac.zip |
Have interrupt register number and mask in RMIFunction
-rw-r--r-- | rmidevice/rmidevice.cpp | 6 | ||||
-rw-r--r-- | rmidevice/rmidevice.h | 4 | ||||
-rw-r--r-- | rmidevice/rmifunction.cpp | 17 | ||||
-rw-r--r-- | rmidevice/rmifunction.h | 6 |
4 files changed, 30 insertions, 3 deletions
diff --git a/rmidevice/rmidevice.cpp b/rmidevice/rmidevice.cpp index 6802d8e..454998c 100644 --- a/rmidevice/rmidevice.cpp +++ b/rmidevice/rmidevice.cpp @@ -262,6 +262,7 @@ int RMIDevice::ScanPDT(int endFunc, int endPage) unsigned int maxPage; unsigned int addr; unsigned char entry[RMI_DEVICE_PDT_ENTRY_SIZE]; + unsigned int interruptCount = 0; maxPage = (unsigned int)((endPage < 0) ? RMI_DEVICE_MAX_PAGE : endPage); @@ -282,11 +283,12 @@ int RMIDevice::ScanPDT(int endFunc, int endPage) return rc; } - RMIFunction func(entry, page_start); + RMIFunction func(entry, page_start, interruptCount); if (func.GetFunctionNumber() == 0) break; m_functionList.push_back(func); + interruptCount += func.GetInterruptSourceCount(); found = true; if (func.GetFunctionNumber() == endFunc) @@ -297,6 +299,8 @@ int RMIDevice::ScanPDT(int endFunc, int endPage) break; } + m_numInterruptRegs = (interruptCount + 7) / 8; + return 0; } diff --git a/rmidevice/rmidevice.h b/rmidevice/rmidevice.h index 3aed3e8..d47ffe1 100644 --- a/rmidevice/rmidevice.h +++ b/rmidevice/rmidevice.h @@ -61,6 +61,8 @@ public: void SetBytesPerReadRequest(int bytes) { m_bytesPerReadRequest = bytes; } + unsigned int GetNumInterruptRegs() { return m_numInterruptRegs; } + protected: std::vector<RMIFunction> m_functionList; unsigned char m_manufacturerID; @@ -91,6 +93,8 @@ protected: bool m_bCancel; int m_bytesPerReadRequest; int m_page; + + unsigned int m_numInterruptRegs; }; /* Utility Functions */ diff --git a/rmidevice/rmifunction.cpp b/rmidevice/rmifunction.cpp index d24aef0..3a077e4 100644 --- a/rmidevice/rmifunction.cpp +++ b/rmidevice/rmifunction.cpp @@ -27,8 +27,11 @@ #define RMI_FUNCTION_VERSION_MASK 0x60 #define RMI_FUNCTION_INTERRUPT_SOURCES_MASK 0x7 -RMIFunction::RMIFunction(const unsigned char * pdtEntry, unsigned short pageBase) +RMIFunction::RMIFunction(const unsigned char * pdtEntry, unsigned short pageBase, unsigned int interruptCount) { + unsigned char ii; + unsigned char interruptOffset; + if (pdtEntry) { m_queryBase = pdtEntry[RMI_FUNCTION_QUERY_OFFSET] + pageBase; m_commandBase = pdtEntry[RMI_FUNCTION_COMMAND_OFFSET] + pageBase; @@ -39,5 +42,17 @@ RMIFunction::RMIFunction(const unsigned char * pdtEntry, unsigned short pageBase m_functionNumber = pdtEntry[RMI_FUNCTION_NUMBER]; m_functionVersion = (pdtEntry[RMI_FUNCTION_INTERRUPT_SOURCES_OFFSET] & RMI_FUNCTION_VERSION_MASK) >> 5; + if (m_interruptSourceCount > 0) + { + m_interruptRegNum = (interruptCount + 8) / 8 - 1; + + /* Set an enable bit for each data source */ + interruptOffset = interruptCount % 8; + m_interruptMask = 0; + for (ii = interruptOffset; + ii < (m_interruptSourceCount + interruptOffset); + ii++) + m_interruptMask |= 1 << ii; + } } }
\ No newline at end of file diff --git a/rmidevice/rmifunction.h b/rmidevice/rmifunction.h index 287ad5a..3257471 100644 --- a/rmidevice/rmifunction.h +++ b/rmidevice/rmifunction.h @@ -22,7 +22,7 @@ class RMIFunction { public: RMIFunction() {} - RMIFunction(const unsigned char * pdtEntry, unsigned short pageBase); + RMIFunction(const unsigned char * pdtEntry, unsigned short pageBase, unsigned int interruptCount); unsigned short GetQueryBase() { return m_queryBase; } unsigned short GetCommandBase() { return m_commandBase; } unsigned short GetControlBase() { return m_controlBase; } @@ -30,6 +30,8 @@ public: unsigned char GetInterruptSourceCount() { return m_interruptSourceCount; } unsigned char GetFunctionNumber() { return m_functionNumber; } unsigned char GetFunctionVersion() { return m_functionVersion; } + unsigned char GetInterruptRegNum() { return m_interruptRegNum; } + unsigned char GetInterruptMask() { return m_interruptMask; } private: unsigned short m_queryBase; @@ -39,6 +41,8 @@ private: unsigned char m_interruptSourceCount; unsigned char m_functionNumber; unsigned char m_functionVersion; + unsigned char m_interruptRegNum; + unsigned char m_interruptMask; }; #endif // _RMIFUNCTION_H_
\ No newline at end of file |