summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2015-06-25 17:51:40 +0100
committerRichard Hughes <richard@hughsie.com>2015-06-26 11:50:24 +0100
commit2b26b510bab62ec9505c6edce09d6615b55396e3 (patch)
treeaed8bcb9401688be733e0c9b052e0726f9d9d060
parentc706874746f6eff28a871903d32ee9f698802ce9 (diff)
downloadcolord-2b26b510bab62ec9505c6edce09d6615b55396e3.tar.gz
ColorHug: Add ch_device_queue_read_firmware()
This allows us to dump a firmware for validation.
-rw-r--r--lib/colorhug/ch-device-queue.c55
-rw-r--r--lib/colorhug/ch-device-queue.h4
2 files changed, 59 insertions, 0 deletions
diff --git a/lib/colorhug/ch-device-queue.c b/lib/colorhug/ch-device-queue.c
index e63de84..9ca2782 100644
--- a/lib/colorhug/ch-device-queue.c
+++ b/lib/colorhug/ch-device-queue.c
@@ -1298,6 +1298,61 @@ ch_device_queue_verify_firmware (ChDeviceQueue *device_queue,
}
/**
+ * ch_device_queue_read_firmware:
+ * @device_queue: A #ChDeviceQueue
+ * @device: A #GUsbDevice
+ * @data: Firmware binary data
+ * @len: Size of @data
+ *
+ * Reads firmware on the device.
+ *
+ * NOTE: This command is available on hardware version: 1 & 2
+ *
+ * Since: 1.2.11
+ **/
+void
+ch_device_queue_read_firmware (ChDeviceQueue *device_queue,
+ GUsbDevice *device,
+ guint8 **data,
+ gsize *len)
+{
+ gsize chunk_len = 60;
+ guint idx = 0;
+ guint16 runcode_addr;
+ guint8 *data_tmp;
+ gsize len_tmp;
+
+ g_return_if_fail (CH_IS_DEVICE_QUEUE (device_queue));
+ g_return_if_fail (G_USB_IS_DEVICE (device));
+ g_return_if_fail (data != NULL);
+
+ /* assume firmware is padded */
+ len_tmp = ch_device_get_runcode_address (device);
+ data_tmp = g_malloc0 (len_tmp);
+
+ /* read in 60 byte chunks */
+ runcode_addr = ch_device_get_runcode_address (device);
+ do {
+ if (idx + chunk_len > len_tmp)
+ chunk_len = len_tmp - idx;
+ g_debug ("Reading at %04x size %" G_GSIZE_FORMAT,
+ runcode_addr + idx,
+ chunk_len);
+ ch_device_queue_read_flash (device_queue,
+ device,
+ runcode_addr + idx,
+ data_tmp + idx,
+ chunk_len);
+ idx += chunk_len;
+ } while (idx < len_tmp);
+
+ /* return */
+ *data = data_tmp;
+ if (len != NULL)
+ *len = len_tmp;
+}
+
+/**
* ch_device_queue_clear_calibration:
* @device_queue: A #ChDeviceQueue
* @device: A #GUsbDevice
diff --git a/lib/colorhug/ch-device-queue.h b/lib/colorhug/ch-device-queue.h
index 2398a03..3b07dae 100644
--- a/lib/colorhug/ch-device-queue.h
+++ b/lib/colorhug/ch-device-queue.h
@@ -327,6 +327,10 @@ void ch_device_queue_verify_firmware (ChDeviceQueue *device_queue,
GUsbDevice *device,
const guint8 *data,
gsize len);
+void ch_device_queue_read_firmware (ChDeviceQueue *device_queue,
+ GUsbDevice *device,
+ guint8 **data,
+ gsize *len);
G_END_DECLS