--- a/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_usbtest.py Wed Mar 24 13:46:59 2010 +0900
+++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_usbtest.py Mon Oct 18 19:39:25 2010 +0900
@@ -1,113 +1,153 @@
-import qemu
-import os
-
-class syborg_usbtest(qemu.devclass):
- REG_ID = 0
- REG_INT_ENABLE = 1
- REG_DATA_TYPE = 2
- REG_DMA_ADDR = 3
- REG_DMA_SIZE = 4
-
- def loadIMG(self):
- self.buf = open('test1.BMP','rb').read()
- self.bufC = open('test.BMP','rb').read()
- self.bmpsize = os.path.getsize('test1.BMP')
- self.Csize = os.path.getsize('test.BMP')
-
- def timertick(self):
- if self.cha==0:
- compSize=self.bmpsize
- buf=self.buf
- self.cha=1
- else:
- compSize=self.Csize
- buf=self.bufC
- self.cha=0
- if self.dma_size < compSize:
- self.dma_size = 0
- else:
- for x in buf:
- ch = ord(x)
- if self.dma_size > 0:
- self.dma_writeb(self.dma_addr, ch)
- self.dma_addr += 1
- self.dma_size -= 1
- self.set_irq_level(0, self.int_enable)
-
- def timer_on(self):
- self.ptimer = qemu.ptimer(self.timertick, 1)
- self.ptimer.run(0)
-
- def timer_off(self):
- self.ptimer.stop()
- self.set_irq_level(0, self.int_enable)
-
- def capturedata(self):
- if self.dma_size < self.Csize:
- self.dma_size = 0
- else:
- for x in self.bufC:
- ch = ord(x)
- if self.dma_size > 0:
- self.dma_writeb(self.dma_addr, ch)
- self.dma_addr += 1
- self.dma_size -= 1
- self.set_irq_level(0, self.int_enable)
-
- def create(self):
- self.int_enable = 1
- self.dma_addr = 0
- self.dma_size =0
- self.cha=0
- self.loadIMG()
-
- def write_reg(self, offset, value):
- offset >>= 2
- if offset==self.REG_INT_ENABLE:
- self.int_enable=value
- if value==1:
- if self.data_type==0:
- self.timer_on()
- elif self.data_type==1:
- self.capturedata()
- else:
- if self.data_type==0:
- self.timer_off()
- elif self.data_type==1:
- self.set_irq_level(0, self.int_enable)
- elif offset == self.REG_DATA_TYPE:
- self.data_type = value
- elif offset == self.REG_DMA_ADDR:
- self.dma_addr = value
- elif offset == self.REG_DMA_SIZE:
- self.dma_size = value
-
- def read_reg(self, offset):
- offset >>= 2
- if offset == self.REG_ID:
- return 0xc600f000
- elif offset == self.REG_INT_ENABLE:
- return self.int_enable
- elif offset == self.REG_DMA_ADDR:
- return self.dma_addr
- elif offset == self.REG_DMA_SIZE:
- return self.dma_size
- return 0
-
- def save(self, f):
- f.put_u32(self.int_enable)
- f.put_u32(self.dma_addr)
- f.put_u32(self.dma_size)
-
- def load(self, f):
- self.int_enable = f.get_u32()
- self.dma_addr = f.get_u32()
- self.dma_size = f.get_u32()
-
- # Device class properties
- regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
- irqs = 1
- name = "syborg,usbtest"
- properties={"chardev":None}
-
-qemu.register_device(syborg_usbtest)
+import qemu
+import os
+from ctypes import cdll
+import ctypes
+import datetime
+
+class syborg_usbtest(qemu.devclass):
+ REG_ID = 0
+ REG_INT_ENABLE = 1
+ REG_DATA_TYPE = 2
+ REG_DMA_ADDR = 3
+ REG_DMA_SIZE = 4
+ REG_DMA_INFO = 5
+ REG_DMA_INFOSIZE = 6
+ REG_DMA_CONNECT = 7
+ REG_DMA_DISCONNECT = 8
+
+ def loaddll(self):
+ #Load DLL
+ print "start dll load"
+ self.path = r'.\webcamapi.dll'
+ self.webcamdll = cdll.LoadLibrary(self.path)
+ print "end dll load"
+
+ def connect(self):
+ #Connect to USB Camera
+ print "Connect to USB Camera"
+ if self.infobuffer == 0:
+ self.infobuffer = ctypes.create_string_buffer(self.infosize)
+
+ self.DevHandle = self.webcamdll.ConnectDevHandle()
+ self.bufSize = ctypes.c_int()
+ self.PinHandle = self.webcamdll.ConnectPinHandle(self.DevHandle, ctypes.byref(self.bufSize), ctypes.byref(self.infobuffer))
+
+ infobuf = self.infobuffer
+
+ for x in infobuf:
+ ch = ord(x)
+ if self.infosize > 0:
+ self.dma_writeb(self.dataformat, ch)
+ self.dataformat += 1
+ self.infosize -= 1
+
+ def readframe(self):
+ #Read frame data
+ if self.buffer == 0:
+ self.buffer = ctypes.create_string_buffer(self.bufSize.value)
+
+ self.timelog("Read frame data Start")
+ self.Ret = self.webcamdll.ReadFrameData(self.PinHandle, ctypes.byref(self.buffer), self.bufSize.value)
+ self.timelog("Read frame data End")
+
+ #Write frame data. This is for debug.
+ #self.Ret = self.webcamdll.WriteFrameData("_frameData.bin", ctypes.byref(self.buffer), self.bufSize.value);
+
+ buf = self.buffer
+ length = len(buf)
+ count = 0
+ for x in range(1, length, 2):
+ if self.dma_size > 0:
+ self.buf = ord(buf[count+1]) << 8 | ord(buf[count+0])
+ self.dma_writel(self.dma_addr, self.buf)
+ self.dma_addr += 2
+ self.dma_size -= 2
+ count += 2
+
+ self.set_irq_level(0, self.int_enable)
+
+ def timelog(self,buf):
+ date = datetime.datetime.today().isoformat()
+ print "%(view)s %(time)s" % {"view":buf,"time":date}
+
+ def create(self):
+ self.int_enable = 1
+ self.dma_addr = 0
+ self.dma_size = 0
+ self.cha = 0
+ self.dataformat = 0
+ self.infosize = 0
+ self.buffer = 0
+ self.infobuffer = 0
+
+ def write_reg(self, offset, value):
+ #This func is called when PDD performed WriteReg func.
+ offset >>= 2
+ if offset==self.REG_INT_ENABLE:
+ self.int_enable=value
+ if value==1:
+ if self.data_type==0:
+ self.readframe()
+ else:
+ if self.data_type==0:
+ self.set_irq_level(0, self.int_enable)
+ #self.timer_off()
+ elif self.data_type==1:
+ self.set_irq_level(0, self.int_enable)
+ elif offset == self.REG_DATA_TYPE:
+ self.data_type = value
+ elif offset == self.REG_DMA_ADDR:
+ self.dma_addr = value
+ elif offset == self.REG_DMA_SIZE:
+ self.dma_size = value
+ elif offset == self.REG_DMA_INFO:
+ self.dataformat = value
+ elif offset == self.REG_DMA_INFOSIZE:
+ self.infosize = value
+ elif offset == self.REG_DMA_CONNECT:
+ self.loaddll()
+ self.connect()
+ elif offset == self.REG_DMA_DISCONNECT:
+ self.Ret = self.webcamdll.DisconnectPinHandle(self.PinHandle)
+ self.set_irq_level(0, self.int_enable)
+
+ def read_reg(self, offset):
+ #This func is called when PDD performed ReadReg func.
+ offset >>= 2
+ if offset == self.REG_ID:
+ return 0xc600f000
+ elif offset == self.REG_INT_ENABLE:
+ return self.int_enable
+ elif offset == self.REG_DMA_ADDR:
+ return self.dma_addr
+ elif offset == self.REG_DMA_SIZE:
+ return self.dma_size
+ elif offset == self.REG_DMA_FORMAT:
+ return self.dataformat
+ return 0
+
+ def save(self, f):
+ f.put_u32(self.int_enable)
+ f.put_u32(self.dma_addr)
+ f.put_u32(self.dma_size)
+ f.put_u32(self.dataformat)
+ f.put_u32(self.infosize)
+ f.put_u32(self.buffer)
+ f.put_u32(self.infobuffer)
+
+ def load(self, f):
+ self.int_enable = f.get_u32()
+ self.dma_addr = f.get_u32()
+ self.dma_size = f.get_u32()
+ self.dataformat = f.get_u32()
+ self.infosize = f.get_u32()
+ self.buffer = f.get_u32()
+ self.infobuffer = f.get_u32()
+
+ # Device class properties
+ regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)]
+ irqs = 1
+ name = "syborg,usbtest"
+ properties={"chardev":None}
+
+qemu.register_device(syborg_usbtest)