static void musb_attach(USBPort *port, USBDevice *dev);
-struct musb_s {
+typedef struct {
+ uint16_t faddr[2];
+ uint8_t haddr[2];
+ uint8_t hport[2];
+ uint16_t csr[2];
+ uint16_t maxp[2];
+ uint16_t rxcount;
+ uint8_t type[2];
+ uint8_t interval[2];
+ uint8_t config;
+ uint8_t fifosize;
+ int timeout[2]; /* Always in microframes */
+
+ uint8_t *buf[2];
+ int fifolen[2];
+ int fifostart[2];
+ int fifoaddr[2];
+ USBPacket packey[2];
+ int status[2];
+ int ext_size[2];
+
+ /* For callbacks' use */
+ int epnum;
+ int interrupt[2];
+ MUSBState *musb;
+ USBCallback *delayed_cb[2];
+ QEMUTimer *intv_timer[2];
+} MUSBEndPoint;
+
+struct MUSBState {
qemu_irq *irqs;
USBPort port;
uint8_t buf[0x8000];
- struct musb_ep_s {
- uint16_t faddr[2];
- uint8_t haddr[2];
- uint8_t hport[2];
- uint16_t csr[2];
- uint16_t maxp[2];
- uint16_t rxcount;
- uint8_t type[2];
- uint8_t interval[2];
- uint8_t config;
- uint8_t fifosize;
- int timeout[2]; /* Always in microframes */
-
- uint8_t *buf[2];
- int fifolen[2];
- int fifostart[2];
- int fifoaddr[2];
- USBPacket packey[2];
- int status[2];
- int ext_size[2];
-
- /* For callbacks' use */
- int epnum;
- int interrupt[2];
- struct musb_s *musb;
- USBCallback *delayed_cb[2];
- QEMUTimer *intv_timer[2];
/* Duplicating the world since 2008!... probably we should have 32
* logical, single endpoints instead. */
- } ep[16];
+ MUSBEndPoint ep[16];
};
-static void musb_vbus_set(struct musb_s *s, int level)
+static void musb_vbus_set(MUSBState *s, int level)
{
if (level)
s->devctl |= 3 << MGC_S_DEVCTL_VBUS;
qemu_set_irq(s->irqs[musb_set_vbus], level);
}
-static void musb_intr_set(struct musb_s *s, int line, int level)
+static void musb_intr_set(MUSBState *s, int line, int level)
{
if (!level) {
s->intr &= ~(1 << line);
}
}
-static void musb_tx_intr_set(struct musb_s *s, int line, int level)
+static void musb_tx_intr_set(MUSBState *s, int line, int level)
{
if (!level) {
s->tx_intr &= ~(1 << line);
}
}
-static void musb_rx_intr_set(struct musb_s *s, int line, int level)
+static void musb_rx_intr_set(MUSBState *s, int line, int level)
{
if (line) {
if (!level) {
musb_tx_intr_set(s, line, level);
}
-uint32_t musb_core_intr_get(struct musb_s *s)
+uint32_t musb_core_intr_get(MUSBState *s)
{
return (s->rx_intr << 15) | s->tx_intr;
}
-void musb_core_intr_clear(struct musb_s *s, uint32_t mask)
+void musb_core_intr_clear(MUSBState *s, uint32_t mask)
{
if (s->rx_intr) {
s->rx_intr &= mask >> 15;
}
}
-void musb_set_size(struct musb_s *s, int epnum, int size, int is_tx)
+void musb_set_size(MUSBState *s, int epnum, int size, int is_tx)
{
s->ep[epnum].ext_size[!is_tx] = size;
s->ep[epnum].fifostart[0] = 0;
s->ep[epnum].fifolen[1] = 0;
}
-static void musb_session_update(struct musb_s *s, int prev_dev, int prev_sess)
+static void musb_session_update(MUSBState *s, int prev_dev, int prev_sess)
{
int detect_prev = prev_dev && prev_sess;
int detect = !!s->port.dev && s->session;
/* Attach or detach a device on our only port. */
static void musb_attach(USBPort *port, USBDevice *dev)
{
- struct musb_s *s = (struct musb_s *) port->opaque;
+ MUSBState *s = (MUSBState *) port->opaque;
USBDevice *curr;
port = &s->port;
static inline void musb_cb_tick0(void *opaque)
{
- struct musb_ep_s *ep = (struct musb_ep_s *) opaque;
+ MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
ep->delayed_cb[0](&ep->packey[0], opaque);
}
static inline void musb_cb_tick1(void *opaque)
{
- struct musb_ep_s *ep = (struct musb_ep_s *) opaque;
+ MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
ep->delayed_cb[1](&ep->packey[1], opaque);
}
static inline void musb_schedule_cb(USBPacket *packey, void *opaque, int dir)
{
- struct musb_ep_s *ep = (struct musb_ep_s *) opaque;
+ MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
int timeout = 0;
if (ep->status[dir] == USB_RET_NAK)
/* TODO: what with low-speed Bulk and Isochronous? */
}
- cpu_abort(cpu_single_env, "bad interval\n");
+ hw_error("bad interval\n");
}
-static inline void musb_packet(struct musb_s *s, struct musb_ep_s *ep,
+static inline void musb_packet(MUSBState *s, MUSBEndPoint *ep,
int epnum, int pid, int len, USBCallback cb, int dir)
{
int ret;
{
/* Unfortunately we can't use packey->devep because that's the remote
* endpoint number and may be different than our local. */
- struct musb_ep_s *ep = (struct musb_ep_s *) opaque;
+ MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
int epnum = ep->epnum;
- struct musb_s *s = ep->musb;
+ MUSBState *s = ep->musb;
ep->fifostart[0] = 0;
ep->fifolen[0] = 0;
{
/* Unfortunately we can't use packey->devep because that's the remote
* endpoint number and may be different than our local. */
- struct musb_ep_s *ep = (struct musb_ep_s *) opaque;
+ MUSBEndPoint *ep = (MUSBEndPoint *) opaque;
int epnum = ep->epnum;
- struct musb_s *s = ep->musb;
+ MUSBState *s = ep->musb;
ep->fifostart[1] = 0;
ep->fifolen[1] = 0;
musb_rx_intr_set(s, epnum, 1);
}
-static void musb_tx_rdy(struct musb_s *s, int epnum)
+static void musb_tx_rdy(MUSBState *s, int epnum)
{
- struct musb_ep_s *ep = s->ep + epnum;
+ MUSBEndPoint *ep = s->ep + epnum;
int pid;
int total, valid = 0;
TRACE("start %d, len %d", ep->fifostart[0], ep->fifolen[0] );
total, musb_tx_packet_complete, 0);
}
-static void musb_rx_req(struct musb_s *s, int epnum)
+static void musb_rx_req(MUSBState *s, int epnum)
{
- struct musb_ep_s *ep = s->ep + epnum;
+ MUSBEndPoint *ep = s->ep + epnum;
int total;
/* If we already have a packet, which didn't fit into the
total, musb_rx_packet_complete, 1);
}
-static uint8_t musb_read_fifo(struct musb_ep_s *ep)
+static uint8_t musb_read_fifo(MUSBEndPoint *ep)
{
uint8_t value;
if (ep->fifolen[1] >= 64) {
return value;
}
-static void musb_write_fifo(struct musb_ep_s *ep, uint8_t value)
+static void musb_write_fifo(MUSBEndPoint *ep, uint8_t value)
{
TRACE("EP%d = %02x", ep->epnum, value);
if (ep->fifolen[0] >= 64) {
ep->csr[0] |= MGC_M_TXCSR_FIFONOTEMPTY;
}
-static void musb_ep_frame_cancel(struct musb_ep_s *ep, int dir)
+static void musb_ep_frame_cancel(MUSBEndPoint *ep, int dir)
{
if (ep->intv_timer[dir])
qemu_del_timer(ep->intv_timer[dir]);
/* Bus control */
static uint8_t musb_busctl_readb(void *opaque, int ep, int addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
-// TRACE("ADDR = 0x%08x", addr);
+ MUSBState *s = (MUSBState *) opaque;
+ // TRACE("ADDR = 0x%08x", addr);
switch (addr) {
/* For USB2.0 HS hubs only */
static void musb_busctl_writeb(void *opaque, int ep, int addr, uint8_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
switch (addr) {
case MUSB_HDRC_TXFUNCADDR:
static uint16_t musb_busctl_readh(void *opaque, int ep, int addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
switch (addr) {
case MUSB_HDRC_TXFUNCADDR:
static void musb_busctl_writeh(void *opaque, int ep, int addr, uint16_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
switch (addr) {
case MUSB_HDRC_TXFUNCADDR:
/* Endpoint control */
static uint8_t musb_ep_readb(void *opaque, int ep, int addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
switch (addr) {
case MUSB_HDRC_TXTYPE:
static void musb_ep_writeb(void *opaque, int ep, int addr, uint8_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
switch (addr) {
case MUSB_HDRC_TXTYPE:
static uint16_t musb_ep_readh(void *opaque, int ep, int addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
uint16_t ret;
switch (addr) {
static void musb_ep_writeh(void *opaque, int ep, int addr, uint16_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
switch (addr) {
case MUSB_HDRC_TXMAXP:
/* Generic control */
static uint32_t musb_readb(void *opaque, target_phys_addr_t addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
int ep, i;
uint8_t ret;
// TRACE("ADDR = 0x%08x", addr);
static void musb_writeb(void *opaque, target_phys_addr_t addr, uint32_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
int ep;
// TRACE("ADDR = 0x%08x = %08x", addr, value);
static uint32_t musb_readh(void *opaque, target_phys_addr_t addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
int ep, i;
uint16_t ret;
// TRACE("ADDR = 0x%08x", addr);
static void musb_writeh(void *opaque, target_phys_addr_t addr, uint32_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
int ep;
//TRACE("ADDR = 0x%08x = %08x", addr, value);
static uint32_t musb_readw(void *opaque, target_phys_addr_t addr)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
int ep;
switch (addr) {
static void musb_writew(void *opaque, target_phys_addr_t addr, uint32_t value)
{
- struct musb_s *s = (struct musb_s *) opaque;
+ MUSBState *s = (MUSBState *) opaque;
int ep;
// TRACE("ADDR = 0x%08x = %08x", addr, value);
static void musb_save_state(QEMUFile *f, void *opaque)
{
- struct musb_s *s = (struct musb_s *)opaque;
+ MUSBState *s = (MUSBState *)opaque;
int i, j;
qemu_put_sbe32(f, s->idx);
static int musb_load_state(QEMUFile *f, void *opaque, int version_id)
{
- struct musb_s *s = (struct musb_s *)opaque;
+ MUSBState *s = (MUSBState *)opaque;
int i, j;
uint32_t x;
return 0;
}
-struct musb_s *musb_init(qemu_irq *irqs)
+MUSBState *musb_init(qemu_irq *irqs)
{
- struct musb_s *s = qemu_mallocz(sizeof(*s));
+ MUSBState *s = qemu_mallocz(sizeof(*s));
int i;
s->irqs = irqs;