Files
qemu-ios/hw/arm/ipod_touch_sdio.c
T

106 lines
2.8 KiB
C

#include "hw/arm/ipod_touch_sdio.h"
void sdio_exec_cmd(IPodTouchSDIOState *s)
{
uint32_t addr = (s->arg >> 9) & 0x1ffff;
if(addr == (1 << 8)) {
// reading slot 1 - make sure there is a device here
//s->resp0 = 1;
}
}
static void ipod_touch_sdio_write(void *opaque, hwaddr addr, uint64_t value, unsigned size)
{
fprintf(stderr, "%s: writing 0x%08x to 0x%08x\n", __func__, value, addr);
IPodTouchSDIOState *s = (struct IPodTouchSDIOState *) opaque;
switch(addr) {
case SDIO_CMD:
s->cmd = value;
if(value & (1 << 31)) {
sdio_exec_cmd(s);
}
break;
case SDIO_ARGU:
s->arg = value;
break;
case SDIO_CSR:
s->csr = value;
break;
case SDIO_IRQMASK:
s->irq_mask = value;
break;
default:
break;
}
}
static uint64_t ipod_touch_sdio_read(void *opaque, hwaddr addr, unsigned size)
{
fprintf(stderr, "%s: offset = 0x%08x\n", __func__, addr);
IPodTouchSDIOState *s = (struct IPodTouchSDIOState *) opaque;
switch (addr) {
case SDIO_CMD:
return s->cmd;
case SDIO_ARGU:
return s->arg;
case SDIO_DSTA:
return (1 << 0) | (1 << 4) ; // 0x1 indicates that the SDIO is ready for a CMD, (1 << 4) that the command is complete
case SDIO_RESP0:
return s->resp0;
case SDIO_RESP1:
return s->resp1;
case SDIO_RESP2:
return s->resp2;
case SDIO_RESP3:
return s->resp3;
case SDIO_CSR:
return s->csr;
case SDIO_IRQMASK:
return s->irq_mask;
default:
break;
}
return 0;
}
static const MemoryRegionOps ipod_touch_sdio_ops = {
.read = ipod_touch_sdio_read,
.write = ipod_touch_sdio_write,
.endianness = DEVICE_NATIVE_ENDIAN,
};
static void ipod_touch_sdio_init(Object *obj)
{
DeviceState *dev = DEVICE(obj);
IPodTouchSDIOState *s = IPOD_TOUCH_SDIO(obj);
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
memory_region_init_io(&s->iomem, obj, &ipod_touch_sdio_ops, s, TYPE_IPOD_TOUCH_SDIO, 4096);
sysbus_init_mmio(sbd, &s->iomem);
}
static void ipod_touch_sdio_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
}
static const TypeInfo ipod_touch_sdio_type_info = {
.name = TYPE_IPOD_TOUCH_SDIO,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(IPodTouchSDIOState),
.instance_init = ipod_touch_sdio_init,
.class_init = ipod_touch_sdio_class_init,
};
static void ipod_touch_sdio_register_types(void)
{
type_register_static(&ipod_touch_sdio_type_info);
}
type_init(ipod_touch_sdio_register_types)