symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_pointer.py
changeset 1 2fb8b9db1c86
child 62 99ca724f9829
--- /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)