diff -r 0dfaca43d90e -r 606eafc6d6a8 symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_usbtest.py --- 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)