summaryrefslogtreecommitdiff
path: root/chip/g/blob.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/g/blob.c')
-rw-r--r--chip/g/blob.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/chip/g/blob.c b/chip/g/blob.c
new file mode 100644
index 0000000000..fde66aac9a
--- /dev/null
+++ b/chip/g/blob.c
@@ -0,0 +1,74 @@
+/* Copyright 2015 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/* Handle an opaque blob of data */
+
+#include "common.h"
+#include "console.h"
+#include "consumer.h"
+#include "queue.h"
+#include "queue_policies.h"
+#include "producer.h"
+#include "task.h"
+#include "usb-stream.h"
+
+#define CPRINTS(format, args...) cprints(CC_USB, format, ## args)
+
+struct consumer const blob_consumer;
+struct usb_stream_config const usb_blob;
+
+static struct queue const blob_to_usb = QUEUE_DIRECT(64, uint8_t,
+ null_producer,
+ usb_blob.consumer);
+static struct queue const usb_to_blob = QUEUE_DIRECT(64, uint8_t,
+ usb_blob.producer,
+ blob_consumer);
+
+USB_STREAM_CONFIG(usb_blob,
+ USB_IFACE_BLOB,
+ USB_STR_BLOB_NAME,
+ USB_EP_BLOB,
+ USB_MAX_PACKET_SIZE,
+ USB_MAX_PACKET_SIZE,
+ usb_to_blob,
+ blob_to_usb)
+
+static void blob_written(struct consumer const *consumer, size_t count)
+{
+ int i;
+ uint8_t buf[USB_MAX_PACKET_SIZE];
+
+ count = QUEUE_REMOVE_UNITS(consumer->queue, buf, count);
+
+ CPRINTS("Received: count=%d buf=((%s))", count, buf);
+
+ /*
+ * Just to have something to test to begin with, we'll
+ * implement "tr a-zA-Z A-Za-z" and return the result.
+ */
+ for (i = 0; i < count; i++) {
+ char tmp = buf[i];
+
+ if (tmp >= 'a' && tmp <= 'z')
+ buf[i] = tmp - ('a' - 'A');
+ else if (tmp >= 'A' && tmp <= 'Z')
+ buf[i] = tmp + ('a' - 'A');
+ }
+
+ count = QUEUE_ADD_UNITS(&blob_to_usb, buf, count);
+ CPRINTS("Sending: count=%d buf=((%s))", count, buf);
+}
+
+static void blob_flush(struct consumer const *consumer)
+{
+}
+
+struct consumer const blob_consumer = {
+ .queue = &usb_to_blob,
+ .ops = &((struct consumer_ops const) {
+ .written = blob_written,
+ .flush = blob_flush,
+ }),
+};