blob: fde66aac9a88f703b8310fd8d521c304cfc78e4a [file] [log] [blame]
/* 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,
}),
};