[gnome-color-manager] cm: Read a whole chunk of EEPROM data from the device
- From: Richard Hughes <rhughes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-color-manager] cm: Read a whole chunk of EEPROM data from the device
- Date: Thu, 22 Jul 2010 17:01:06 +0000 (UTC)
commit d18cb2c9ba5ceb0bda87c3555f930693208f0ae8
Author: Richard Hughes <richard hughsie com>
Date: Thu Jul 22 16:30:41 2010 +0100
cm: Read a whole chunk of EEPROM data from the device
tools/gcm-sensor-colormunki.c | 93 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 91 insertions(+), 2 deletions(-)
---
diff --git a/tools/gcm-sensor-colormunki.c b/tools/gcm-sensor-colormunki.c
index e5545f9..93be2e6 100644
--- a/tools/gcm-sensor-colormunki.c
+++ b/tools/gcm-sensor-colormunki.c
@@ -281,15 +281,84 @@ gcm_sensor_colormunki_submit_transfer (GcmSensorColormunki *sensor_colormunki)
}
/**
+ * gcm_sensor_colormunki_get_eeprom_data:
+ **/
+static gboolean
+gcm_sensor_colormunki_get_eeprom_data (GcmSensorColormunki *sensor_colormunki,
+ guint16 address, guchar *data, guint16 size, GError **error)
+{
+ gint retval;
+ libusb_device_handle *handle;
+ guchar request[8];
+ gsize reply_read = 0;
+ gboolean ret = FALSE;
+ GcmSensorColormunkiPrivate *priv = sensor_colormunki->priv;
+
+ /* do EEPROM request
+ *
+ * address length (in LE)
+ * ____|____ ____|____
+ * / \ / \
+ * 04 00 00 00 04 00 00 00
+ */
+ gcm_buffer_write_uint16_le (request, address);
+ gcm_buffer_write_uint16_le (request + 4, size);
+ gcm_sensor_colormunki_print_data ("request", request, 8);
+ handle = gcm_usb_get_device_handle (priv->usb);
+ retval = libusb_control_transfer (handle,
+ LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_RECIPIENT_DEVICE,
+ 0x81, 0, 0, request, 8, 2000);
+ if (retval < 0) {
+ g_set_error (error, GCM_SENSOR_ERROR,
+ GCM_SENSOR_ERROR_NO_SUPPORT,
+ "failed to request eeprom: %s",
+ libusb_strerror (retval));
+ goto out;
+ }
+
+ /* read EEPROM */
+ retval = libusb_bulk_transfer (handle, 0x81,
+ data, (gint) size, (gint*)&reply_read,
+ 5000);
+ if (retval < 0) {
+ g_set_error (error, GCM_SENSOR_ERROR,
+ GCM_SENSOR_ERROR_NO_SUPPORT,
+ "failed to get eeprom data: %s",
+ libusb_strerror (retval));
+ goto out;
+ }
+ if (reply_read != size) {
+ g_set_error_literal (error, GCM_SENSOR_ERROR,
+ GCM_SENSOR_ERROR_NO_SUPPORT,
+ "did not get the correct number of bytes");
+ goto out;
+ }
+ gcm_sensor_colormunki_print_data ("reply", data, size);
+
+ /* success */
+ ret = TRUE;
+out:
+ return ret;
+}
+
+/**
* gcm_sensor_colormunki_playdo:
**/
static gboolean
gcm_sensor_colormunki_playdo (GcmSensor *sensor, GError **error)
{
- gboolean ret = TRUE;
+// gint retval;
+// gint i;
+// libusb_device_handle *handle;
+// guchar request[8];
+// guchar *reply;
+// gsize reply_read = 0;
+ gboolean ret = FALSE;
GcmSensorColormunki *sensor_colormunki = GCM_SENSOR_COLORMUNKI (sensor);
// GcmSensorColormunkiPrivate *priv = sensor_colormunki->priv;
+
+
egg_debug ("submit transfer");
gcm_sensor_colormunki_submit_transfer (sensor_colormunki);
ret = gcm_sensor_colormunki_refresh_state (sensor_colormunki, error);
@@ -422,6 +491,8 @@ out:
static gboolean
gcm_sensor_colormunki_dump (GcmSensor *sensor, GString *data, GError **error)
{
+ guchar *buffer;
+ guint i, j;
gboolean ret = TRUE;
GcmSensorColormunki *sensor_colormunki = GCM_SENSOR_COLORMUNKI (sensor);
GcmSensorColormunkiPrivate *priv = sensor_colormunki->priv;
@@ -435,7 +506,25 @@ gcm_sensor_colormunki_dump (GcmSensor *sensor, GString *data, GError **error)
g_string_append_printf (data, "min-int:%i", priv->min_int);
g_string_append_printf (data, "eeprom-blocks:%i", priv->eeprom_blocks);
g_string_append_printf (data, "eeprom-blocksize:%i", priv->eeprom_blocksize);
-//out:
+
+ /* allocate a big chunk o' memory */
+ buffer = g_new0 (guchar, priv->eeprom_blocksize);
+
+ /* get all banks of EEPROM */
+ for (i=0; i<priv->eeprom_blocks; i++) {
+ ret = gcm_sensor_colormunki_get_eeprom_data (sensor_colormunki,
+ i*priv->eeprom_blocksize,
+ buffer, priv->eeprom_blocksize,
+ error);
+ if (!ret)
+ goto out;
+
+ /* write details */
+ for (j=0; j<priv->eeprom_blocksize; j++)
+ g_string_append_printf (data, "eeprom[0x%02x]:0x%02x\n", (i*priv->eeprom_blocksize) + j, buffer[j]);
+ }
+out:
+ g_free (buffer);
return ret;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]