| /* |
| * 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. |
| * |
| * SPI transfer command for debugging SPI devices. |
| */ |
| |
| #include "common.h" |
| #include "console.h" |
| #include "spi.h" |
| #include "timer.h" |
| #include "util.h" |
| |
| static int command_spixfer(int argc, char **argv) |
| { |
| int dev_id; |
| uint8_t offset; |
| int v = 0; |
| uint8_t data[32]; |
| char *e; |
| int rv = 0; |
| |
| if (argc != 5) |
| return EC_ERROR_PARAM_COUNT; |
| |
| dev_id = strtoi(argv[2], &e, 0); |
| if (*e) |
| return EC_ERROR_PARAM2; |
| |
| offset = strtoi(argv[3], &e, 0); |
| if (*e) |
| return EC_ERROR_PARAM3; |
| |
| v = strtoi(argv[4], &e, 0); |
| if (*e) |
| return EC_ERROR_PARAM4; |
| |
| if (strcasecmp(argv[1], "rlen") == 0) { |
| uint8_t cmd = 0x80 | offset; |
| |
| /* Arbitrary length read; param4 = len */ |
| if (v < 0 || v > sizeof(data)) |
| return EC_ERROR_PARAM4; |
| |
| rv = spi_transaction(&spi_devices[dev_id], &cmd, 1, data, v); |
| |
| if (!rv) |
| ccprintf("Data: %.*h\n", v, data); |
| |
| } else if (strcasecmp(argv[1], "w") == 0) { |
| /* 8-bit write */ |
| uint8_t cmd[2] = { offset, v }; |
| |
| rv = spi_transaction(&spi_devices[dev_id], cmd, 2, NULL, 0); |
| |
| /* |
| * Some SPI device needs a delay before accepting other |
| * commands, otherwise the write might be ignored. |
| */ |
| msleep(1); |
| } else { |
| return EC_ERROR_PARAM1; |
| } |
| |
| return rv; |
| } |
| DECLARE_CONSOLE_COMMAND(spixfer, command_spixfer, |
| "rlen/w id offset [value | len]", |
| "Read write spi. id is spi_devices array index"); |
| |