-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Paul Brook <paul@codesourcery.com>
- Loading branch information
Paul Brook
committed
May 14, 2009
1 parent
1de9610
commit 90d3723
Showing
4 changed files
with
95 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* QEMU Synchronous Serial Interface support | ||
* | ||
* Copyright (c) 2009 CodeSourcery. | ||
* Written by Paul Brook | ||
* | ||
* This code is licenced under the GNU GPL v2. | ||
*/ | ||
|
||
#include "ssi.h" | ||
|
||
struct SSIBus { | ||
SSISlave *slave; | ||
}; | ||
|
||
static void ssi_slave_init(DeviceState *dev, void *opaque) | ||
{ | ||
SSISlaveInfo *info = opaque; | ||
SSISlave *s = SSI_SLAVE_FROM_QDEV(dev); | ||
SSIBus *bus = qdev_get_bus(dev); | ||
|
||
bus->slave = s; | ||
s->info = info; | ||
info->init(s); | ||
} | ||
|
||
void ssi_register_slave(const char *name, int size, SSISlaveInfo *info) | ||
{ | ||
assert(size >= sizeof(SSISlave)); | ||
qdev_register(name, size, ssi_slave_init, info); | ||
} | ||
|
||
DeviceState *ssi_create_slave(SSIBus *bus, const char *name) | ||
{ | ||
DeviceState *dev; | ||
dev = qdev_create(bus, name); | ||
qdev_init(dev); | ||
return dev; | ||
} | ||
|
||
SSIBus *ssi_create_bus(void) | ||
{ | ||
return qemu_mallocz(sizeof(SSIBus)); | ||
} | ||
|
||
uint32_t ssi_transfer(SSIBus *bus, uint32_t val) | ||
{ | ||
if (!bus->slave) { | ||
return 0; | ||
} | ||
return bus->slave->info->transfer(bus->slave, val); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* QEMU Synchronous Serial Interface support. */ | ||
|
||
/* In principle SSI is a point-point interface. As such the qemu | ||
implementation has a single slave device on a "bus". | ||
However it is fairly common for boards to have multiple slaves | ||
connected to a single master, and select devices with an external | ||
chip select. This is implemented in qemu by having an explicit mux device. | ||
It is assumed that master and slave are both using the same transfer width. | ||
*/ | ||
|
||
#ifndef QEMU_SSI_H | ||
#define QEMU_SSI_H | ||
|
||
#include "qdev.h" | ||
|
||
typedef struct SSISlave SSISlave; | ||
|
||
/* Slave devices. */ | ||
typedef struct { | ||
void (*init)(SSISlave *dev); | ||
uint32_t (*transfer)(SSISlave *dev, uint32_t val); | ||
} SSISlaveInfo; | ||
|
||
struct SSISlave { | ||
DeviceState qdev; | ||
SSISlaveInfo *info; | ||
}; | ||
|
||
#define SSI_SLAVE_FROM_QDEV(dev) DO_UPCAST(SSISlave, qdev, dev) | ||
#define FROM_SSI_SLAVE(type, dev) DO_UPCAST(type, ssidev, dev) | ||
|
||
void ssi_register_slave(const char *name, int size, SSISlaveInfo *info); | ||
|
||
DeviceState *ssi_create_slave(SSIBus *bus, const char *name); | ||
|
||
/* Master interface. */ | ||
SSIBus *ssi_create_bus(void); | ||
|
||
uint32_t ssi_transfer(SSIBus *bus, uint32_t val); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters