summaryrefslogtreecommitdiff
path: root/chip/stm32/usb_spi.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/stm32/usb_spi.c')
-rw-r--r--chip/stm32/usb_spi.c152
1 files changed, 73 insertions, 79 deletions
diff --git a/chip/stm32/usb_spi.c b/chip/stm32/usb_spi.c
index e80d15b6cd..5ea813a86c 100644
--- a/chip/stm32/usb_spi.c
+++ b/chip/stm32/usb_spi.c
@@ -1,4 +1,4 @@
-/* Copyright 2014 The Chromium OS Authors. All rights reserved.
+/* Copyright 2014 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -17,9 +17,9 @@
static bool usb_spi_received_packet(struct usb_spi_config const *config);
static bool usb_spi_transmitted_packet(struct usb_spi_config const *config);
static void usb_spi_read_packet(struct usb_spi_config const *config,
- struct usb_spi_packet_ctx *packet);
+ struct usb_spi_packet_ctx *packet);
static void usb_spi_write_packet(struct usb_spi_config const *config,
- struct usb_spi_packet_ctx *packet);
+ struct usb_spi_packet_ctx *packet);
/*
* Map EC error codes to USB_SPI error codes.
@@ -31,10 +31,14 @@ static void usb_spi_write_packet(struct usb_spi_config const *config,
static int16_t usb_spi_map_error(int error)
{
switch (error) {
- case EC_SUCCESS: return USB_SPI_SUCCESS;
- case EC_ERROR_TIMEOUT: return USB_SPI_TIMEOUT;
- case EC_ERROR_BUSY: return USB_SPI_BUSY;
- default: return USB_SPI_UNKNOWN_ERROR | (error & 0x7fff);
+ case EC_SUCCESS:
+ return USB_SPI_SUCCESS;
+ case EC_ERROR_TIMEOUT:
+ return USB_SPI_TIMEOUT;
+ case EC_ERROR_BUSY:
+ return USB_SPI_BUSY;
+ default:
+ return USB_SPI_UNKNOWN_ERROR | (error & 0x7fff);
}
}
@@ -47,7 +51,7 @@ static int16_t usb_spi_map_error(int error)
* @returns USB_SPI_RX_DATA_OVERFLOW if the source packet is too large
*/
static int usb_spi_read_usb_packet(struct usb_spi_transfer_ctx *dst,
- const struct usb_spi_packet_ctx *src)
+ const struct usb_spi_packet_ctx *src)
{
size_t max_read_length = dst->transfer_size - dst->transfer_index;
size_t bytes_in_buffer = src->packet_size - src->header_size;
@@ -61,7 +65,7 @@ static int usb_spi_read_usb_packet(struct usb_spi_transfer_ctx *dst,
return USB_SPI_RX_DATA_OVERFLOW;
}
memcpy(dst->buffer + dst->transfer_index, packet_buffer,
- bytes_in_buffer);
+ bytes_in_buffer);
dst->transfer_index += bytes_in_buffer;
return USB_SPI_SUCCESS;
@@ -74,7 +78,7 @@ static int usb_spi_read_usb_packet(struct usb_spi_transfer_ctx *dst,
* @param src Source transmit context we are reading data from.
*/
static void usb_spi_fill_usb_packet(struct usb_spi_packet_ctx *dst,
- struct usb_spi_transfer_ctx *src)
+ struct usb_spi_transfer_ctx *src)
{
size_t transfer_size = src->transfer_size - src->transfer_index;
size_t max_buffer_size = USB_MAX_PACKET_SIZE - dst->header_size;
@@ -97,7 +101,7 @@ static void usb_spi_fill_usb_packet(struct usb_spi_packet_ctx *dst,
* @param read_count Number of bytes to read in the SPI transfer
*/
static void usb_spi_setup_transfer(struct usb_spi_config const *config,
- size_t write_count, size_t read_count)
+ size_t write_count, size_t read_count)
{
/* Reset any status code. */
config->state->status_code = USB_SPI_SUCCESS;
@@ -145,7 +149,7 @@ static bool usb_spi_response_in_progress(struct usb_spi_config const *config)
* @param status_code status code to set for the response.
*/
static void setup_transfer_response(struct usb_spi_config const *config,
- uint16_t status_code)
+ uint16_t status_code)
{
config->state->status_code = status_code;
config->state->spi_read_ctx.transfer_index = 0;
@@ -163,7 +167,7 @@ static void setup_transfer_response(struct usb_spi_config const *config,
* @param packet Packet buffer we will be transmitting.
*/
static void create_spi_config_response(struct usb_spi_config const *config,
- struct usb_spi_packet_ctx *packet)
+ struct usb_spi_packet_ctx *packet)
{
/* Construct the response packet. */
packet->rsp_config.packet_id = USB_SPI_PKT_ID_RSP_USB_SPI_CONFIG;
@@ -175,8 +179,7 @@ static void create_spi_config_response(struct usb_spi_config const *config,
packet->rsp_config.feature_bitmap |=
USB_SPI_FEATURE_FULL_DUPLEX_SUPPORTED;
#endif
- packet->packet_size =
- sizeof(struct usb_spi_response_configuration_v2);
+ packet->packet_size = sizeof(struct usb_spi_response_configuration_v2);
}
static void create_spi_chip_select_response(struct usb_spi_config const *config,
@@ -196,16 +199,14 @@ static void create_spi_chip_select_response(struct usb_spi_config const *config,
* @param config USB SPI config
* @param packet Packet buffer we will be transmitting.
*/
-static void usb_spi_create_spi_transfer_response(
- struct usb_spi_config const *config,
- struct usb_spi_packet_ctx *transmit_packet)
+static void
+usb_spi_create_spi_transfer_response(struct usb_spi_config const *config,
+ struct usb_spi_packet_ctx *transmit_packet)
{
-
if (!usb_spi_response_in_progress(config))
return;
if (config->state->spi_read_ctx.transfer_index == 0) {
-
/* Transmit the first packet with the status code. */
transmit_packet->header_size =
offsetof(struct usb_spi_response_v2, data);
@@ -215,10 +216,9 @@ static void usb_spi_create_spi_transfer_response(
config->state->status_code;
usb_spi_fill_usb_packet(transmit_packet,
- &config->state->spi_read_ctx);
+ &config->state->spi_read_ctx);
} else if (config->state->spi_read_ctx.transfer_index <
- config->state->spi_read_ctx.transfer_size) {
-
+ config->state->spi_read_ctx.transfer_size) {
/* Transmit the continue packets. */
transmit_packet->header_size =
offsetof(struct usb_spi_continue_v2, data);
@@ -228,10 +228,10 @@ static void usb_spi_create_spi_transfer_response(
config->state->spi_read_ctx.transfer_index;
usb_spi_fill_usb_packet(transmit_packet,
- &config->state->spi_read_ctx);
+ &config->state->spi_read_ctx);
}
if (config->state->spi_read_ctx.transfer_index <
- config->state->spi_read_ctx.transfer_size) {
+ config->state->spi_read_ctx.transfer_size) {
config->state->mode = USB_SPI_MODE_CONTINUE_RESPONSE;
} else {
config->state->mode = USB_SPI_MODE_IDLE;
@@ -245,7 +245,7 @@ static void usb_spi_create_spi_transfer_response(
* @param packet Received packet to process.
*/
static void usb_spi_process_rx_packet(struct usb_spi_config const *config,
- struct usb_spi_packet_ctx *packet)
+ struct usb_spi_packet_ctx *packet)
{
if (packet->packet_size < USB_SPI_MIN_PACKET_SIZE) {
/* No valid packet exists smaller than the packet id. */
@@ -256,14 +256,12 @@ static void usb_spi_process_rx_packet(struct usb_spi_config const *config,
config->state->mode = USB_SPI_MODE_IDLE;
switch (packet->packet_id) {
- case USB_SPI_PKT_ID_CMD_GET_USB_SPI_CONFIG:
- {
+ case USB_SPI_PKT_ID_CMD_GET_USB_SPI_CONFIG: {
/* The host requires the SPI configuration. */
config->state->mode = USB_SPI_MODE_SEND_CONFIGURATION;
break;
}
- case USB_SPI_PKT_ID_CMD_RESTART_RESPONSE:
- {
+ case USB_SPI_PKT_ID_CMD_RESTART_RESPONSE: {
/*
* The host has requested the device restart the last response.
* This is used to recover from lost USB packets without
@@ -272,8 +270,7 @@ static void usb_spi_process_rx_packet(struct usb_spi_config const *config,
setup_transfer_response(config, config->state->status_code);
break;
}
- case USB_SPI_PKT_ID_CMD_TRANSFER_START:
- {
+ case USB_SPI_PKT_ID_CMD_TRANSFER_START: {
/* The host started a new USB SPI transfer */
size_t write_count = packet->cmd_start.write_count;
size_t read_count = packet->cmd_start.read_count;
@@ -282,42 +279,41 @@ static void usb_spi_process_rx_packet(struct usb_spi_config const *config,
setup_transfer_response(config, USB_SPI_DISABLED);
} else if (write_count > USB_SPI_MAX_WRITE_COUNT) {
setup_transfer_response(config,
- USB_SPI_WRITE_COUNT_INVALID);
+ USB_SPI_WRITE_COUNT_INVALID);
#ifdef CONFIG_SPI_HALFDUPLEX
} else if (read_count == USB_SPI_FULL_DUPLEX_ENABLED) {
/* Full duplex mode is not supported on this device. */
- setup_transfer_response(config,
- USB_SPI_UNSUPPORTED_FULL_DUPLEX);
+ setup_transfer_response(
+ config, USB_SPI_UNSUPPORTED_FULL_DUPLEX);
#endif
} else if (read_count > USB_SPI_MAX_READ_COUNT &&
- read_count != USB_SPI_FULL_DUPLEX_ENABLED) {
+ read_count != USB_SPI_FULL_DUPLEX_ENABLED) {
setup_transfer_response(config,
- USB_SPI_READ_COUNT_INVALID);
+ USB_SPI_READ_COUNT_INVALID);
} else {
- usb_spi_setup_transfer(config, write_count, read_count);
- packet->header_size =
- offsetof(struct usb_spi_command_v2, data);
- config->state->status_code = usb_spi_read_usb_packet(
- &config->state->spi_write_ctx, packet);
+ usb_spi_setup_transfer(config, write_count, read_count);
+ packet->header_size =
+ offsetof(struct usb_spi_command_v2, data);
+ config->state->status_code = usb_spi_read_usb_packet(
+ &config->state->spi_write_ctx, packet);
}
/* Send responses if we encountered an error. */
if (config->state->status_code != USB_SPI_SUCCESS) {
setup_transfer_response(config,
- config->state->status_code);
+ config->state->status_code);
break;
}
/* Start the SPI transfer when we've read all data. */
if (config->state->spi_write_ctx.transfer_index ==
- config->state->spi_write_ctx.transfer_size) {
+ config->state->spi_write_ctx.transfer_size) {
config->state->mode = USB_SPI_MODE_START_SPI;
}
break;
}
- case USB_SPI_PKT_ID_CMD_TRANSFER_CONTINUE:
- {
+ case USB_SPI_PKT_ID_CMD_TRANSFER_CONTINUE: {
/*
* The host has sent a continue packet for the SPI transfer
* which contains additional data payload.
@@ -326,26 +322,25 @@ static void usb_spi_process_rx_packet(struct usb_spi_config const *config,
offsetof(struct usb_spi_continue_v2, data);
if (config->state->status_code == USB_SPI_SUCCESS) {
config->state->status_code = usb_spi_read_usb_packet(
- &config->state->spi_write_ctx, packet);
+ &config->state->spi_write_ctx, packet);
}
/* Send responses if we encountered an error. */
if (config->state->status_code != USB_SPI_SUCCESS) {
setup_transfer_response(config,
- config->state->status_code);
+ config->state->status_code);
break;
}
/* Start the SPI transfer when we've read all data. */
if (config->state->spi_write_ctx.transfer_index ==
- config->state->spi_write_ctx.transfer_size) {
+ config->state->spi_write_ctx.transfer_size) {
config->state->mode = USB_SPI_MODE_START_SPI;
}
break;
}
- case USB_SPI_PKT_ID_CMD_CHIP_SELECT:
- {
+ case USB_SPI_PKT_ID_CMD_CHIP_SELECT: {
/*
* The host is requesting the chip select line be
* asserted or deasserted.
@@ -362,8 +357,7 @@ static void usb_spi_process_rx_packet(struct usb_spi_config const *config,
config->state->mode = USB_SPI_MODE_SEND_CHIP_SELECT_RESPONSE;
break;
}
- default:
- {
+ default: {
/* An unknown USB packet was delivered. */
setup_transfer_response(config, USB_SPI_RX_UNEXPECTED_PACKET);
break;
@@ -396,8 +390,10 @@ void usb_spi_deferred(struct usb_spi_config const *config)
* enable or disable routines and save our new state.
*/
if (enabled != config->state->enabled) {
- if (enabled) usb_spi_board_enable(config);
- else usb_spi_board_disable(config);
+ if (enabled)
+ usb_spi_board_enable(config);
+ else
+ usb_spi_board_disable(config);
config->state->enabled = enabled;
}
@@ -439,11 +435,10 @@ void usb_spi_deferred(struct usb_spi_config const *config)
read_count = SPI_READBACK_ALL;
}
#endif
- status_code = spi_transaction(SPI_FLASH_DEVICE,
- config->state->spi_write_ctx.buffer,
+ status_code = spi_transaction(
+ SPI_FLASH_DEVICE, config->state->spi_write_ctx.buffer,
config->state->spi_write_ctx.transfer_size,
- config->state->spi_read_ctx.buffer,
- read_count);
+ config->state->spi_read_ctx.buffer, read_count);
/* Cast the EC status code to USB SPI and start the response. */
status_code = usb_spi_map_error(status_code);
@@ -451,7 +446,7 @@ void usb_spi_deferred(struct usb_spi_config const *config)
}
if (usb_spi_response_in_progress(config) &&
- usb_spi_transmitted_packet(config)) {
+ usb_spi_transmitted_packet(config)) {
usb_spi_create_spi_transfer_response(config, transmit_packet);
usb_spi_write_packet(config, transmit_packet);
}
@@ -491,7 +486,8 @@ static void usb_spi_read_packet(struct usb_spi_config const *config,
/* Copy bytes from endpoint memory. */
packet_size = btable_ep[config->endpoint].rx_count & RX_COUNT_MASK;
memcpy_from_usbram(packet->bytes,
- (void *)usb_sram_addr(config->ep_rx_ram), packet_size);
+ (void *)usb_sram_addr(config->ep_rx_ram),
+ packet_size);
packet->packet_size = packet_size;
/* Set endpoint as valid for accepting new packet. */
STM32_TOGGLE_EP(config->endpoint, EP_RX_MASK, EP_RX_VALID, 0);
@@ -505,14 +501,14 @@ static void usb_spi_read_packet(struct usb_spi_config const *config,
* @param packet Source packet we will write to the endpoint data.
*/
static void usb_spi_write_packet(struct usb_spi_config const *config,
- struct usb_spi_packet_ctx *packet)
+ struct usb_spi_packet_ctx *packet)
{
if (packet->packet_size == 0)
return;
/* Copy bytes to endpoint memory. */
memcpy_to_usbram((void *)usb_sram_addr(config->ep_tx_ram),
- packet->bytes, packet->packet_size);
+ packet->bytes, packet->packet_size);
btable_ep[config->endpoint].tx_count = packet->packet_size;
/* Mark the packet as having no data. */
@@ -597,17 +593,17 @@ void usb_spi_event(struct usb_spi_config const *config, enum usb_ep_event evt)
usb_spi_reset_interface(config);
- btable_ep[endpoint].tx_addr = usb_sram_addr(config->ep_tx_ram);
+ btable_ep[endpoint].tx_addr = usb_sram_addr(config->ep_tx_ram);
btable_ep[endpoint].tx_count = 0;
- btable_ep[endpoint].rx_addr = usb_sram_addr(config->ep_rx_ram);
- btable_ep[endpoint].rx_count =
- 0x8000 | ((USB_MAX_PACKET_SIZE / 32 - 1) << 10);
+ btable_ep[endpoint].rx_addr = usb_sram_addr(config->ep_rx_ram);
+ btable_ep[endpoint].rx_count = 0x8000 |
+ ((USB_MAX_PACKET_SIZE / 32 - 1) << 10);
- STM32_USB_EP(endpoint) = ((endpoint << 0) | /* Endpoint Addr*/
- (2 << 4) | /* TX NAK */
- (0 << 9) | /* Bulk EP */
- (3 << 12)); /* RX Valid */
+ STM32_USB_EP(endpoint) = ((endpoint << 0) | /* Endpoint Addr*/
+ (2 << 4) | /* TX NAK */
+ (0 << 9) | /* Bulk EP */
+ (3 << 12)); /* RX Valid */
}
/*
@@ -617,21 +613,18 @@ void usb_spi_event(struct usb_spi_config const *config, enum usb_ep_event evt)
* @param rx_buf Contains setup packet
* @param tx_buf unused
*/
-int usb_spi_interface(struct usb_spi_config const *config,
- usb_uint *rx_buf,
+int usb_spi_interface(struct usb_spi_config const *config, usb_uint *rx_buf,
usb_uint *tx_buf)
{
struct usb_setup_packet setup;
usb_read_setup_packet(rx_buf, &setup);
- if (setup.bmRequestType != (USB_DIR_OUT |
- USB_TYPE_VENDOR |
- USB_RECIP_INTERFACE))
+ if (setup.bmRequestType !=
+ (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE))
return 1;
- if (setup.wValue != 0 ||
- setup.wIndex != config->interface ||
+ if (setup.wValue != 0 || setup.wIndex != config->interface ||
setup.wLength != 0)
return 1;
@@ -644,7 +637,8 @@ int usb_spi_interface(struct usb_spi_config const *config,
config->state->enabled_host = 0;
break;
- default: return 1;
+ default:
+ return 1;
}
/*