92 lines
2.6 KiB
C
92 lines
2.6 KiB
C
#include "hw/arm/ipod_touch_mipi_dsi.h"
|
|
|
|
static uint64_t ipod_touch_mipi_dsi_read(void *opaque, hwaddr addr, unsigned size)
|
|
{
|
|
fprintf(stderr, "%s: read from location 0x%08x\n", __func__, addr);
|
|
|
|
IPodTouchMIPIDSIState *s = (IPodTouchMIPIDSIState *)opaque;
|
|
switch(addr)
|
|
{
|
|
case 0x0:
|
|
return 0x103 | rDSIM_STATUS_TxReadyHsClk;
|
|
case REG_INTSRC:
|
|
return rDSIM_INTSRC_RxDatDone;
|
|
case REG_RXFIFO:
|
|
if(!s->return_panel_id) {
|
|
s->return_panel_id = true;
|
|
// TODO this should be rewritten as a proper queue!
|
|
return DSIM_RSP_LONG_READ | (3 << 8); // the latter part indicates the length of the response (the panel ID)
|
|
} else {
|
|
s->return_panel_id = false;
|
|
return 0x00a1d13c;
|
|
}
|
|
|
|
case REG_FIFOCTRL:
|
|
return rDSIM_FIFOCTRL_EmptyHSfr;
|
|
default:
|
|
// hw_error("%s: read invalid location 0x%08x.\n", __func__, addr);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static void ipod_touch_mipi_dsi_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
|
|
{
|
|
IPodTouchMIPIDSIState *s = (IPodTouchMIPIDSIState *)opaque;
|
|
fprintf(stderr, "%s: writing 0x%08x to 0x%08x\n", __func__, val, addr);
|
|
|
|
switch(addr)
|
|
{
|
|
case REG_PKTHDR:
|
|
s->pkthdr_reg = val;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static const MemoryRegionOps mipi_dsi_ops = {
|
|
.read = ipod_touch_mipi_dsi_read,
|
|
.write = ipod_touch_mipi_dsi_write,
|
|
.endianness = DEVICE_NATIVE_ENDIAN,
|
|
};
|
|
|
|
static void ipod_touch_mipi_dsi_realize(DeviceState *dev, Error **errp)
|
|
{
|
|
|
|
}
|
|
|
|
static void ipod_touch_mipi_dsi_init(Object *obj)
|
|
{
|
|
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
|
|
DeviceState *dev = DEVICE(sbd);
|
|
IPodTouchMIPIDSIState *s = IPOD_TOUCH_MIPI_DSI(dev);
|
|
|
|
memory_region_init_io(&s->iomem, obj, &mipi_dsi_ops, s, "mipi_dsi", 0x10000);
|
|
sysbus_init_mmio(sbd, &s->iomem);
|
|
sysbus_init_irq(sbd, &s->irq);
|
|
|
|
s->return_panel_id = 0;
|
|
}
|
|
|
|
static void ipod_touch_mipi_dsi_class_init(ObjectClass *klass, void *data)
|
|
{
|
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
|
|
dc->realize = ipod_touch_mipi_dsi_realize;
|
|
}
|
|
|
|
static const TypeInfo ipod_touch_mipi_dsi_info = {
|
|
.name = TYPE_IPOD_TOUCH_MIPI_DSI,
|
|
.parent = TYPE_SYS_BUS_DEVICE,
|
|
.instance_size = sizeof(IPodTouchMIPIDSIState),
|
|
.instance_init = ipod_touch_mipi_dsi_init,
|
|
.class_init = ipod_touch_mipi_dsi_class_init,
|
|
};
|
|
|
|
static void ipod_touch_machine_types(void)
|
|
{
|
|
type_register_static(&ipod_touch_mipi_dsi_info);
|
|
}
|
|
|
|
type_init(ipod_touch_machine_types) |