diff options
author | Simon Glass <sjg@chromium.org> | 2012-05-26 17:39:47 -0700 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-07-02 22:35:50 -0700 |
commit | f492f04a9d90504fa2d042b3a5bbf2aa11e123eb (patch) | |
tree | e4703e69e7eb216d7bc9031886686088537b2a10 | |
parent | 34bba875778918f1b4e45c5f3ced982adbca5b9e (diff) | |
download | chrome-ec-f492f04a9d90504fa2d042b3a5bbf2aa11e123eb.tar.gz |
stm32: Fix up SPI driver to use host_command interface
This driver was not refactored when the host_command changes were made,
although i2c was. Tidy this up.
SPI requests the command response immediately rather than going through
the task queue, since otherwise a response may take long enough that the
SPI master misses it altogether.
BUG=chrome-os-partner:10533
TEST=manual:
build and boot on snow; In U-Boot:
> sspi 4:0 240 20
See that it gets key messages back now
Change-Id: Ia2c24d4c8876fefedad4c02802f77e50d7159d03
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/25982
-rw-r--r-- | chip/stm32/spi.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/chip/stm32/spi.c b/chip/stm32/spi.c index e26f289766..09ba7c909c 100644 --- a/chip/stm32/spi.c +++ b/chip/stm32/spi.c @@ -11,7 +11,7 @@ #include "dma.h" #include "gpio.h" #include "hooks.h" -#include "message.h" +#include "host_command.h" #include "registers.h" #include "spi.h" #include "task.h" @@ -55,8 +55,8 @@ enum { * Our input and output buffers. These must be large enough for our largest * message, including protocol overhead. */ -static char out_msg[32 + MSG_PROTO_BYTES]; -static char in_msg[32 + MSG_PROTO_BYTES]; +static char out_msg[32]; +static char in_msg[32]; /** * Monitor the SPI bus @@ -68,7 +68,7 @@ static char in_msg[32 + MSG_PROTO_BYTES]; * TODO(sjg): Use an interrupt on NSS to triggler this function. * */ -void spi_work_task(void) +void spi_task(void) { int port = STM32_SPI1_PORT; @@ -121,22 +121,19 @@ void spi_work_task(void) */ static void reply(int port, char *msg, int msg_len) { + int sum, i; int dmac; - int sum; - - /* Get the old checksumsum */ - sum = msg[msg_len - 1 + SPI_MSG_HEADER_BYTES]; /* Add our header bytes */ - msg_len += SPI_MSG_HEADER_BYTES + SPI_MSG_TRAILER_BYTES - - MSG_TRAILER_BYTES; + msg_len += SPI_MSG_HEADER_BYTES + SPI_MSG_TRAILER_BYTES; msg[0] = SPI_MSG_HEADER; msg[1] = msg_len & 0xff; msg[2] = (msg_len >> 8) & 0xff; - /* Update the checksum */ - sum += msg[0] + msg[1] + msg[2]; - msg[msg_len - 2] = sum; + /* Calculate the checksum */ + for (i = sum = 0; i < msg_len - 2; i++) + sum += msg[i]; + msg[msg_len - 2] = sum & 0xff; msg[msg_len - 1] = SPI_MSG_PREAMBLE; /* @@ -163,6 +160,7 @@ static void reply(int port, char *msg, int msg_len) */ static void spi_interrupt(int port) { + enum ec_status status; int msg_len; int dmac; int cmd; @@ -180,13 +178,13 @@ static void spi_interrupt(int port) in_msg); /* Process the command and send the reply */ - msg_len = message_process_cmd(cmd, out_msg + SPI_MSG_HEADER_BYTES, - sizeof(out_msg) - SPI_MSG_PROTO_BYTES); - if (msg_len >= 0) - reply(port, out_msg, msg_len); + status = host_command_process(0, cmd, + out_msg + SPI_MSG_HEADER_BYTES + 1, &msg_len); + out_msg[SPI_MSG_HEADER_BYTES] = status; + reply(port, out_msg, msg_len); /* Wake up the task that watches for end of the incoming message */ - task_wake(TASK_ID_SPI_WORK); + task_wake(TASK_ID_SPI); } /* The interrupt code cannot pass a parameters, so handle this here */ |