diff options
Diffstat (limited to 'chip/stm32/usb_spi.c')
-rw-r--r-- | chip/stm32/usb_spi.c | 152 |
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; } /* |