Add support for v6 bootloaders and RMI F34 version 1
diff --git a/rmi4update/rmi4update.cpp b/rmi4update/rmi4update.cpp
index afcdf97..3982080 100644
--- a/rmi4update/rmi4update.cpp
+++ b/rmi4update/rmi4update.cpp
@@ -34,13 +34,22 @@
 #define RMI_F34_FW_BLOCKS_OFFSET	3
 #define RMI_F34_CONFIG_BLOCKS_OFFSET	5
 
+#define RMI_F34_BLOCK_SIZE_V1_OFFSET	0
+#define RMI_F34_FW_BLOCKS_V1_OFFSET	0
+#define RMI_F34_CONFIG_BLOCKS_V1_OFFSET	2
+
 #define RMI_F34_BLOCK_DATA_OFFSET	2
+#define RMI_F34_BLOCK_DATA_V1_OFFSET	1
 
 #define RMI_F34_COMMAND_MASK		0x0F
 #define RMI_F34_STATUS_MASK		0x07
 #define RMI_F34_STATUS_SHIFT		4
 #define RMI_F34_ENABLED_MASK		0x80
 
+#define RMI_F34_COMMAND_V1_MASK		0x3F
+#define RMI_F34_STATUS_V1_MASK		0x3F
+#define RMI_F34_ENABLED_V1_MASK		0x80
+
 #define RMI_F34_WRITE_FW_BLOCK        0x02
 #define RMI_F34_ERASE_ALL             0x03
 #define RMI_F34_WRITE_LOCKDOWN_BLOCK  0x04
@@ -213,25 +222,62 @@
 {
 	int rc;
 	unsigned char idStr[3];
-	unsigned char buf[RMI_F34_QUERY_SIZE];
+	unsigned char buf[8];
 	unsigned short queryAddr = m_f34.GetQueryBase();
+	unsigned short f34Version = m_f34.GetFunctionVersion();
+	unsigned short querySize;
+
+	if (f34Version == 0x1)
+		querySize = 8;
+	else
+		querySize = 2;
 
 	rc = m_device.Read(queryAddr, m_bootloaderID, RMI_BOOTLOADER_ID_SIZE);
 	if (rc < 0)
 		return UPDATE_FAIL_READ_BOOTLOADER_ID;
 
-	queryAddr += RMI_BOOTLOADER_ID_SIZE;
+	if (f34Version == 0x1)
+		++queryAddr;
+	else
+		queryAddr += querySize;
 
-	rc = m_device.Read(queryAddr, buf, RMI_F34_QUERY_SIZE);
-	if (rc < 0)
-		return UPDATE_FAIL_READ_F34_QUERIES;
+	if (f34Version == 0x1) {
+		rc = m_device.Read(queryAddr, buf, 1);
+		if (rc < 0)
+			return UPDATE_FAIL_READ_F34_QUERIES;
 
-	m_hasNewRegmap = buf[0] & RMI_F34_HAS_NEW_REG_MAP;
-	m_unlocked = buf[0] & RMI_F34_IS_UNLOCKED;;
-	m_hasConfigID = buf[0] & RMI_F34_HAS_CONFIG_ID;
-	m_blockSize = extract_short(buf + RMI_F34_BLOCK_SIZE_OFFSET);
-	m_fwBlockCount = extract_short(buf + RMI_F34_FW_BLOCKS_OFFSET);
-	m_configBlockCount = extract_short(buf + RMI_F34_CONFIG_BLOCKS_OFFSET);
+		m_hasNewRegmap = buf[0] & RMI_F34_HAS_NEW_REG_MAP;
+		m_unlocked = buf[0] & RMI_F34_IS_UNLOCKED;;
+		m_hasConfigID = buf[0] & RMI_F34_HAS_CONFIG_ID;
+
+		++queryAddr;
+
+		rc = m_device.Read(queryAddr, buf, 2);
+		if (rc < 0)
+			return UPDATE_FAIL_READ_F34_QUERIES;
+
+		m_blockSize = extract_short(buf + RMI_F34_BLOCK_SIZE_V1_OFFSET);
+
+		++queryAddr;
+
+		rc = m_device.Read(queryAddr, buf, 8);
+		if (rc < 0)
+			return UPDATE_FAIL_READ_F34_QUERIES;
+
+		m_fwBlockCount = extract_short(buf + RMI_F34_FW_BLOCKS_V1_OFFSET);
+		m_configBlockCount = extract_short(buf + RMI_F34_CONFIG_BLOCKS_V1_OFFSET);
+	} else {
+		rc = m_device.Read(queryAddr, buf, RMI_F34_QUERY_SIZE);
+		if (rc < 0)
+			return UPDATE_FAIL_READ_F34_QUERIES;
+
+		m_hasNewRegmap = buf[0] & RMI_F34_HAS_NEW_REG_MAP;
+		m_unlocked = buf[0] & RMI_F34_IS_UNLOCKED;;
+		m_hasConfigID = buf[0] & RMI_F34_HAS_CONFIG_ID;
+		m_blockSize = extract_short(buf + RMI_F34_BLOCK_SIZE_OFFSET);
+		m_fwBlockCount = extract_short(buf + RMI_F34_FW_BLOCKS_OFFSET);
+		m_configBlockCount = extract_short(buf + RMI_F34_CONFIG_BLOCKS_OFFSET);
+	}
 
 	idStr[0] = m_bootloaderID[0];
 	idStr[1] = m_bootloaderID[1];
@@ -247,7 +293,10 @@
 	fprintf(stdout, "F34 config blocks: %d\n", m_configBlockCount);
 	fprintf(stdout, "\n");
 
-	m_f34StatusAddr = m_f34.GetDataBase() + RMI_F34_BLOCK_DATA_OFFSET + m_blockSize;
+	if (f34Version == 0x1)
+		m_f34StatusAddr = m_f34.GetDataBase() + 2;
+	else
+		m_f34StatusAddr = m_f34.GetDataBase() + RMI_F34_BLOCK_DATA_OFFSET + m_blockSize;
 
 	return UPDATE_SUCCESS;
 }
@@ -255,15 +304,26 @@
 int RMI4Update::ReadF34Controls()
 {
 	int rc;
-	unsigned char buf;
+	unsigned char buf[2];
 
-	rc = m_device.Read(m_f34StatusAddr, &buf, 1);
-	if (rc < 0)
-		return UPDATE_FAIL_READ_F34_CONTROLS;
+	if (m_f34.GetFunctionVersion() == 0x1) {
+		rc = m_device.Read(m_f34StatusAddr, buf, 2);
+		if (rc < 0)
+			return UPDATE_FAIL_READ_F34_CONTROLS;
 
-	m_f34Command = buf & RMI_F34_COMMAND_MASK;
-	m_f34Status = (buf >> RMI_F34_STATUS_SHIFT) & RMI_F34_STATUS_MASK;
-	m_programEnabled = !!(buf & RMI_F34_ENABLED_MASK);
+		m_f34Command = buf[0] & RMI_F34_COMMAND_V1_MASK;
+		m_f34Status = buf[1] & RMI_F34_STATUS_V1_MASK;
+		m_programEnabled = !!(buf[1] & RMI_F34_ENABLED_MASK);
+
+	} else {
+		rc = m_device.Read(m_f34StatusAddr, buf, 1);
+		if (rc < 0)
+			return UPDATE_FAIL_READ_F34_CONTROLS;
+
+		m_f34Command = buf[0] & RMI_F34_COMMAND_MASK;
+		m_f34Status = (buf[0] >> RMI_F34_STATUS_SHIFT) & RMI_F34_STATUS_MASK;
+		m_programEnabled = !!(buf[0] & RMI_F34_ENABLED_MASK);
+	}
 	
 	return UPDATE_SUCCESS;
 }
@@ -271,8 +331,12 @@
 int RMI4Update::WriteBootloaderID()
 {
 	int rc;
+	int blockDataOffset = RMI_F34_BLOCK_DATA_OFFSET;
 
-	rc = m_device.Write(m_f34.GetDataBase() + RMI_F34_BLOCK_DATA_OFFSET,
+	if (m_f34.GetFunctionVersion() == 0x1)
+		blockDataOffset = RMI_F34_BLOCK_DATA_V1_OFFSET;
+
+	rc = m_device.Write(m_f34.GetDataBase() + blockDataOffset,
 				m_bootloaderID, RMI_BOOTLOADER_ID_SIZE);
 	if (rc < 0)
 		return UPDATE_FAIL_WRITE_BOOTLOADER_ID;
@@ -337,7 +401,12 @@
 	int blockNum;
 	unsigned char zeros[] = { 0, 0 };
 	int rc;
-	unsigned short addr = m_f34.GetDataBase() + RMI_F34_BLOCK_DATA_OFFSET;
+	unsigned short addr;
+
+	if (m_f34.GetFunctionVersion() == 0x1)
+		addr = m_f34.GetDataBase() + RMI_F34_BLOCK_DATA_V1_OFFSET;
+	else
+		addr = m_f34.GetDataBase() + RMI_F34_BLOCK_DATA_OFFSET;
 
 	rc = m_device.Write(m_f34.GetDataBase(), zeros, 2);
 	if (rc < 0)
@@ -350,7 +419,6 @@
 			return UPDATE_FAIL_WRITE_BLOCK;
 		}
 
-
 		rc = m_device.Write(m_f34StatusAddr, &cmd, 1);
 		if (rc < 0) {
 			fprintf(stderr, "failed to write command for block %d\n", blockNum);