--- /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)