sandbox: spi: Add SPI emulation bus
This adds a SPI framework for people to hook up simulated SPI clients. Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
committed by
Simon Glass
parent
afb6134f30
commit
6122813fa2
@@ -9,4 +9,12 @@
|
||||
|
||||
#define CONFIG_SANDBOX_ARCH
|
||||
|
||||
/* Used by drivers/spi/sandbox_spi.c and arch/sandbox/include/asm/state.h */
|
||||
#ifndef CONFIG_SANDBOX_SPI_MAX_BUS
|
||||
#define CONFIG_SANDBOX_SPI_MAX_BUS 1
|
||||
#endif
|
||||
#ifndef CONFIG_SANDBOX_SPI_MAX_CS
|
||||
#define CONFIG_SANDBOX_SPI_MAX_CS 10
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
58
arch/sandbox/include/asm/spi.h
Normal file
58
arch/sandbox/include/asm/spi.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Simulate a SPI port and clients (see README.sandbox for details)
|
||||
*
|
||||
* Copyright (c) 2011-2013 The Chromium OS Authors.
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* Licensed under the GPL-2 or later.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_SPI_H__
|
||||
#define __ASM_SPI_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* The interface between the SPI bus and the SPI client. The bus will
|
||||
* instantiate a client, and that then call into it via these entry
|
||||
* points. These should be enough for the client to emulate the SPI
|
||||
* device just like the real hardware.
|
||||
*/
|
||||
struct sandbox_spi_emu_ops {
|
||||
/* The bus wants to instantiate a new client, so setup everything */
|
||||
int (*setup)(void **priv, const char *spec);
|
||||
/* The bus is done with us, so break things down */
|
||||
void (*free)(void *priv);
|
||||
/* The CS has been "activated" -- we won't worry about low/high */
|
||||
void (*cs_activate)(void *priv);
|
||||
/* The CS has been "deactivated" -- we won't worry about low/high */
|
||||
void (*cs_deactivate)(void *priv);
|
||||
/* The client is rx-ing bytes from the bus, so it should tx some */
|
||||
int (*xfer)(void *priv, const u8 *rx, u8 *tx, uint bytes);
|
||||
};
|
||||
|
||||
/*
|
||||
* There are times when the data lines are allowed to tristate. What
|
||||
* is actually sensed on the line depends on the hardware. It could
|
||||
* always be 0xFF/0x00 (if there are pull ups/downs), or things could
|
||||
* float and so we'd get garbage back. This func encapsulates that
|
||||
* scenario so we can worry about the details here.
|
||||
*/
|
||||
static inline void sandbox_spi_tristate(u8 *buf, uint len)
|
||||
{
|
||||
/* XXX: make this into a user config option ? */
|
||||
memset(buf, 0xff, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the bus/cs from the spi spec and return the start of the spi
|
||||
* client spec. If the bus/cs are invalid for the current config, then
|
||||
* it returns NULL.
|
||||
*
|
||||
* Example: arg="0:1:foo" will set bus to 0, cs to 1, and return "foo"
|
||||
*/
|
||||
const char *sandbox_spi_parse_spec(const char *arg, unsigned long *bus,
|
||||
unsigned long *cs);
|
||||
|
||||
#endif
|
||||
@@ -15,6 +15,11 @@ enum exit_type_id {
|
||||
STATE_EXIT_POWER_OFF,
|
||||
};
|
||||
|
||||
struct sandbox_spi_info {
|
||||
const char *spec;
|
||||
const struct sandbox_spi_emu_ops *ops;
|
||||
};
|
||||
|
||||
/* The complete state of the test system */
|
||||
struct sandbox_state {
|
||||
const char *cmd; /* Command to execute */
|
||||
@@ -23,6 +28,10 @@ struct sandbox_state {
|
||||
const char *parse_err; /* Error to report from parsing */
|
||||
int argc; /* Program arguments */
|
||||
char **argv;
|
||||
|
||||
/* Pointer to information for each SPI bus/cs */
|
||||
struct sandbox_spi_info spi[CONFIG_SANDBOX_SPI_MAX_BUS]
|
||||
[CONFIG_SANDBOX_SPI_MAX_CS];
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user