| Index: emcore/trunk/tools/emcore.py | 
| — | — | @@ -886,29 +886,31 @@ | 
| 887 | 887 | sector = self._hexint(sector) | 
| 888 | 888 | count = self._hexint(count) | 
| 889 | 889 | buffsize = self._hexint(buffsize) | 
| 890 |  | -        if buffer is None:
 | 
| 891 |  | -            buffer = self.emcore.malloc(buffsize)
 | 
| 892 |  | -            malloc = True
 | 
| 893 |  | -        else:
 | 
| 894 |  | -            buffer = self._hexint(buffer)
 | 
| 895 |  | -            malloc = False
 | 
| 896 | 890 | try: | 
|  | 891 | +            f = open(file, 'wb') | 
|  | 892 | +        except IOError: | 
|  | 893 | +            raise ArgumentError("Could not open local file for writing.") | 
|  | 894 | +        try: | 
|  | 895 | +            if buffer is None: | 
|  | 896 | +                buffer = self.emcore.malloc(buffsize) | 
|  | 897 | +                malloc = True | 
|  | 898 | +            else: | 
|  | 899 | +                buffer = self._hexint(buffer) | 
|  | 900 | +                malloc = False | 
| 897 | 901 | try: | 
| 898 |  | -                f = open(file, 'wb')
 | 
| 899 |  | -            except IOError:
 | 
| 900 |  | -                raise ArgumentError("Could not open local file for writing.")
 | 
| 901 |  | -            self.logger.info("Reading volume %s sectors %X - %X to %s..." % (volume, sector, sector + count - 1, file))
 | 
| 902 |  | -            storageinfo = self.emcore.storage_get_info(volume)
 | 
| 903 |  | -            while count > 0:
 | 
| 904 |  | -                sectors = min(count, int(buffsize / storageinfo.sectorsize))
 | 
| 905 |  | -                self.emcore.storage_read_sectors_md(volume, sector, sectors, buffsize, buffer)
 | 
| 906 |  | -                f.write(self.emcore.read(buffer, storageinfo.sectorsize * sectors))
 | 
| 907 |  | -                sector = sector + sectors
 | 
| 908 |  | -                count = count - sectors
 | 
|  | 902 | +                self.logger.info("Reading volume %s sectors %X - %X to %s..." % (volume, sector, sector + count - 1, file)) | 
|  | 903 | +                storageinfo = self.emcore.storage_get_info(volume) | 
|  | 904 | +                while count > 0: | 
|  | 905 | +                    sectors = min(count, int(buffsize / storageinfo.sectorsize)) | 
|  | 906 | +                    self.emcore.storage_read_sectors_md(volume, sector, sectors, buffsize, buffer) | 
|  | 907 | +                    f.write(self.emcore.read(buffer, storageinfo.sectorsize * sectors)) | 
|  | 908 | +                    sector = sector + sectors | 
|  | 909 | +                    count = count - sectors | 
|  | 910 | +            finally: | 
|  | 911 | +                if malloc == True: | 
|  | 912 | +                    self.emcore.free(buffer) | 
|  | 913 | +        finally: | 
| 909 | 914 | f.close() | 
| 910 |  | -        finally:
 | 
| 911 |  | -            if malloc == True:
 | 
| 912 |  | -                self.emcore.free(buffer)
 | 
| 913 | 915 | self.logger.info("done\n") | 
| 914 | 916 |  | 
| 915 | 917 | @command | 
| — | — | @@ -921,33 +923,35 @@ | 
| 922 | 924 | sector = self._hexint(sector) | 
| 923 | 925 | count = self._hexint(count) | 
| 924 | 926 | buffsize = self._hexint(buffsize) | 
| 925 |  | -        if buffer is None:
 | 
| 926 |  | -            buffer = self.emcore.malloc(buffsize)
 | 
| 927 |  | -            malloc = True
 | 
| 928 |  | -        else:
 | 
| 929 |  | -            buffer = self._hexint(buffer)
 | 
| 930 |  | -            malloc = False
 | 
| 931 | 927 | try: | 
|  | 928 | +            f = open(file, 'rb') | 
|  | 929 | +        except IOError: | 
|  | 930 | +            raise ArgumentError("Could not open local file for reading.") | 
|  | 931 | +        try: | 
|  | 932 | +            if buffer is None: | 
|  | 933 | +                buffer = self.emcore.malloc(buffsize) | 
|  | 934 | +                malloc = True | 
|  | 935 | +            else: | 
|  | 936 | +                buffer = self._hexint(buffer) | 
|  | 937 | +                malloc = False | 
| 932 | 938 | try: | 
| 933 |  | -                f = open(file, 'rb')
 | 
| 934 |  | -            except IOError:
 | 
| 935 |  | -                raise ArgumentError("Could not open local file for reading.")
 | 
| 936 |  | -            self.logger.info("Writing %s to volume %s sectors %X - %X..." % (file, volume, sector, sector + count - 1))
 | 
| 937 |  | -            storageinfo = self.emcore.storage_get_info(volume)
 | 
| 938 |  | -            while count > 0:
 | 
| 939 |  | -                sectors = min(count, int(buffsize / storageinfo.sectorsize))
 | 
| 940 |  | -                bytes = storageinfo.sectorsize * sectors
 | 
| 941 |  | -                data = f.read(bytes)
 | 
| 942 |  | -                if len(data) == 0: break
 | 
| 943 |  | -                while len(data) < bytes: data = data + f.read(bytes - len(data))
 | 
| 944 |  | -                self.emcore.write(buffer, data)
 | 
| 945 |  | -                self.emcore.storage_write_sectors_md(volume, sector, sectors, buffsize, buffer)
 | 
| 946 |  | -                sector = sector + sectors
 | 
| 947 |  | -                count = count - sectors
 | 
|  | 939 | +                self.logger.info("Writing %s to volume %s sectors %X - %X..." % (file, volume, sector, sector + count - 1)) | 
|  | 940 | +                storageinfo = self.emcore.storage_get_info(volume) | 
|  | 941 | +                while count > 0: | 
|  | 942 | +                    sectors = min(count, int(buffsize / storageinfo.sectorsize)) | 
|  | 943 | +                    bytes = storageinfo.sectorsize * sectors | 
|  | 944 | +                    data = f.read(bytes) | 
|  | 945 | +                    if len(data) == 0: break | 
|  | 946 | +                    while len(data) < bytes: data = data + f.read(bytes - len(data)) | 
|  | 947 | +                    self.emcore.write(buffer, data) | 
|  | 948 | +                    self.emcore.storage_write_sectors_md(volume, sector, sectors, buffsize, buffer) | 
|  | 949 | +                    sector = sector + sectors | 
|  | 950 | +                    count = count - sectors | 
|  | 951 | +            finally: | 
|  | 952 | +                if malloc == True: | 
|  | 953 | +                    self.emcore.free(buffer) | 
|  | 954 | +        finally: | 
| 948 | 955 | f.close() | 
| 949 |  | -        finally:
 | 
| 950 |  | -            if malloc == True:
 | 
| 951 |  | -                self.emcore.free(buffer)
 | 
| 952 | 956 | self.logger.info("done\n") | 
| 953 | 957 |  | 
| 954 | 958 | @command | 
| — | — | @@ -1014,29 +1018,33 @@ | 
| 1015 | 1019 | [buffer]: buffer address (optional) | 
| 1016 | 1020 | """ | 
| 1017 | 1021 | buffsize = self._hexint(buffsize) | 
| 1018 |  | -        if buffer is None:
 | 
| 1019 |  | -            buffer = self.emcore.malloc(buffsize)
 | 
| 1020 |  | -            malloc = True
 | 
| 1021 |  | -        else:
 | 
| 1022 |  | -            buffer = self._hexint(buffer)
 | 
| 1023 |  | -            malloc = False
 | 
| 1024 | 1022 | try: | 
|  | 1023 | +            f = open(localname, 'wb') | 
|  | 1024 | +        except IOError: | 
|  | 1025 | +            raise ArgumentError("Could not open local file for writing.") | 
|  | 1026 | +        try: | 
|  | 1027 | +            if buffer is None: | 
|  | 1028 | +                buffer = self.emcore.malloc(buffsize) | 
|  | 1029 | +                malloc = True | 
|  | 1030 | +            else: | 
|  | 1031 | +                buffer = self._hexint(buffer) | 
|  | 1032 | +                malloc = False | 
| 1025 | 1033 | try: | 
| 1026 |  | -                f = open(localname, 'wb')
 | 
| 1027 |  | -            except IOError:
 | 
| 1028 |  | -                raise ArgumentError("Could not open local file for writing.")
 | 
| 1029 |  | -            self.logger.info("Downloading file " + remotename + " to " + localname + "...")
 | 
| 1030 |  | -            fd = self.emcore.file_open(remotename, 0)
 | 
| 1031 |  | -            size = self.emcore.file_size(fd)
 | 
| 1032 |  | -            while size > 0:
 | 
| 1033 |  | -                bytes = self.emcore.file_read(fd, buffsize, buffer)
 | 
| 1034 |  | -                f.write(self.emcore.read(buffer, bytes))
 | 
| 1035 |  | -                size = size - bytes
 | 
| 1036 |  | -            self.emcore.file_close(fd)
 | 
|  | 1034 | +                self.logger.info("Downloading file " + remotename + " to " + localname + "...") | 
|  | 1035 | +                fd = self.emcore.file_open(remotename, 0) | 
|  | 1036 | +                try: | 
|  | 1037 | +                    size = self.emcore.file_size(fd) | 
|  | 1038 | +                    while size > 0: | 
|  | 1039 | +                        bytes = self.emcore.file_read(fd, buffsize, buffer) | 
|  | 1040 | +                        f.write(self.emcore.read(buffer, bytes)) | 
|  | 1041 | +                        size = size - bytes | 
|  | 1042 | +                finally: | 
|  | 1043 | +                    self.emcore.file_close(fd) | 
|  | 1044 | +            finally: | 
|  | 1045 | +                if malloc == True: | 
|  | 1046 | +                    self.emcore.free(buffer) | 
|  | 1047 | +        finally: | 
| 1037 | 1048 | f.close() | 
| 1038 |  | -        finally:
 | 
| 1039 |  | -            if malloc == True:
 | 
| 1040 |  | -                self.emcore.free(buffer)
 | 
| 1041 | 1049 | self.logger.info(" done\n") | 
| 1042 | 1050 |  | 
| 1043 | 1051 | @command | 
| — | — | @@ -1049,29 +1057,30 @@ | 
| 1050 | 1058 | [buffer]: buffer address (optional) | 
| 1051 | 1059 | """ | 
| 1052 | 1060 | buffsize = self._hexint(buffsize) | 
| 1053 |  | -        if buffer is None:
 | 
| 1054 |  | -            buffer = self.emcore.malloc(buffsize)
 | 
| 1055 |  | -            malloc = True
 | 
| 1056 |  | -        else:
 | 
| 1057 |  | -            buffer = self._hexint(buffer)
 | 
| 1058 |  | -            malloc = False
 | 
|  | 1061 | +        handle = self.emcore.dir_open(remotepath) | 
| 1059 | 1062 | try: | 
| 1060 |  | -            try: os.mkdir(localpath)
 | 
| 1061 |  | -            except: pass
 | 
| 1062 |  | -
 | 
| 1063 |  | -            handle = self.emcore.dir_open(remotepath)
 | 
| 1064 |  | -            while True:
 | 
| 1065 |  | -                try:
 | 
| 1066 |  | -                    entry = self.emcore.dir_read(handle)
 | 
| 1067 |  | -                    if entry.name == "." or entry.name == "..": continue
 | 
| 1068 |  | -                    elif entry.attributes & 0x10:
 | 
| 1069 |  | -                        self.gettree(remotepath + "/" + entry.name, localpath + "/" + entry.name, buffsize, buffer)
 | 
| 1070 |  | -                    else: self.get(remotepath + "/" + entry.name, localpath + "/" + entry.name, buffsize, buffer)
 | 
| 1071 |  | -                except: break
 | 
|  | 1063 | +            if buffer is None: | 
|  | 1064 | +                buffer = self.emcore.malloc(buffsize) | 
|  | 1065 | +                malloc = True | 
|  | 1066 | +            else: | 
|  | 1067 | +                buffer = self._hexint(buffer) | 
|  | 1068 | +                malloc = False | 
|  | 1069 | +            try: | 
|  | 1070 | +                try: os.mkdir(localpath) | 
|  | 1071 | +                except: pass | 
|  | 1072 | +                while True: | 
|  | 1073 | +                    try: | 
|  | 1074 | +                        entry = self.emcore.dir_read(handle) | 
|  | 1075 | +                        if entry.name == "." or entry.name == "..": continue | 
|  | 1076 | +                        elif entry.attributes & 0x10: | 
|  | 1077 | +                            self.gettree(remotepath + "/" + entry.name, localpath + "/" + entry.name, buffsize, buffer) | 
|  | 1078 | +                        else: self.get(remotepath + "/" + entry.name, localpath + "/" + entry.name, buffsize, buffer) | 
|  | 1079 | +                    except: break | 
|  | 1080 | +            finally: | 
|  | 1081 | +                if malloc == True: | 
|  | 1082 | +                    self.emcore.free(buffer) | 
|  | 1083 | +        finally: | 
| 1072 | 1084 | self.emcore.dir_close(handle) | 
| 1073 |  | -        finally:
 | 
| 1074 |  | -            if malloc == True:
 | 
| 1075 |  | -                self.emcore.free(buffer)
 | 
| 1076 | 1085 |  | 
| 1077 | 1086 | @command | 
| 1078 | 1087 | def put(self, localname, remotename, buffsize = 0x10000, buffer = None): | 
| — | — | @@ -1083,31 +1092,35 @@ | 
| 1084 | 1093 | [buffer]: buffer address (optional) | 
| 1085 | 1094 | """ | 
| 1086 | 1095 | buffsize = self._hexint(buffsize) | 
| 1087 |  | -        if buffer is None:
 | 
| 1088 |  | -            buffer = self.emcore.malloc(buffsize)
 | 
| 1089 |  | -            malloc = True
 | 
| 1090 |  | -        else:
 | 
| 1091 |  | -            buffer = self._hexint(buffer)
 | 
| 1092 |  | -            malloc = False
 | 
| 1093 | 1096 | try: | 
|  | 1097 | +            f = open(localname, 'rb') | 
|  | 1098 | +        except IOError: | 
|  | 1099 | +            raise ArgumentError("Could not open local file for reading.") | 
|  | 1100 | +        try: | 
|  | 1101 | +            if buffer is None: | 
|  | 1102 | +                buffer = self.emcore.malloc(buffsize) | 
|  | 1103 | +                malloc = True | 
|  | 1104 | +            else: | 
|  | 1105 | +                buffer = self._hexint(buffer) | 
|  | 1106 | +                malloc = False | 
| 1094 | 1107 | try: | 
| 1095 |  | -                f = open(localname, 'rb')
 | 
| 1096 |  | -            except IOError:
 | 
| 1097 |  | -                raise ArgumentError("Could not open local file for reading.")
 | 
| 1098 |  | -            self.logger.info("Uploading file " + localname + " to " + remotename + "...\n")
 | 
| 1099 |  | -            fd = self.emcore.file_open(remotename, 0x15)
 | 
| 1100 |  | -            while True:
 | 
| 1101 |  | -                data = f.read(buffsize)
 | 
| 1102 |  | -                if len(data) == 0: break
 | 
| 1103 |  | -                self.emcore.write(buffer, data)
 | 
| 1104 |  | -                bytes = 0
 | 
| 1105 |  | -                while bytes < len(data):
 | 
| 1106 |  | -                    bytes = bytes + self.emcore.file_write(fd, len(data) - bytes, buffer + bytes)
 | 
| 1107 |  | -            self.emcore.file_close(fd)
 | 
|  | 1108 | +                self.logger.info("Uploading file " + localname + " to " + remotename + "...") | 
|  | 1109 | +                fd = self.emcore.file_open(remotename, 0x15) | 
|  | 1110 | +                try: | 
|  | 1111 | +                    while True: | 
|  | 1112 | +                        data = f.read(buffsize) | 
|  | 1113 | +                        if len(data) == 0: break | 
|  | 1114 | +                        self.emcore.write(buffer, data) | 
|  | 1115 | +                        bytes = 0 | 
|  | 1116 | +                        while bytes < len(data): | 
|  | 1117 | +                            bytes = bytes + self.emcore.file_write(fd, len(data) - bytes, buffer + bytes) | 
|  | 1118 | +                finally: | 
|  | 1119 | +                    self.emcore.file_close(fd) | 
|  | 1120 | +            finally: | 
|  | 1121 | +                if malloc == True: | 
|  | 1122 | +                    self.emcore.free(buffer) | 
|  | 1123 | +        finally: | 
| 1108 | 1124 | f.close() | 
| 1109 |  | -        finally:
 | 
| 1110 |  | -            if malloc == True:
 | 
| 1111 |  | -                self.emcore.free(buffer)
 | 
| 1112 | 1125 | self.logger.info(" done\n") | 
| 1113 | 1126 |  | 
| 1114 | 1127 | @command | 
| — | — | @@ -1137,7 +1150,7 @@ | 
| 1138 | 1151 | try: self.mkdir(prefix + dir) | 
| 1139 | 1152 | except: self.logger.info(" failed\n") | 
| 1140 | 1153 | for f in d[2]: | 
| 1141 |  | -                    if not prefix.find("/.svn/") > -1:
 | 
|  | 1154 | +                    if prefix.find("/.svn/") == -1: | 
| 1142 | 1155 | self.put(d[0] + "/" + f, prefix + f, buffsize, buffer) | 
| 1143 | 1156 | finally: | 
| 1144 | 1157 | if malloc == True: | 
| Index: emcore/trunk/tools/libemcore.py | 
| — | — | @@ -222,6 +222,7 @@ | 
| 223 | 223 | din_maxsize = self.lib.dev.packetsizelimit.din | 
| 224 | 224 | data = "" | 
| 225 | 225 | (headsize, bodysize, tailsize) = self._alignsplit(addr, size, cin_maxsize, 16) | 
|  | 226 | +        self.logger.debug("Downloading %d bytes from 0x%x, split as (%d/%d/%d)\n" % (size, addr, headsize, bodysize, tailsize)) | 
| 226 | 227 | if headsize != 0: | 
| 227 | 228 | data += self._readmem(addr, headsize) | 
| 228 | 229 | addr += headsize | 
| — | — | @@ -247,6 +248,7 @@ | 
| 248 | 249 | cout_maxsize = self.lib.dev.packetsizelimit.cout - self.lib.headersize | 
| 249 | 250 | dout_maxsize = self.lib.dev.packetsizelimit.dout | 
| 250 | 251 | (headsize, bodysize, tailsize) = self._alignsplit(addr, len(data), cout_maxsize, 16) | 
|  | 252 | +        self.logger.debug("Uploading %d bytes to 0x%x, split as (%d/%d/%d)\n" % (len(data), addr, headsize, bodysize, tailsize)) | 
| 251 | 253 | offset = 0 | 
| 252 | 254 | if headsize != 0: | 
| 253 | 255 | self._writemem(addr, data[offset:offset+headsize]) | 
| — | — | @@ -272,7 +274,6 @@ | 
| 273 | 275 | Returns the address where 'data' is stored | 
| 274 | 276 | """ | 
| 275 | 277 | addr = self.malloc(len(data)) | 
| 276 |  | -        self.logger.debug("Uploading %d bytes to 0x%x\n" % (len(data), addr))
 | 
| 277 | 278 | self.write(addr, data) | 
| 278 | 279 | return addr | 
| 279 | 280 |  | 
| — | — | @@ -618,37 +619,25 @@ | 
| 619 | 620 | return result | 
| 620 | 621 |  | 
| 621 | 622 | @command(timeout = 50000) | 
| 622 |  | -    def storage_read_sectors_md(self, volume, sector, count, size = 0x100000, addr = None):
 | 
| 623 |  | -        """ Read sectors from as storage device. If addr is not given it allocates a buffer itself. """
 | 
| 624 |  | -        if addr is None:
 | 
| 625 |  | -            addr = self.malloc(size)
 | 
| 626 |  | -            malloc = True
 | 
| 627 |  | -        else:
 | 
| 628 |  | -            malloc = False
 | 
| 629 |  | -        try:
 | 
| 630 |  | -            result = self.lib.monitorcommand(struct.pack("IIQIIII", 28, volume, sector, count, addr, 0, 0), "III", ("rc", None, None))
 | 
| 631 |  | -        finally:
 | 
| 632 |  | -            if malloc == True:
 | 
| 633 |  | -                self.free(addr)
 | 
|  | 623 | +    def storage_read_sectors_md(self, volume, sector, count, addr): | 
|  | 624 | +        """ Read sectors from as storage device """ | 
|  | 625 | +        result = self.lib.monitorcommand(struct.pack("IIQIIII", 28, volume, sector, count, addr, 0, 0), "III", ("rc", None, None)) | 
| 634 | 626 | if result.rc > 0x80000000: | 
| 635 | 627 | raise DeviceError("storage_read_sectors_md(volume=%d, sector=%d, count=%d, addr=0x%08X) failed with RC 0x%08X" % (volume, sector, count, addr, rc)) | 
| 636 |  | -    
 | 
| 637 |  | -    def storage_write_sectors_md(self, volume, sector, count, size = 0x100000, addr = None):
 | 
| 638 |  | -        """ Read sectors from as storage device. If addr is not given it allocates a buffer itself. """
 | 
| 639 |  | -        if addr is None:
 | 
| 640 |  | -            addr = self.malloc(size)
 | 
| 641 |  | -            malloc = True
 | 
| 642 |  | -        else:
 | 
| 643 |  | -            malloc = False
 | 
| 644 |  | -        try:
 | 
| 645 |  | -            result = self.lib.monitorcommand(struct.pack("IIQIIII", 29, volume, sector, count, addr, 0, 0), "III", ("rc", None, None))
 | 
| 646 |  | -        finally:
 | 
| 647 |  | -            if malloc == True:
 | 
| 648 |  | -                self.free(addr)
 | 
|  | 628 | + | 
|  | 629 | +    @command(timeout = 50000) | 
|  | 630 | +    def storage_write_sectors_md(self, volume, sector, count, addr): | 
|  | 631 | +        """ Read sectors from as storage device """ | 
|  | 632 | +        result = self.lib.monitorcommand(struct.pack("IIQIIII", 29, volume, sector, count, addr, 0, 0), "III", ("rc", None, None)) | 
| 649 | 633 | if result.rc > 0x80000000: | 
| 650 |  | -            raise DeviceError("storage_read_sectors_md(volume=%d, sector=%d, count=%d, addr=0x%08X) failed with RC 0x%08X" % (volume, sector, count, addr, rc))
 | 
|  | 634 | +            raise DeviceError("storage_write_sectors_md(volume=%d, sector=%d, count=%d, addr=0x%08X) failed with RC 0x%08X" % (volume, sector, count, addr, rc)) | 
| 651 | 635 |  | 
| 652 | 636 | @command(timeout = 30000) | 
|  | 637 | +    def fat_enable_flushing(self, state): | 
|  | 638 | +        """ Enables/disables flushing the FAT cache after every transaction """ | 
|  | 639 | +        self.lib.monitorcommand(struct.pack("IIII", 58, state, 0, 0), "III", (None, None, None)) | 
|  | 640 | + | 
|  | 641 | +    @command(timeout = 30000) | 
| 653 | 642 | def file_open(self, filename, mode): | 
| 654 | 643 | """ Opens a file and returns the handle """ | 
| 655 | 644 | result = self.lib.monitorcommand(struct.pack("IIII%dsB" % len(filename), 30, mode, 0, 0, filename, 0), "III", ("fd", None, None)) | 
| — | — | @@ -665,7 +654,7 @@ | 
| 666 | 655 | return result.size | 
| 667 | 656 |  | 
| 668 | 657 | @command(timeout = 30000) | 
| 669 |  | -    def file_read(self, fd, size = 0x100000, addr = None):
 | 
|  | 658 | +    def file_read(self, fd, size = 0x10000, addr = None): | 
| 670 | 659 | """ Reads data from a file referenced by a handle. If addr is not given it allocates a buffer itself. """ | 
| 671 | 660 | if addr is None: | 
| 672 | 661 | addr = self.malloc(size) | 
| — | — | @@ -674,26 +663,18 @@ | 
| 675 | 664 | malloc = False | 
| 676 | 665 | try: | 
| 677 | 666 | result = self.lib.monitorcommand(struct.pack("IIII", 32, fd, addr, size), "III", ("rc", None, None)) | 
| 678 |  | -        finally:
 | 
|  | 667 | +            if result.rc > 0x80000000: | 
|  | 668 | +                raise DeviceError("file_read(fd=%d, addr=0x%08X, size=0x%08X) failed with RC=0x%08X, errno=%d" % (fd, addr, size, result.rc, self.errno())) | 
|  | 669 | +        except: | 
| 679 | 670 | if malloc == True: | 
| 680 | 671 | self.free(addr) | 
| 681 |  | -        if result.rc > 0x80000000:
 | 
| 682 |  | -            raise DeviceError("file_read(fd=%d, addr=0x%08X, size=0x%08X) failed with RC=0x%08X, errno=%d" % (fd, addr, size, result.rc, self.errno()))
 | 
| 683 |  | -        return result.rc
 | 
|  | 672 | +            raise | 
|  | 673 | +        return Bunch(rc = result.rc, addr = addr) | 
| 684 | 674 |  | 
| 685 | 675 | @command(timeout = 30000) | 
| 686 |  | -    def file_write(self, fd, size = 0x100000, addr = None):
 | 
| 687 |  | -        """ Writes data from a file referenced by a handle. If addr is not given it allocates a buffer itself. """
 | 
| 688 |  | -        if addr is None:
 | 
| 689 |  | -            addr = self.malloc(size)
 | 
| 690 |  | -            malloc = True
 | 
| 691 |  | -        else:
 | 
| 692 |  | -            malloc = False
 | 
| 693 |  | -        try:
 | 
| 694 |  | -            result = self.lib.monitorcommand(struct.pack("IIII", 33, fd, addr, size), "III", ("rc", None, None))
 | 
| 695 |  | -        finally:
 | 
| 696 |  | -            if malloc == True:
 | 
| 697 |  | -                self.free(addr)
 | 
|  | 676 | +    def file_write(self, fd, size, addr): | 
|  | 677 | +        """ Writes data from a file referenced by a handle. """ | 
|  | 678 | +        result = self.lib.monitorcommand(struct.pack("IIII", 33, fd, addr, size), "III", ("rc", None, None)) | 
| 698 | 679 | if result.rc > 0x80000000: | 
| 699 | 680 | raise DeviceError("file_write(fd=%d, addr=0x%08X, size=0x%08X) failed with RC=0x%08X, errno=%d" % (fd, addr, size, result.rc, self.errno())) | 
| 700 | 681 | return result.rc | 
| Index: emcore/trunk/export/syscallwrappers.h | 
| — | — | @@ -197,6 +197,7 @@ | 
| 198 | 198 | #define get_library_ext __emcore_syscall->get_library_ext | 
| 199 | 199 | #define release_library __emcore_syscall->release_library | 
| 200 | 200 | #define release_library_ext __emcore_syscall->release_library_ext | 
|  | 201 | +#define fat_enable_flushing __emcore_syscall->fat_enable_flushing | 
| 201 | 202 |  | 
| 202 | 203 |  | 
| 203 | 204 | #endif | 
| Index: emcore/trunk/export/syscallapi.h | 
| — | — | @@ -33,6 +33,7 @@ | 
| 34 | 34 | #include "../disk.h" | 
| 35 | 35 | #include "../dir.h" | 
| 36 | 36 | #include "../file.h" | 
|  | 37 | +#include "../fat.h" | 
| 37 | 38 | #include "../format.h" | 
| 38 | 39 | #include "../drawing.h" | 
| 39 | 40 | #include "../lcdconsole.h" | 
| — | — | @@ -243,6 +244,7 @@ | 
| 244 | 245 | typeof(get_library_ext) *get_library_ext; | 
| 245 | 246 | typeof(release_library) *release_library; | 
| 246 | 247 | typeof(release_library_ext) *release_library_ext; | 
|  | 248 | +    typeof(fat_enable_flushing) *fat_enable_flushing; | 
| 247 | 249 | }; | 
| 248 | 250 |  | 
| 249 | 251 |  | 
| Index: emcore/trunk/syscallapi.c | 
| — | — | @@ -208,5 +208,8 @@ | 
| 209 | 209 | .get_library = get_library, | 
| 210 | 210 | .get_library_ext = get_library_ext, | 
| 211 | 211 | .release_library = release_library, | 
| 212 |  | -    .release_library_ext = release_library_ext
 | 
|  | 212 | +    .release_library_ext = release_library_ext, | 
|  | 213 | +#ifdef HAVE_STORAGE | 
|  | 214 | +    .fat_enable_flushing = fat_enable_flushing | 
|  | 215 | +#endif | 
| 213 | 216 | }; | 
| Index: emcore/trunk/usb/usb.c | 
| — | — | @@ -628,6 +628,7 @@ | 
| 629 | 629 | case 50:  // DISK_MOUNT | 
| 630 | 630 | case 51:  // DISK_UNMOUNT | 
| 631 | 631 | #endif | 
|  | 632 | +        case 58:  // FAT_ENABLE_FLUSHING | 
| 632 | 633 | if (!set_dbgaction(DBGACTION_STORAGE, 0)) | 
| 633 | 634 | memcpy(dbgasyncsendbuf, dbgrecvbuf, sizeof(dbgasyncsendbuf)); | 
| 634 | 635 | break; | 
| — | — | @@ -945,6 +946,11 @@ | 
| 946 | 947 | usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16); | 
| 947 | 948 | break; | 
| 948 | 949 | #endif | 
|  | 950 | +                case 58:  // FAT_ENABLE_FLUSHING | 
|  | 951 | +                    dbgasyncsendbuf[0] = 1; | 
|  | 952 | +                    fat_enable_flushing((bool)(dbgasyncsendbuf[1])); | 
|  | 953 | +                    usb_drv_send_nonblocking(dbgendpoints[1], dbgasyncsendbuf, 16); | 
|  | 954 | +                    break; | 
| 949 | 955 | } | 
| 950 | 956 | break; | 
| 951 | 957 | #endif | 
| Index: emcore/trunk/fat.c | 
| — | — | @@ -179,6 +179,7 @@ | 
| 180 | 180 |  | 
| 181 | 181 | static struct bpb fat_bpbs[NUM_VOLUMES]; /* mounted partition info */ | 
| 182 | 182 | static bool initialized = false; | 
|  | 183 | +static bool flush_fat_disabled = false; | 
| 183 | 184 |  | 
| 184 | 185 | static int update_fsinfo(IF_MV_NONVOID(struct bpb* fat_bpb)); | 
| 185 | 186 | static int flush_fat(IF_MV_NONVOID(struct bpb* fat_bpb)); | 
| — | — | @@ -1024,6 +1025,11 @@ | 
| 1025 | 1026 | int i; | 
| 1026 | 1027 | int rc; | 
| 1027 | 1028 | unsigned char *sec; | 
|  | 1029 | +    if (flush_fat_disabled) | 
|  | 1030 | +    { | 
|  | 1031 | +        DEBUGF("flush_fat() skipped"); | 
|  | 1032 | +        return 0; | 
|  | 1033 | +    } | 
| 1028 | 1034 | DEBUGF("flush_fat()"); | 
| 1029 | 1035 |  | 
| 1030 | 1036 | mutex_lock(&cache_mutex, TIMEOUT_BLOCK); | 
| — | — | @@ -2559,3 +2565,9 @@ | 
| 2560 | 2566 | return (volume<NUM_VOLUMES && fat_bpbs[volume].mounted); | 
| 2561 | 2567 | } | 
| 2562 | 2568 | #endif | 
|  | 2569 | + | 
|  | 2570 | +void fat_enable_flushing(bool state) | 
|  | 2571 | +{ | 
|  | 2572 | +    flush_fat_disabled = !state; | 
|  | 2573 | +    if (state) flush_fat(); | 
|  | 2574 | +} | 
| Index: emcore/trunk/fat.h | 
| — | — | @@ -132,6 +132,7 @@ | 
| 133 | 133 | extern bool fat_ismounted(int volume); | 
| 134 | 134 | extern void* fat_get_sector_buffer(void); | 
| 135 | 135 | extern void fat_release_sector_buffer(void); | 
|  | 136 | +extern void fat_enable_flushing(bool state); | 
| 136 | 137 |  | 
| 137 | 138 | #endif | 
| 138 | 139 | #endif |