diff options
author | Richard Hughes <richard@hughsie.com> | 2015-06-25 17:51:40 +0100 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2015-06-26 11:50:24 +0100 |
commit | 2b26b510bab62ec9505c6edce09d6615b55396e3 (patch) | |
tree | aed8bcb9401688be733e0c9b052e0726f9d9d060 | |
parent | c706874746f6eff28a871903d32ee9f698802ce9 (diff) | |
download | colord-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.c | 55 | ||||
-rw-r--r-- | lib/colorhug/ch-device-queue.h | 4 |
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 |