diff -r 73ba398cc7f4 -r 07b904f40417 symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_nvmemorydevice.py --- a/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_nvmemorydevice.py Thu Jul 29 11:34:55 2010 +0100 +++ b/symbian-qemu-0.9.1-12/qemu-symbian-svp/plugins/syborg_nvmemorydevice.py Wed Aug 04 10:56:22 2010 +0100 @@ -28,6 +28,8 @@ import sys import os import array +import platform +import re class syborg_nvmemorydevice(qemu.devclass): # 256 MB default empty drive size if there is no readymade image available @@ -35,7 +37,7 @@ DEVICE_SECTOR_SIZE = 0x200 DRIVE_NAME = "qemudrive.img" DRIVE_PATH = "nvmemory" - + # Memory device registers R_NVMEM_ID = 0x0000 R_NVMEM_TRANSACTION_OFFSET = 0x0004 @@ -54,40 +56,50 @@ # Variables to store the information for current transaction shared_memory_base = 0 shared_memory_size = 0 - transaction_offset = 0 - transaction_size = 0 - transaction_direction = 0 + transaction_offset = 0 + transaction_size = 0 + transaction_direction = 0 # Variables to validate transaction - transaction_offset_set = 0 - transaction_size_set = 0 + transaction_offset_set = 0 + transaction_size_set = 0 transaction_direction_set = 0 nvmemory_sector_count = 0 drive_size = 0 sector_size = 0 - drive_image_name = "" + drive_image_name = "" + host_plat = platform.platform(); def create(self): print "syborg_nvmemorydevice: create\n" # Get properties - self.drive_size = self.properties["drive_size"] - self.sector_size = self.properties["sector_size"] + self.drive_size = self.properties["drive_size"] + self.sector_size = self.properties["sector_size"] self.drive_image_name = self.properties["drive_image_name"] print "drive size: ", self.drive_size print "sector size: ", self.sector_size - print "drive name: ", self.drive_image_name + print "drive name: ", self.drive_image_name - drive_path_and_name = self.DRIVE_PATH + "\\" + self.drive_image_name + drive_path_and_name = os.path.join(self.DRIVE_PATH, self.drive_image_name) # Save working directory self.working_dir = os.getcwd() + nvmem_lib = "" + open_mode = 0 + if re.match('^linux',self.host_plat,re.I): + nvmemlib_name = "libnvmemmory.so" + open_mode = os.O_RDWR + else: + nvmemlib_name = "nvmemmory.dll" + open_mode = os.O_RDWR|os.O_BINARY # Open the nvmemory library try: - self.nvmemlib = ctypes.CDLL("nvmemmory.dll") - except: - sys.exit("syborg_nvmemorydevice: nvmemmory.dll load failed") + self.nvmemlib = ctypes.CDLL(nvmemlib_name) + except Exception, e: + print repr(e) + sys.exit("syborg_nvmemorydevice: nvmemmory load failed") # Create an instance of non volatile memory handler class self.obj = self.nvmemlib.nvmem_create( self.sector_size ) @@ -101,7 +113,7 @@ # Here we could check why we failed - usually because the path already exists \n" pass try: - self.filehandle = os.open( drive_path_and_name, os.O_RDWR|os.O_BINARY ) + self.filehandle = os.open( drive_path_and_name, open_mode ) os.close( self.filehandle ) except: print "syborg_nvmemorydevice: drive image not found - create\n" @@ -119,7 +131,7 @@ index = index+1 # Create path and get handle to the raw memory array - imagepath = self.working_dir + "\\" + drive_path_and_name + imagepath = os.path.join(self.working_dir, drive_path_and_name) print "imagepath: ", imagepath self.nvmemhandle = self.nvmemlib.nvmem_open( self.obj, imagepath ) if( self.nvmemhandle < 0 ): @@ -132,7 +144,7 @@ print "syborg_nvmemorydevice: created\n" def updateIrq(self,new_value): - self.set_irq_level(0, new_value) + self.set_irq_level(0, new_value) def nvmem_request_callback(self, result): #print "graphics_request_callback: " , result @@ -145,48 +157,48 @@ self.nvmem_callback = self.CALLBACKFUNC(self.nvmem_request_callback) self.nvmemlib.nvmem_set_callback( self.obj, self.nvmem_callback ) - def read_reg(self, offset): + def read_reg(self, offset): offset >>= 2 - #print "read register: 0x%x" % (offset) - if offset == self.R_NVMEM_ID: - return 0xDEADBEEF - elif offset == self.R_NVMEM_TRANSACTION_OFFSET: - return self.transaction_offset - elif offset == self.R_NVMEM_TRANSACTION_SIZE: - return self.transaction_size - elif offset == self.R_NVMEM_TRANSACTION_DIRECTION: - return self.transaction_direction + #print "read register: 0x%x" % (offset) + if offset == self.R_NVMEM_ID: + return 0xDEADBEEF + elif offset == self.R_NVMEM_TRANSACTION_OFFSET: + return self.transaction_offset + elif offset == self.R_NVMEM_TRANSACTION_SIZE: + return self.transaction_size + elif offset == self.R_NVMEM_TRANSACTION_DIRECTION: + return self.transaction_direction elif offset == self.R_NVMEM_SHARED_MEMORY_BASE: - return self.shared_memory_base + return self.shared_memory_base elif offset == self.R_NVMEM_SHARED_MEMORY_SIZE: - return self.shared_memory_size + return self.shared_memory_size elif offset == self.R_NVMEM_NV_MEMORY_SIZE: - return self.nvmemory_sector_count + return self.nvmemory_sector_count elif offset == self.R_NVMEM_STATUS: self.updateIrq(0) - return self.status_reg - else: - reg_read_error = "syborg_nvmemorydevice: Illegal register read at: ", offset + return self.status_reg + else: + reg_read_error = "syborg_nvmemorydevice: Illegal register read at: ", offset sys.exit( reg_read_error ) - - def write_reg(self, offset, value): - offset >>= 2 - #print "write register: 0x%x value: 0x%x" % (offset, value) - if offset == self.R_NVMEM_TRANSACTION_OFFSET: - self.transaction_offset = value - self.transaction_offset_set = 1 - elif offset == self.R_NVMEM_TRANSACTION_SIZE: - self.transaction_size = value - self.transaction_size_set = 1 - elif offset == self.R_NVMEM_TRANSACTION_DIRECTION: - self.transaction_direction = value - self.transaction_direction_set = 1 + + def write_reg(self, offset, value): + offset >>= 2 + #print "write register: 0x%x value: 0x%x" % (offset, value) + if offset == self.R_NVMEM_TRANSACTION_OFFSET: + self.transaction_offset = value + self.transaction_offset_set = 1 + elif offset == self.R_NVMEM_TRANSACTION_SIZE: + self.transaction_size = value + self.transaction_size_set = 1 + elif offset == self.R_NVMEM_TRANSACTION_DIRECTION: + self.transaction_direction = value + self.transaction_direction_set = 1 elif offset == self.R_NVMEM_TRANSACTION_EXECUTE: if( (self.transaction_offset_set == 0) | (self.transaction_size_set == 0) | (self.transaction_direction_set == 0) ): - error_msg = "syborg_nvmemorydevice: Illegal transaction! All the required parameters are not set" + error_msg = "syborg_nvmemorydevice: Illegal transaction! All the required parameters are not set" sys.exit( error_msg ) elif(self.transaction_size == 0 ): - error_msg = "syborg_nvmemorydevice: Zero size transaction issued!" + error_msg = "syborg_nvmemorydevice: Zero size transaction issued!" sys.exit( error_msg ) else: if( self.transaction_direction == self.NVMEM_TRANSACTION_READ ): @@ -194,28 +206,28 @@ elif( self.transaction_direction == self.NVMEM_TRANSACTION_WRITE ): self.nvmemlib.nvmem_write( self.obj, self.nvmemory_sharedmemory_host_address, self.nvmemhandle, self.transaction_offset, self.transaction_size ) else: - error_msg = "syborg_nvmemorydevice: Transaction direction not set!" + error_msg = "syborg_nvmemorydevice: Transaction direction not set!" sys.exit( error_msg ) - self.transaction_offset_set = 0 - self.transaction_size_set = 0 - self.transaction_direction_set = 0 + self.transaction_offset_set = 0 + self.transaction_size_set = 0 + self.transaction_direction_set = 0 elif offset == self.R_NVMEM_SHARED_MEMORY_BASE: self.shared_memory_base = value elif offset == self.R_NVMEM_SHARED_MEMORY_SIZE: - self.shared_memory_size = value + self.shared_memory_size = value elif offset == self.R_NVMEM_ENABLE: if( value > 0 ): self.nvmemory_memregion = qemu.memregion( self.shared_memory_base, self.shared_memory_size ) self.nvmemory_sharedmemory_host_address = self.nvmemory_memregion.region_host_addr() print"syborg_nvmemorydevice: host addr: 0x%08x" % (self.nvmemory_sharedmemory_host_address) else: - reg_write_error = "syborg_nvmemorydevice: Illegal register write to: ", offset + reg_write_error = "syborg_nvmemorydevice: Illegal register write to: ", offset sys.exit( reg_write_error ) - # Device class properties - regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)] - irqs = 1 - name = "syborg,nvmemorydevice" - properties = {"drive_size":DEFAULT_DRIVE_SIZE, "sector_size":DEVICE_SECTOR_SIZE, "drive_image_name":DRIVE_NAME} - -qemu.register_device(syborg_nvmemorydevice) + # Device class properties + regions = [qemu.ioregion(0x1000, readl=read_reg, writel=write_reg)] + irqs = 1 + name = "syborg,nvmemorydevice" + properties = {"drive_size":DEFAULT_DRIVE_SIZE, "sector_size":DEVICE_SECTOR_SIZE, "drive_image_name":DRIVE_NAME} + +qemu.register_device(syborg_nvmemorydevice)