Subversion Repositories freemyipod

Rev

Rev 548 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 548 Rev 582
Line 28... Line 28...
28
 
28
 
29
import sys
29
import sys
30
import struct
30
import struct
31
import ctypes
31
import ctypes
32
import usb.core
32
import usb.core
-
 
33
import base64
33
 
34
 
34
from libemcoredata import *
35
from libemcoredata import *
35
from misc import Logger, Bunch, Error, ArgumentError, gethwname
36
from misc import Logger, Bunch, Error, ArgumentError, gethwname
36
from functools import wraps
37
from functools import wraps
37
 
38
 
Line 220... Line 221...
220
            from the device. This cares about too long packages
221
            from the device. This cares about too long packages
221
            and decides whether to use DMA or not.
222
            and decides whether to use DMA or not.
222
        """
223
        """
223
        cin_maxsize = self.lib.dev.packetsizelimit.cin - self.lib.headersize
224
        cin_maxsize = self.lib.dev.packetsizelimit.cin - self.lib.headersize
224
        din_maxsize = self.lib.dev.packetsizelimit.din
225
        din_maxsize = self.lib.dev.packetsizelimit.din
225
        data = ""
226
        data = b""
226
        (headsize, bodysize, tailsize) = self._alignsplit(addr, size, cin_maxsize, 16)
227
        (headsize, bodysize, tailsize) = self._alignsplit(addr, size, cin_maxsize, 16)
227
        self.logger.debug("Downloading %d bytes from 0x%X, split as (%d/%d/%d)\n" % (size, addr, headsize, bodysize, tailsize))
228
        self.logger.debug("Downloading %d bytes from 0x%X, split as (%d/%d/%d)\n" % (size, addr, headsize, bodysize, tailsize))
228
        if headsize != 0:
229
        if headsize != 0:
229
            data += self._readmem(addr, headsize)
230
            data += self._readmem(addr, headsize)
230
            addr += headsize
231
            addr += headsize
Line 286... Line 287...
286
        """
287
        """
287
        cin_maxsize = self.lib.dev.packetsizelimit.cin - self.lib.headersize
288
        cin_maxsize = self.lib.dev.packetsizelimit.cin - self.lib.headersize
288
        string = ""
289
        string = ""
289
        while (len(string) < maxlength or maxlength < 0):
290
        while (len(string) < maxlength or maxlength < 0):
290
            data = self._readmem(addr, min(maxlength - len(string), cin_maxsize))
291
            data = self._readmem(addr, min(maxlength - len(string), cin_maxsize))
291
            length = data.find("\0")
292
            length = data.find(b"\0")
292
            if length >= 0:
293
            if length >= 0:
293
                string += data[:length]
294
                string += data[:length].decode("latin_1")
294
                break
295
                break
295
            else:
296
            else:
296
                string += data
297
                string += data.decode("latin_1")
297
            addr += cin_maxsize
298
            addr += cin_maxsize
298
        return string
299
        return string
299
    
300
    
300
    @command()
301
    @command()
301
    def i2cread(self, index, slaveaddr, startaddr, size):
302
    def i2cread(self, index, slaveaddr, startaddr, size):
302
        """ Reads data from an i2c slave """
303
        """ Reads data from an i2c slave """
303
        data = ""
304
        data = b""
304
        for i in range(size):
305
        for i in range(size):
305
            resp = self.lib.monitorcommand(struct.pack("<IBBBBII", 8, index, slaveaddr, startaddr + i, 1, 0, 0), "III1s", (None, None, None, "data"))
306
            resp = self.lib.monitorcommand(struct.pack("<IBBBBII", 8, index, slaveaddr, startaddr + i, 1, 0, 0), "III1s", (None, None, None, "data"))
306
            data += resp.data
307
            data += resp.data
307
        return data
308
        return data
308
    
309
    
Line 316... Line 317...
316
            size = 0
317
            size = 0
317
        return self.lib.monitorcommand(struct.pack("<IBBBBII%ds" % size, 9, index, slaveaddr, startaddr, size, 0, 0, data), "III", (None, None, None))
318
        return self.lib.monitorcommand(struct.pack("<IBBBBII%ds" % size, 9, index, slaveaddr, startaddr, size, 0, 0, data), "III", (None, None, None))
318
    
319
    
319
    @command()
320
    @command()
320
    def usbcread(self):
321
    def usbcread(self):
321
        """ Reads one packet with the maximal cin size """
322
        """ Reads one packet with the maximal cin size from the console """
322
        cin_maxsize = self.lib.dev.packetsizelimit.cin - self.lib.headersize
323
        cin_maxsize = self.lib.dev.packetsizelimit.cin - self.lib.headersize
323
        resp = self.lib.monitorcommand(struct.pack("<IIII", 10, cin_maxsize, 0, 0), "III%ds" % cin_maxsize, ("validsize", "buffersize", "queuesize", "data"))
324
        resp = self.lib.monitorcommand(struct.pack("<IIII", 10, cin_maxsize, 0, 0), "III%ds" % cin_maxsize, ("validsize", "buffersize", "queuesize", "data"))
324
        resp.data = resp.data[:resp.validsize]
325
        resp.data = resp.data[:resp.validsize].decode("latin_1")
325
        resp.maxsize = cin_maxsize
326
        resp.maxsize = cin_maxsize
326
        return resp
327
        return resp
327
    
328
    
328
    @command()
329
    @command()
329
    def usbcwrite(self, data):
330
    def usbcwrite(self, data):
Line 916... Line 917...
916
    def connect(self):
917
    def connect(self):
917
        self.dev = Dev(self.idVendor, self.idProduct, self.logger)
918
        self.dev = Dev(self.idVendor, self.idProduct, self.logger)
918
        self.connected = True
919
        self.connected = True
919
    
920
    
920
    def monitorcommand(self, cmd, rcvdatatypes=None, rcvstruct=None):
921
    def monitorcommand(self, cmd, rcvdatatypes=None, rcvstruct=None):
921
        self.logger.debug("Sending monitorcommand [0x%s]\n" % cmd[3::-1].encode("hex"))
922
        self.logger.debug("Sending monitorcommand [0x%s]\n" % base64.b16encode(cmd[3::-1]).decode("ascii"))
922
        writelen = self.dev.cout(cmd)
923
        writelen = self.dev.cout(cmd)
923
        if rcvdatatypes:
924
        if rcvdatatypes:
924
            rcvdatatypes = "I" + rcvdatatypes # add the response
925
            rcvdatatypes = "I" + rcvdatatypes # add the response
925
            data = self.dev.cin(struct.calcsize(rcvdatatypes))
926
            data = self.dev.cin(struct.calcsize(rcvdatatypes))
926
            data = struct.unpack(rcvdatatypes, data)
927
            data = struct.unpack(rcvdatatypes, data)
Line 1071... Line 1072...
1071
    if sys.argv[1] == "gendoc":
1072
    if sys.argv[1] == "gendoc":
1072
        # Generates Documentation
1073
        # Generates Documentation
1073
        from misc import gendoc
1074
        from misc import gendoc
1074
        logger.write("Generating documentation\n")
1075
        logger.write("Generating documentation\n")
1075
        cmddict = {}
1076
        cmddict = {}
1076
        for attr, value in Emcore.__dict__.iteritems():
1077
        for attr, value in Emcore.__dict__.items():
1077
            if getattr(value, 'func', False):
1078
            if getattr(value, 'func', False):
1078
                if getattr(value.func, '_command', False):
1079
                if getattr(value.func, '_command', False):
1079
                    cmddict[value.func.__name__] = value
1080
                    cmddict[value.func.__name__] = value
1080
        logger.write(gendoc(cmddict))
1081
        logger.write(gendoc(cmddict))
1081
    
1082