| Index: embios/trunk/tools/embios.py | 
| — | — | @@ -325,6 +325,7 @@ | 
| 326 | 326 | self.logger.info("Writing file '"+filename+"' to memory at "+self._hex(addr)+"...") | 
| 327 | 327 | with f: | 
| 328 | 328 | self.embios.write(addr, f.read()) | 
|  | 329 | +        f.close() | 
| 329 | 330 | self.logger.info("done\n") | 
| 330 | 331 |  | 
| 331 | 332 | @command | 
| — | — | @@ -344,6 +345,7 @@ | 
| 345 | 346 | self.logger.info("Reading data from address "+self._hex(addr)+" with the size "+self._hex(size)+" to '"+filename+"'...") | 
| 346 | 347 | with f: | 
| 347 | 348 | f.write(self.embios.read(addr, size)) | 
|  | 349 | +        f.close() | 
| 348 | 350 | self.logger.info("done\n") | 
| 349 | 351 |  | 
| 350 | 352 | @command | 
| — | — | @@ -358,7 +360,7 @@ | 
| 359 | 361 | if integer > 0xFFFFFFFF: | 
| 360 | 362 | raise ArgumentError("Specified integer too long") | 
| 361 | 363 | data = chr(integer) | 
| 362 |  | -        self.embios.writemem(addr, data)
 | 
|  | 364 | +        self.embios.write(addr, data) | 
| 363 | 365 | self.logger.info("Integer '"+self._hex(integer)+"' written successfully to "+self._hex(addr)) | 
| 364 | 366 |  | 
| 365 | 367 | @command | 
| — | — | @@ -368,7 +370,7 @@ | 
| 369 | 371 | <offset>: the address to download the integer from | 
| 370 | 372 | """ | 
| 371 | 373 | addr = self._hexint(addr) | 
| 372 |  | -        data = self.embios.readmem(addr, 1)
 | 
|  | 374 | +        data = self.embios.read(addr, 1) | 
| 373 | 375 | integer = ord(data) | 
| 374 | 376 | self.logger.info("Integer '"+self._hex(integer)+"' read from address "+self._hex(addr)) | 
| 375 | 377 |  | 
| — | — | @@ -495,7 +497,7 @@ | 
| 496 | 498 | """ | 
| 497 | 499 | self.logger.info("Will now lock scheduler\n") | 
| 498 | 500 | self.embios.lockscheduler() | 
| 499 |  | -
 | 
|  | 501 | + | 
| 500 | 502 | @command | 
| 501 | 503 | def unlockscheduler(self): | 
| 502 | 504 | """ | 
| — | — | @@ -503,7 +505,7 @@ | 
| 504 | 506 | """ | 
| 505 | 507 | self.logger.info("Will now unlock scheduler\n") | 
| 506 | 508 | self.embios.unlockscheduler() | 
| 507 |  | -
 | 
|  | 509 | + | 
| 508 | 510 | @command | 
| 509 | 511 | def suspendthread(self, threadid): | 
| 510 | 512 | """ | 
| — | — | @@ -664,7 +666,7 @@ | 
| 665 | 667 | " and saving it to "+self._hex(destination)+" - "+self._hex(destination+sha1size)+"...") | 
| 666 | 668 | self.embios.hmac_sha1(addr, size, destination) | 
| 667 | 669 | self.logger.info("done\n") | 
| 668 |  | -        data = self.embios.readmem(destination, sha1size)
 | 
|  | 670 | +        data = self.embios.read(destination, sha1size) | 
| 669 | 671 | hash = ord(data) | 
| 670 | 672 | self.logger.info("The generated hash is "+self._hex(hash)) | 
| 671 | 673 |  | 
| Index: embios/trunk/tools/libembios.py | 
| — | — | @@ -88,6 +88,33 @@ | 
| 89 | 89 | tailsize = end - tailaddr | 
| 90 | 90 | return (headsize, tailaddr - bodyaddr, tailsize) | 
| 91 | 91 |  | 
|  | 92 | +    def _readmem(self, addr, size): | 
|  | 93 | +        """ Reads the memory from location 'addr' with size 'size' | 
|  | 94 | +            from the device. | 
|  | 95 | +        """ | 
|  | 96 | +        resp = self.lib.monitorcommand(struct.pack("IIII", 4, addr, size, 0), "III%ds" % size, (None, None, None, "data")) | 
|  | 97 | +        return resp.data | 
|  | 98 | + | 
|  | 99 | +    def _writemem(self, addr, data): | 
|  | 100 | +        """ Writes the data in 'data' to the location 'addr' | 
|  | 101 | +            in the memory of the device. | 
|  | 102 | +        """ | 
|  | 103 | +        return self.lib.monitorcommand(struct.pack("IIII%ds" % len(data), 5, addr, len(data), 0, data), "III", (None, None, None)) | 
|  | 104 | + | 
|  | 105 | +    def _readdma(self, addr, size): | 
|  | 106 | +        """ Reads the memory from location 'addr' with size 'size' | 
|  | 107 | +            from the device. This uses DMA and the data in endpoint. | 
|  | 108 | +        """ | 
|  | 109 | +        self.lib.monitorcommand(struct.pack("IIII", 6, addr, size, 0), "III", (None, None, None)) | 
|  | 110 | +        return struct.unpack("%ds" % size, self.lib.dev.din(size))[0] | 
|  | 111 | + | 
|  | 112 | +    def _writedma(self, addr, data): | 
|  | 113 | +        """ Writes the data in 'data' to the location 'addr' | 
|  | 114 | +            in the memory of the device. This uses DMA and the data out endpoint. | 
|  | 115 | +        """ | 
|  | 116 | +        self.lib.monitorcommand(struct.pack("IIII", 7, addr, len(data), 0), "III", (None, None, None)) | 
|  | 117 | +        return self.lib.dev.dout(data) | 
|  | 118 | + | 
| 92 | 119 | def getversioninfo(self): | 
| 93 | 120 | """ This returns the emBIOS version and device information. """ | 
| 94 | 121 | return self.lib.monitorcommand(struct.pack("IIII", 1, 0, 0, 0), "IBBBBI", ("revision", "majorv", "minorv", "patchv", "swtypeid", "hwtypeid")) | 
| — | — | @@ -131,19 +158,19 @@ | 
| 132 | 159 | data = "" | 
| 133 | 160 | (headsize, bodysize, tailsize) = self._alignsplit(addr, size, cin_maxsize, 16) | 
| 134 | 161 | if headsize != 0: | 
| 135 |  | -            data += self.readmem(addr, headsize)
 | 
|  | 162 | +            data += self._readmem(addr, headsize) | 
| 136 | 163 | addr += headsize | 
| 137 | 164 | while bodysize > 0: | 
| 138 | 165 | if bodysize >= 2 * cin_maxsize: | 
| 139 | 166 | readsize = min(bodysize, din_maxsize) | 
| 140 |  | -                data += self.readdma(addr, readsize)
 | 
|  | 167 | +                data += self._readdma(addr, readsize) | 
| 141 | 168 | else: | 
| 142 | 169 | readsize = min(bodysize, cin_maxsize) | 
| 143 |  | -                data += self.readmem(addr, readsize)
 | 
|  | 170 | +                data += self._readmem(addr, readsize) | 
| 144 | 171 | addr += readsize | 
| 145 | 172 | bodysize -= readsize | 
| 146 | 173 | if tailsize != 0: | 
| 147 |  | -            data += self.readmem(addr, tailsize)
 | 
|  | 174 | +            data += self._readmem(addr, tailsize) | 
| 148 | 175 | return data | 
| 149 | 176 |  | 
| 150 | 177 | def write(self, addr, data): | 
| — | — | @@ -156,50 +183,23 @@ | 
| 157 | 184 | (headsize, bodysize, tailsize) = self._alignsplit(addr, len(data), cout_maxsize, 16) | 
| 158 | 185 | offset = 0 | 
| 159 | 186 | if headsize != 0: | 
| 160 |  | -            self.writemem(addr, data[offset:offset+headsize])
 | 
|  | 187 | +            self._writemem(addr, data[offset:offset+headsize]) | 
| 161 | 188 | offset += headsize | 
| 162 | 189 | addr += headsize | 
| 163 | 190 | while bodysize > 0: | 
| 164 | 191 | if bodysize >= 2 * cout_maxsize: | 
| 165 | 192 | writesize = min(bodysize, dout_maxsize) | 
| 166 |  | -                self.writedma(addr, data[offset:offset+writesize])
 | 
|  | 193 | +                self._writedma(addr, data[offset:offset+writesize]) | 
| 167 | 194 | else: | 
| 168 | 195 | writesize = min(bodysize, cout_maxsize) | 
| 169 |  | -                self.writemem(addr, data[offset:offset+writesize])
 | 
|  | 196 | +                self._writemem(addr, data[offset:offset+writesize]) | 
| 170 | 197 | offset += writesize | 
| 171 | 198 | addr += writesize | 
| 172 | 199 | bodysize -= writesize | 
| 173 | 200 | if tailsize != 0: | 
| 174 |  | -            self.writemem(addr, data[offset:offset+tailsize])
 | 
|  | 201 | +            self._writemem(addr, data[offset:offset+tailsize]) | 
| 175 | 202 | return data | 
| 176 | 203 |  | 
| 177 |  | -    def readmem(self, addr, size):
 | 
| 178 |  | -        """ Reads the memory from location 'addr' with size 'size'
 | 
| 179 |  | -            from the device.
 | 
| 180 |  | -        """
 | 
| 181 |  | -        resp = self.lib.monitorcommand(struct.pack("IIII", 4, addr, size, 0), "III%ds" % size, (None, None, None, "data"))
 | 
| 182 |  | -        return resp.data
 | 
| 183 |  | -        
 | 
| 184 |  | -    def writemem(self, addr, data):
 | 
| 185 |  | -        """ Writes the data in 'data' to the location 'addr'
 | 
| 186 |  | -            in the memory of the device.
 | 
| 187 |  | -        """
 | 
| 188 |  | -        return self.lib.monitorcommand(struct.pack("IIII%ds" % len(data), 5, addr, len(data), 0, data), "III", (None, None, None))
 | 
| 189 |  | -    
 | 
| 190 |  | -    def readdma(self, addr, size):
 | 
| 191 |  | -        """ Reads the memory from location 'addr' with size 'size'
 | 
| 192 |  | -            from the device. This uses DMA and the data in endpoint.
 | 
| 193 |  | -        """
 | 
| 194 |  | -        self.lib.monitorcommand(struct.pack("IIII", 6, addr, size, 0), "III", (None, None, None))
 | 
| 195 |  | -        return struct.unpack("%ds" % size, self.lib.dev.din(size))[0]
 | 
| 196 |  | -    
 | 
| 197 |  | -    def writedma(self, addr, data):
 | 
| 198 |  | -        """ Writes the data in 'data' to the location 'addr'
 | 
| 199 |  | -            in the memory of the device. This uses DMA and the data out endpoint.
 | 
| 200 |  | -        """
 | 
| 201 |  | -        self.lib.monitorcommand(struct.pack("IIII", 7, addr, len(data), 0), "III", (None, None, None))
 | 
| 202 |  | -        return self.lib.dev.dout(data)
 | 
| 203 |  | -    
 | 
| 204 | 204 | def readstring(self, addr, maxlength = 256): | 
| 205 | 205 | """ Reads a zero terminated string from memory | 
| 206 | 206 | Reads only a maximum of 'maxlength' chars. | 
| — | — | @@ -207,7 +207,7 @@ | 
| 208 | 208 | cin_maxsize = self.lib.dev.packetsizelimit["cin"] - self.lib.headersize | 
| 209 | 209 | string = "" | 
| 210 | 210 | while (len(string) < maxlength or maxlength < 0): | 
| 211 |  | -            data = self.readmem(addr, min(maxlength - len(string), cin_maxsize))
 | 
|  | 211 | +            data = self._readmem(addr, min(maxlength - len(string), cin_maxsize)) | 
| 212 | 212 | length = data.find("\0") | 
| 213 | 213 | if length >= 0: | 
| 214 | 214 | string += data[:length] | 
| — | — | @@ -342,9 +342,6 @@ | 
| 343 | 343 | threads.append(info) | 
| 344 | 344 | id += 1 | 
| 345 | 345 | return threads | 
| 346 |  | -            
 | 
| 347 |  | -        
 | 
| 348 |  | -        return self.lib.monitorcommand(struct.pack("IIII", 15, offset, size, 0), "III%ds" % size, ("structver", "tablesize", None, "data"))
 | 
| 349 | 346 |  | 
| 350 | 347 | def lockscheduler(self, freeze=True): | 
| 351 | 348 | """ Freezes/Unfreezes the scheduler """ |