aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSatoshi Noguchi <satoshi.noguchi@jp.synaptics.com>2014-09-29 02:47:25 -0700
committerSatoshi Noguchi <satoshi.noguchi@jp.synaptics.com>2014-09-29 13:50:05 -0700
commit3020cbb062d094612429051eec89f268133799ac (patch)
treed2bf0c4bf712586528f667697c490fb9d4889998
parent2230416db6b17770d7006b37bef08bff5c48cbf0 (diff)
downloadplatform_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.cpp6
-rw-r--r--rmidevice/rmidevice.h4
-rw-r--r--rmidevice/rmifunction.cpp17
-rw-r--r--rmidevice/rmifunction.h6
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