72 lines
1.5 KiB
C
72 lines
1.5 KiB
C
/*
|
|
* 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");
|
|
|