summaryrefslogtreecommitdiff
path: root/chip/g/usb_spi.h
diff options
context:
space:
mode:
Diffstat (limited to 'chip/g/usb_spi.h')
-rw-r--r--chip/g/usb_spi.h248
1 files changed, 0 insertions, 248 deletions
diff --git a/chip/g/usb_spi.h b/chip/g/usb_spi.h
deleted file mode 100644
index a98157753f..0000000000
--- a/chip/g/usb_spi.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/* Copyright 2016 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.
- */
-#ifndef __CROS_EC_USB_SPI_H
-#define __CROS_EC_USB_SPI_H
-
-/* USB SPI driver for Chrome EC */
-
-#include "compile_time_macros.h"
-#include "hooks.h"
-#include "queue.h"
-#include "queue_policies.h"
-#include "usb_descriptor.h"
-#include "usb-stream.h"
-
-#define HEADER_SIZE 2
-
-/*
- * Command:
- * +------------------+-----------------+------------------------+
- * | write count : 1B | read count : 1B | write payload : <= 62B |
- * +------------------+-----------------+------------------------+
- *
- * write count: 1 byte, zero based count of bytes to write
- *
- * read count: 1 byte, zero based count of bytes to read
- *
- * write payload: up to 62 bytes of data to write, length must match
- * write count
- *
- * Response:
- * +-------------+-----------------------+
- * | status : 2B | read payload : <= 62B |
- * +-------------+-----------------------+
- *
- * status: 2 byte status
- * 0x0000: Success
- * 0x0001: SPI timeout
- * 0x0002: Busy, try again
- * This can happen if someone else has acquired the shared memory
- * buffer that the SPI driver uses as /dev/null
- * 0x0003: Write count invalid (> 62 bytes, or mismatch with payload)
- * 0x0004: Read count invalid (> 62 bytes)
- * 0x0005: The SPI bridge is disabled.
- * 0x8000: Unknown error mask
- * The bottom 15 bits will contain the bottom 15 bits from the EC
- * error code.
- *
- * read payload: up to 62 bytes of data read from SPI, length will match
- * requested read count
- */
-
-enum usb_spi_error {
- USB_SPI_SUCCESS = 0x0000,
- USB_SPI_TIMEOUT = 0x0001,
- USB_SPI_BUSY = 0x0002,
- USB_SPI_WRITE_COUNT_INVALID = 0x0003,
- USB_SPI_READ_COUNT_INVALID = 0x0004,
- USB_SPI_DISABLED = 0x0005,
- USB_SPI_UNKNOWN_ERROR = 0x8000,
-};
-
-enum usb_spi_request {
- USB_SPI_REQ_ENABLE = 0x0000,
- USB_SPI_REQ_DISABLE = 0x0001,
- USB_SPI_REQ_ENABLE_AP = 0x0002,
- USB_SPI_REQ_ENABLE_EC = 0x0003,
- USB_SPI_REQ_ENABLE_H1 = 0x0004,
- USB_SPI_REQ_RESET = 0x0005,
- USB_SPI_REQ_BOOT_CFG = 0x0006,
- USB_SPI_REQ_SOCKET = 0x0007,
- USB_SPI_REQ_SIGNING_START = 0x0008,
- USB_SPI_REQ_SIGNING_SIGN = 0x0009,
-};
-
-/* USB SPI device bitmasks */
-enum usb_spi {
- USB_SPI_DISABLE = 0,
- USB_SPI_AP = BIT(0),
- USB_SPI_EC = BIT(1),
- USB_SPI_H1 = BIT(2),
- USB_SPI_ALL = USB_SPI_AP | USB_SPI_EC | USB_SPI_H1
-};
-
-
-#define USB_SPI_MAX_WRITE_COUNT 62
-#define USB_SPI_MAX_READ_COUNT 62
-
-BUILD_ASSERT(USB_MAX_PACKET_SIZE == (1 + 1 + USB_SPI_MAX_WRITE_COUNT));
-BUILD_ASSERT(USB_MAX_PACKET_SIZE == (2 + USB_SPI_MAX_READ_COUNT));
-
-struct usb_spi_state {
- /*
- * The SPI bridge must be enabled both locally and by the host to allow
- * access to the SPI device. The enabled_host flag is set and cleared
- * by sending USB_SPI_REQ_ENABLE_EC, USB_SPI_REQ_ENABLE_HOST, and
- * USB_SPI_REQ_DISABLE to the device control endpoint. The
- * enabled_device flag is set by calling usb_spi_enable.
- */
- int enabled_host;
- int enabled_device;
-
- /*
- * The current enabled state. This is only updated in the deferred
- * callback. Whenever either of the host or device specific enable
- * flags is changed the deferred callback is queued, and it will check
- * their combined state against this flag. If the combined state is
- * different, then one of usb_spi_board_enable or usb_spi_board_disable
- * is called and this flag is updated. This ensures that the board
- * specific state update routines are only called from the deferred
- * callback.
- */
- int enabled;
-};
-
-/*
- * Compile time Per-USB gpio configuration stored in flash. Instances of this
- * structure are provided by the user of the USB gpio. This structure binds
- * together all information required to operate a USB gpio.
- */
-struct usb_spi_config {
- /*
- * In RAM state of the USB SPI bridge.
- */
- struct usb_spi_state *state;
-
- /*
- * Interface and endpoint indices.
- */
- int interface;
- int endpoint;
-
- /*
- * Deferred function to call to handle SPI request.
- */
- const struct deferred_data *deferred;
-
-
-
- /*
- * Pointer to tx and rx queues and bounce buffer.
- */
- uint8_t *buffer;
- struct consumer const consumer;
- struct queue const *tx_queue;
-};
-
-extern struct consumer_ops const usb_spi_consumer_ops;
-
-/*
- * Convenience macro for defining a USB SPI bridge driver.
- *
- * NAME is used to construct the names of the trampoline functions and the
- * usb_spi_config struct, the latter is just called NAME.
- *
- * INTERFACE is the index of the USB interface to associate with this
- * SPI driver.
- *
- * ENDPOINT is the index of the USB bulk endpoint used for receiving and
- * transmitting bytes.
- *
- * FLAGS is unused right now, but add to definition for consistency
- */
-
-#define USB_SPI_CONFIG(NAME, \
- INTERFACE, \
- ENDPOINT, \
- FLAGS) \
- \
- static uint8_t CONCAT2(NAME, _buffer_)[USB_MAX_PACKET_SIZE]; \
- static void CONCAT2(NAME, _deferred_)(void); \
- DECLARE_DEFERRED(CONCAT2(NAME, _deferred_)); \
- static struct queue const CONCAT2(NAME, _to_usb_); \
- static struct queue const CONCAT3(usb_to_, NAME, _); \
- USB_STREAM_CONFIG_FULL(CONCAT2(NAME, _usb_), \
- INTERFACE, \
- USB_CLASS_VENDOR_SPEC, \
- USB_SUBCLASS_GOOGLE_SPI, \
- USB_PROTOCOL_GOOGLE_SPI, \
- USB_STR_SPI_NAME, \
- ENDPOINT, \
- USB_MAX_PACKET_SIZE, \
- USB_MAX_PACKET_SIZE, \
- CONCAT3(usb_to_, NAME, _), \
- CONCAT2(NAME, _to_usb_)) \
- static struct usb_spi_state CONCAT2(NAME, _state_); \
- struct usb_spi_config const NAME = { \
- .state = &CONCAT2(NAME, _state_), \
- .interface = INTERFACE, \
- .endpoint = ENDPOINT, \
- .deferred = &CONCAT2(NAME, _deferred__data), \
- .buffer = CONCAT2(NAME, _buffer_), \
- .consumer = { \
- .queue = &CONCAT3(usb_to_, NAME, _), \
- .ops = &usb_spi_consumer_ops, \
- }, \
- .tx_queue = &CONCAT2(NAME, _to_usb_), \
- }; \
- static struct queue const CONCAT2(NAME, _to_usb_) = \
- QUEUE_DIRECT(USB_MAX_PACKET_SIZE, uint8_t, \
- null_producer, CONCAT2(NAME, _usb_).consumer); \
- static struct queue const CONCAT3(usb_to_, NAME, _) = \
- QUEUE_DIRECT(USB_MAX_PACKET_SIZE, uint8_t, \
- CONCAT2(NAME, _usb_).producer, NAME.consumer); \
- static int CONCAT2(NAME, _interface_) \
- (struct usb_setup_packet *req) \
- { \
- return usb_spi_interface(&NAME, req); \
- } \
- USB_DECLARE_IFACE(INTERFACE, CONCAT2(NAME, _interface_)); \
- static void CONCAT2(NAME, _deferred_)(void) \
- { \
- usb_spi_deferred(&NAME); \
- }
-
-/*
- * Handle SPI request in a deferred callback.
- */
-void usb_spi_deferred(struct usb_spi_config const *config);
-
-/*
- * Set the enable state for the USB-SPI bridge.
- *
- * The bridge must be enabled from both the host and device side
- * before the SPI bus is usable. This allows the bridge to be
- * available for host tools to use without forcing the device to
- * disconnect or disable whatever else might be using the SPI bus.
- */
-void usb_spi_enable(struct usb_spi_config const *config, int enabled);
-
-/*
- * This is used by the trampoline function defined above interpret the USB
- * endpoint events with the generic USB GPIO driver.
- */
-int usb_spi_interface(struct usb_spi_config const *config,
- struct usb_setup_packet *req);
-
-/*
- * These functions should be implemented by the board to provide any board
- * specific operations required to enable or disable access to the SPI device.
- * usb_spi_board_enable should return EC_SUCCESS on success or an error
- * otherwise.
- */
-int usb_spi_board_enable(struct usb_spi_config const *config);
-void usb_spi_board_disable(struct usb_spi_config const *config);
-
-#endif /* __CROS_EC_USB_SPI_H */