diff -r ffa851df0825 -r 2fb8b9db1c86 symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_pointer.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_pointer.py Fri Jul 31 15:01:17 2009 +0100 @@ -0,0 +1,99 @@ +import qemu + +class syborg_pointer(qemu.devclass): + REG_ID = 0 + REG_LATCH = 1 + REG_FIFO_COUNT = 2 + REG_X = 3 + REG_Y = 4 + REG_Z = 5 + REG_BUTTONS = 6 + REG_INT_ENABLE = 7 + REG_FIFO_SIZE = 8 + + class fifo_entry: + def __init__(self, x, y, z, buttons): + self.x = x + self.y = y + self.z = z + self.buttons = buttons + + def update_irq(self): + self.set_irq_level(0, (len(self.fifo) > 0) and self.int_enabled) + + def event(self, x, y, z, buttons): + if len(self.fifo) < self.fifo_size: + self.fifo.append(self.fifo_entry(x, y, z, buttons)) + self.update_irq() + + def create(self): + self.absolute = self.properties["absolute"] + self.fifo_size = self.properties["fifo-size"] + self.fifo=[] + self.current = self.fifo_entry(0, 0, 0, 0) + self.int_enabled = False + qemu.register_mouse(self.event, self.absolute) + + def read_reg(self, offset): + offset >>= 2 + if offset == self.REG_ID: + return 0xc51d0006 if self.absolute else 0xc51d0005 + elif offset == self.REG_FIFO_COUNT: + return len(self.fifo) + elif offset == self.REG_X: + return self.current.x + elif offset == self.REG_Y: + return self.current.y + elif offset == self.REG_Z: + return self.current.z + elif offset == self.REG_BUTTONS: + return self.current.buttons + elif offset == self.REG_INT_ENABLE: + return self.int_enabled + elif offset == self.REG_FIFO_SIZE: + return self.fifo_size + return 0 + + def write_reg(self, offset, value): + offset >>= 2 + if offset == self.REG_LATCH: + if len(self.fifo) == 0: + return + self.current = self.fifo.pop(0) + self.update_irq() + elif offset == self.REG_INT_ENABLE: + self.int_enabled = ((value & 1) != 0) + self.update_irq() + + def save(self, f): + f.put_u32(self.fifo_size) + f.put_u32(self.int_enabled) + f.put_u32(len(self.fifo) + 1) + for d in [self.current] + self.fifo: + f.put_u32(d.x) + f.put_u32(d.y) + f.put_u32(d.z) + f.put_u32(d.buttons) + + def load(self, f): + if self.fifo_size != f.get_u32(): + raise ValueError, "fifo size mismatch" + self.int_enabled = f.get_u32() + n = f.get_u32() + self.fifo = [] + while n > 0: + x = f.get_u32() + y = f.get_u32() + z = f.get_u32() + buttons = f.get_u32() + self.fifo.append(self.fifo_entry(x, y, z, buttons)) + n -= 1; + self.current = self.fifo.pop(0); + + # Device class properties + regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)] + irqs = 1 + name = "syborg,pointer" + properties = {"fifo-size":16, "absolute":1} + +qemu.register_device(syborg_pointer)