diff --git a/CHANGES.md b/CHANGES.md index 29524f2..6a9b903 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,13 @@ # Release notes +### v3.1 (released 2021-12-01) +- Added support for the GBxCart RW Mini v1.0d hardware revision +- Added support for insideGadgets 4 MB (2× 2 MB), 32 KB FRAM, MBC5 flash cartridges *(thanks AlexiG)* +- Bundles GBxCart RW v1.4 firmware version R33+L4 (fixes an issue with accessing save data of some FRAM cartridge modifications) +- Added support for SD007_TSOP_48BALL with AM29LV160DT *(thanks crizzlycruz)* +- Confirmed support for SD007_TSOP_48BALL_V10 with 29LV320CTXEI *(thanks marv17)* +- Added support for AA1030_TSOP88BALL with M36W0R603 *(thanks LucentW)* +- Added support for Ferrante Crafts cart with SST39SF010A *(thanks skite2001)* + ### v3.0 (released 2021-11-15) - Added support for the GBxCart RW v1.4a hardware revision - Bundles GBxCart RW v1.4 firmware version R32+L3 (improves ROM writing speed for Development AGB Cartridge 256M Flash S, E201868) diff --git a/FlashGBX/FlashGBX_GUI.py b/FlashGBX/FlashGBX_GUI.py index 483c298..0d5c908 100644 --- a/FlashGBX/FlashGBX_GUI.py +++ b/FlashGBX/FlashGBX_GUI.py @@ -645,11 +645,10 @@ class FlashGBX_GUI(QtWidgets.QWidget): self.btnConfig.setEnabled(True) self.btnCancel.setEnabled(False) - if self.CONN.CanPowerCycleCart(): - self.mnuConfig.actions()[6].setEnabled(True) - else: - self.mnuConfig.actions()[6].setEnabled(False) - self.mnuConfig.actions()[6].setChecked(False) + # Firmware Update Menu + self.mnuTools.actions()[2].setEnabled(True) + if self.CONN.SupportsFirmwareUpdates() is False: + self.mnuTools.actions()[2].setEnabled(False) self.SetProgressBars(min=0, max=1, value=0) @@ -1727,7 +1726,7 @@ class FlashGBX_GUI(QtWidgets.QWidget): # Save Type msg_save_type_s = "" - if not canSkipMessage and save_type is not False: + if not canSkipMessage and save_type is not False and save_type is not None: if save_chip is not None: temp = "{:s} ({:s})".format(Util.AGB_Header_Save_Types[save_type], save_chip) else: @@ -2030,7 +2029,11 @@ class FlashGBX_GUI(QtWidgets.QWidget): except: return False else: - FirmwareUpdater = self.CONN.GetFirmwareUpdaterClass()[1] + if not self.CONN.SupportsFirmwareUpdates(): + QtWidgets.QMessageBox.information(self, "{:s} {:s}".format(APPNAME, VERSION), "{:s} currently does not support updaing the firmware of your device.".format(APPNAME), QtWidgets.QMessageBox.Ok) + return False + else: + FirmwareUpdater = self.CONN.GetFirmwareUpdaterClass()[1] self.FWUPWIN = None self.FWUPWIN = FirmwareUpdater(self, app_path=self.APP_PATH, icon=self.windowIcon(), device=self.CONN) self.FWUPWIN.setAttribute(QtCore.Qt.WA_DeleteOnClose, True) diff --git a/FlashGBX/Util.py b/FlashGBX/Util.py index 457c585..0045610 100644 --- a/FlashGBX/Util.py +++ b/FlashGBX/Util.py @@ -7,7 +7,7 @@ from enum import Enum # Common constants APPNAME = "FlashGBX" -VERSION_PEP440 = "3.0" +VERSION_PEP440 = "3.1" VERSION = "v{:s}".format(VERSION_PEP440) DEBUG = False diff --git a/FlashGBX/config/fc_AGB_M36W0R603.txt b/FlashGBX/config/fc_AGB_M36W0R603.txt new file mode 100644 index 0000000..b93b445 --- /dev/null +++ b/FlashGBX/config/fc_AGB_M36W0R603.txt @@ -0,0 +1,59 @@ +{ + "type":"AGB", + "names":[ + "AA1030_TSOP88BALL with M36W0R603" + ], + "flash_ids":[ + [ 0x20, 0x00, 0x10, 0x88 ] + ], + "voltage":3.3, + "flash_size":0x800000, + "sector_size_from_cfi":true, + "reset_every":0x100000, + "command_set":"INTEL", + "commands":{ + "reset":[ + [ 0, 0x50 ], + [ 0, 0xFF ] + ], + "read_identifier":[ + [ 0, 0x90 ] + ], + "sector_erase":[ + [ "SA", 0x60 ], + [ "SA", 0xD0 ], + [ "SA", 0x20 ], + [ "SA", 0xD0 ] + ], + "sector_erase_wait_for":[ + [ null, null, null ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ] + ], + "buffer_write":[ + [ "SA", 0xE8 ], + [ "SA", "BS" ], + [ "PA", "PD" ], + [ "SA", 0xD0 ], + [ "SA", 0xFF ] + ], + "buffer_write_wait_for":[ + [ "SA", 0x80, 0xFFFF ], + [ null, null, null ], + [ null, null, null ], + [ "SA", 0x80, 0xFFFF ], + [ null, null, null ] + ], + "single_write":[ + [ 0, 0x70 ], + [ 0, 0x10 ], + [ "PA", "PD" ] + ], + "single_write_wait_for":[ + [ 0, 0x80, 0x80 ], + [ null, null, null ], + [ null, null, null ] + ] + } +} diff --git a/FlashGBX/config/fc_DMG_AM29LV160MB.txt b/FlashGBX/config/fc_DMG_AM29LV160MB.txt index 3699be0..0477f98 100644 --- a/FlashGBX/config/fc_DMG_AM29LV160MB.txt +++ b/FlashGBX/config/fc_DMG_AM29LV160MB.txt @@ -6,7 +6,8 @@ "SD007_TSOP_48BALL with AM29LV160DB", "2006_TSOP_64BALL_QFP48 with AL016J55FFAR2", "SD007_TSOP_64BALL_SOP28 with unlabeled flash chip", - "SD007_TSOP_29LV017D with L017D70VC" + "SD007_TSOP_29LV017D with L017D70VC", + "SD007_TSOP_48BALL with AM29LV160DT" ], "flash_ids":[ [ 0x02, 0x02, 0x4A, 0x4A ], @@ -14,7 +15,8 @@ [ 0x02, 0x02, 0x4A, 0x4A ], [ 0x02, 0x02, 0x4A, 0x4A ], [ 0x02, 0x02, 0x4A, 0x4A ], - [ 0x02, 0xC8, 0x00, 0x00 ] + [ 0x02, 0xC8, 0x00, 0x00 ], + [ 0x02, 0x02, 0xC4, 0xC4 ] ], "voltage":3.3, "flash_size":0x200000, diff --git a/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt b/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt index cdff2c4..e3695ac 100644 --- a/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt +++ b/FlashGBX/config/fc_DMG_AT49F040_AUDIO.txt @@ -2,11 +2,13 @@ "type":"DMG", "names":[ "DIY cart with AT49F040 @ AUDIO", - "GB-CART32K-A with SST39SF020A" + "GB-CART32K-A with SST39SF020A", + "Ferrante Crafts cart with SST39SF010A" ], "flash_ids":[ [ 0x1F, 0x13, 0xFE, 0xFF ], - [ 0xBF, 0xB6, 0x01, 0xFF ] + [ 0xBF, 0xB6, 0x01, 0xFF ], + [ 0xBF, 0xB5, 0x01, 0xFF ] ], "voltage":5, "flash_size":0x8000, diff --git a/FlashGBX/config/fc_DMG_MX29LV320BTC.txt b/FlashGBX/config/fc_DMG_MX29LV320BTC.txt index 96ddfa8..b8f61d0 100644 --- a/FlashGBX/config/fc_DMG_MX29LV320BTC.txt +++ b/FlashGBX/config/fc_DMG_MX29LV320BTC.txt @@ -2,10 +2,12 @@ "type":"DMG", "names":[ "SD007_BV5_V2 with MX29LV320BTC", - "SD007_TSOP_48BALL_V8 with 29LV320CTTC" + "SD007_TSOP_48BALL_V8 with 29LV320CTTC", + "SD007_TSOP_48BALL_V10 with 29LV320CTXEI" ], "flash_ids":[ [ 0xC1, 0xC1, 0xA8, 0xA8 ], + [ 0xC1, 0xC1, 0xA7, 0xA7 ], [ 0xC1, 0xC1, 0xA7, 0xA7 ] ], "voltage":3.3, diff --git a/FlashGBX/hw_GBxCartRW.py b/FlashGBX/hw_GBxCartRW.py index 90516a0..b3ba4f2 100644 --- a/FlashGBX/hw_GBxCartRW.py +++ b/FlashGBX/hw_GBxCartRW.py @@ -15,7 +15,7 @@ from . import Util class GbxDevice: DEVICE_NAME = "GBxCart RW" DEVICE_MIN_FW = 1 - DEVICE_MAX_FW = 3 + DEVICE_MAX_FW = 4 DEVICE_CMD = { "NULL":0x30, @@ -80,7 +80,7 @@ class GbxDevice: "DMG_WRITE_CS_PULSE":[8, 0x09], } - PCB_VERSIONS = {4:'v1.3', 5:'v1.4', 6:'v1.4a'} + PCB_VERSIONS = {4:'v1.3', 5:'v1.4', 6:'v1.4a', 101:'Mini v1.0d'} ACTIONS = {"ROM_READ":1, "SAVE_READ":2, "SAVE_WRITE":3, "ROM_WRITE":4, "ROM_WRITE_VERIFY":4} SUPPORTED_CARTS = {} @@ -135,7 +135,7 @@ class GbxDevice: self.DEVICE = None self.BAUDRATE = 1000000 return False - elif max_baud >= 1700000 and self.FW["pcb_ver"] in (5, 6) and self.BAUDRATE < 1700000: + elif max_baud >= 1700000 and self.FW["pcb_ver"] in (5, 6, 101) and self.BAUDRATE < 1700000: # Switch to higher baud rate self._write(self.DEVICE_CMD["OFW_USART_1_7M_SPEED"]) self.BAUDRATE = 1700000 @@ -166,7 +166,7 @@ class GbxDevice: elif self.FW["fw_ver"] > self.DEVICE_MAX_FW: conn_msg.append([0, "NOTE: The GBxCart RW device on port " + ports[i] + " is running a firmware version that is newer than what this version of FlashGBX was developed to work with, so errors may occur."]) - if (self.FW["pcb_ver"] not in (4, 5, 6)): # only the v1.3 and v1.4/v1.4a pcb revisions are supported + if (self.FW["pcb_ver"] not in (4, 5, 6, 101)): # only the v1.3, v1.4, v1.4a, Mini v1.1 PCB revisions are supported dev.close() self.DEVICE = None return False @@ -238,7 +238,10 @@ class GbxDevice: return self.FW["pcb_ver"] in (5, 6) def GetSupprtedModes(self): - return ["DMG", "AGB"] + if self.FW["pcb_ver"] == 101: + return ["DMG"] + else: + return ["DMG", "AGB"] def IsSupportedMbc(self, mbc): return mbc in ( 0x00, 0x01, 0x02, 0x03, 0x06, 0x0B, 0x0D, 0x10, 0x13, 0x19, 0x1A, 0x1B, 0x1C, 0x1E, 0x20, 0x22, 0xFC, 0xFD, 0xFE, 0xFF, 0x101, 0x103, 0x104, 0x105 ) @@ -247,7 +250,7 @@ class GbxDevice: return True def IsClkConnected(self): - return self.FW["pcb_ver"] in (5, 6) + return self.FW["pcb_ver"] in (5, 6, 101) def UpdateFlashCarts(self, flashcarts): self.SUPPORTED_CARTS = { @@ -275,7 +278,7 @@ class GbxDevice: def Close(self): if self.IsConnected(): try: - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): self._write(self.DEVICE_CMD["OFW_CART_MODE"]) self._read(1) self._write(self.DEVICE_CMD["OFW_CART_PWR_OFF"]) @@ -289,7 +292,7 @@ class GbxDevice: return "GBxCart RW" def GetFirmwareVersion(self, more=False): - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): s = "R{:d}+{:s}{:d}".format(self.FW["ofw_ver"], self.FW["cfw_id"], self.FW["fw_ver"]) else: s = "{:s}{:d}".format(self.FW["cfw_id"], self.FW["fw_ver"]) @@ -467,7 +470,7 @@ class GbxDevice: print("Error!") def _clk_toggle(self, num): - if self.FW["pcb_ver"] not in (5, 6): return False + if self.FW["pcb_ver"] not in (5, 6, 101): return False for _ in range(0, num): self._write(self.DEVICE_CMD["CLK_HIGH"]) self._write(self.DEVICE_CMD["CLK_LOW"]) @@ -526,7 +529,7 @@ class GbxDevice: self.POS = 0 self.SIGNAL = None - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): self._write(self.DEVICE_CMD["OFW_CART_MODE"]) # Reset LEDs self._read(1) self.CartPowerOn() @@ -537,7 +540,7 @@ class GbxDevice: self._set_fw_variable("DMG_READ_CS_PULSE", 0) self._set_fw_variable("DMG_WRITE_CS_PULSE", 0) elif self.MODE == "AGB": - if self.FW["pcb_ver"] in (5, 6) and self.FW["fw_ver"] > 1: + if self.FW["pcb_ver"] in (5, 6, 101) and self.FW["fw_ver"] > 1: self._write(self.DEVICE_CMD["AGB_BOOTUP_SEQUENCE"], wait=True) header = self.ReadROM(0, 0x180) @@ -548,7 +551,7 @@ class GbxDevice: with open("debug_header.bin", "wb") as f: f.write(header) # Unlock DACS carts on older firmware - if self.MODE == "AGB" and (self.FW["pcb_ver"] not in (5, 6) or self.FW["fw_ver"] == 1): + if self.MODE == "AGB" and (self.FW["pcb_ver"] not in (5, 6, 101) or self.FW["fw_ver"] == 1): if header[0x04:0x04+0x9C] == bytearray([0x00] * 0x9C): self.ReadROM(0x1FFFFE0, 20) header = self.ReadROM(0, 0x180) @@ -573,7 +576,7 @@ class GbxDevice: elif self.MODE == "AGB": data = RomFileAGB(header).GetHeader() - if data["logo_correct"] is False: # try to fix weird bootlegs + if data["logo_correct"] is False: # workaround for weird bootlegs self._cart_write(0, 0xFF) time.sleep(0.1) header = self.ReadROM(0, 0x180) @@ -1018,7 +1021,7 @@ class GbxDevice: def WriteROM(self, address, buffer, flash_buffer_size=False, skip_init=False, rumble_stop=False): length = len(buffer) - if self.FW["pcb_ver"] not in (5, 6): + if self.FW["pcb_ver"] not in (5, 6, 101): max_length = 256 else: max_length = 1024 @@ -1268,7 +1271,7 @@ class GbxDevice: return (flash_types, flash_type_id, flash_id, cfi_s, cfi) def CheckFlashChip(self, limitVoltage=False, cart_type=None): # aka. the most horribly written function - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): self._write(self.DEVICE_CMD["OFW_CART_MODE"]) self._read(1) self.CartPowerOn() @@ -1916,7 +1919,7 @@ class GbxDevice: if self.MODE == "DMG" and _mbc.GetName() == "MBC7": self.WriteEEPROM_MBC7(address=pos, buffer=buffer[buffer_offset:buffer_offset+buffer_len]) elif self.MODE == "DMG" and _mbc.GetName() == "MBC6" and bank > 7: # MBC6 flash save memory - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): self.WriteROM(address=pos, buffer=buffer[buffer_offset:buffer_offset+buffer_len]) self._cart_write(pos + buffer_len - 1, 0xF0) else: @@ -2074,12 +2077,12 @@ class GbxDevice: elif cart_type["type"] == "DMG" and "write_pin" in cart_type and cart_type["write_pin"] == "WR+RESET": self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is currently not supported by FlashGBX. Please try the official GBxCart RW interface software available from https://www.gbxcart.com/ instead.", "abortable":False}) return False - elif (self.FW["pcb_ver"] not in (5, 6) or self.FW["fw_ver"] < 2) and ("pulse_reset_after_write" in cart_type and cart_type["pulse_reset_after_write"] is True): - self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is only supported by FlashGBX using GBxCart RW v1.4 and firmware version R31+L2 or higher. You can also try the official GBxCart RW firmware and interface software available from https://www.gbxcart.com/ instead.", "abortable":False}) + elif (self.FW["pcb_ver"] not in (5, 6, 101) or self.FW["fw_ver"] < 2) and ("pulse_reset_after_write" in cart_type and cart_type["pulse_reset_after_write"] is True): + self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is not supported by FlashGBX using your GBxCart RW hardware revision and/or firmware version. You can also try the official GBxCart RW firmware and interface software available from https://www.gbxcart.com/ instead.", "abortable":False}) return False # Firmware check L1 # Firmware check L2 - elif (self.FW["pcb_ver"] not in (5, 6) or self.FW["fw_ver"] < 3) and ("command_set" in cart_type and cart_type["command_set"] == "SHARP") and ("buffer_write" in cart_type["commands"]): + elif (self.FW["pcb_ver"] not in (5, 6, 101) or self.FW["fw_ver"] < 3) and ("command_set" in cart_type and cart_type["command_set"] == "SHARP") and ("buffer_write" in cart_type["commands"]): if self.FW["pcb_ver"] in (5, 6): print("NOTE: Update your GBxCart RW firmware to version L3 or higher for a better transfer rate with this cartridge.") del(cart_type["commands"]["buffer_write"]) @@ -2178,7 +2181,7 @@ class GbxDevice: self.SetProgress({"action":"ABORT", "info_type":"msgbox_critical", "info_msg":"This cartridge type is currently not supported for ROM flashing.", "abortable":False}) return False - if command_set_type == "GBMEMORY" and self.FW["pcb_ver"] not in (5, 6): + if command_set_type == "GBMEMORY" and self.FW["pcb_ver"] not in (5, 6, 101): self._set_fw_variable("FLASH_WE_PIN", 0x01) dprint("Using GB Memory mode on GBxCart RW v1.3") else: @@ -2195,7 +2198,7 @@ class GbxDevice: [ "SA", 0xFF ] ] dprint("Using Flash2Advance mode with a buffer of {:d} bytes".format(flash_buffer_size)) - elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6): + elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6, 101): self._write(0x03) # FLASH_METHOD_DMG_MMSA dprint("Using GB Memory mode on GBxCart RW v1.4") elif flashcart.SupportsBufferWrite() and flash_buffer_size > 0: @@ -2355,7 +2358,7 @@ class GbxDevice: if command_set_type == "GBMEMORY" and self.FW["pcb_ver"] < 5: status = self.WriteROM_GBMEMORY(address=pos, buffer=data_import[buffer_pos:buffer_pos+buffer_len], bank=bank) - elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6): + elif command_set_type == "GBMEMORY" and self.FW["pcb_ver"] in (5, 6, 101): status = self.WriteROM(address=pos, buffer=data_import[buffer_pos:buffer_pos+buffer_len], flash_buffer_size=flash_buffer_size, skip_init=(skip_init and not self.SKIPPING)) self._cart_write(pos + buffer_len - 1, 0xF0) else: @@ -2440,7 +2443,7 @@ class GbxDevice: def TransferData(self, args, signal): self.ERROR = False if self.IsConnected(): - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): self._write(self.DEVICE_CMD["OFW_CART_MODE"]) self._read(1) self.CartPowerOn() @@ -2452,7 +2455,7 @@ class GbxDevice: elif args['mode'] == 3: ret = self._BackupRestoreRAM(args) elif args['mode'] == 4: ret = self._FlashROM(args) - if self.FW["pcb_ver"] in (5, 6): + if self.FW["pcb_ver"] in (5, 6, 101): if ret is True: self._write(self.DEVICE_CMD["OFW_DONE_LED_ON"]) elif self.ERROR is True: diff --git a/FlashGBX/hw_GBxCartRW_ofw.py b/FlashGBX/hw_GBxCartRW_ofw.py index 67a087d..3994390 100644 --- a/FlashGBX/hw_GBxCartRW_ofw.py +++ b/FlashGBX/hw_GBxCartRW_ofw.py @@ -117,7 +117,7 @@ class GbxDevice: "CART_PWR_OFF":'.', "QUERY_CART_PWR":']' } - PCB_VERSIONS = {1:'v1.0', 2:'v1.1', 4:'v1.3', 90:'XMAS', 100:'Mini'} + PCB_VERSIONS = {1:'v1.0', 2:'v1.1', 4:'v1.3', 90:'XMAS', 100:'Mini v1.0', 101:'Mini v1.0d'} SUPPORTED_CARTS = {} FW = [] diff --git a/FlashGBX/res/config.zip b/FlashGBX/res/config.zip index 0544ab7..1c66a7d 100644 Binary files a/FlashGBX/res/config.zip and b/FlashGBX/res/config.zip differ diff --git a/FlashGBX/res/fw_GBxCart_RW_v1_4.zip b/FlashGBX/res/fw_GBxCart_RW_v1_4.zip index bcfc50c..30840ab 100644 Binary files a/FlashGBX/res/fw_GBxCart_RW_v1_4.zip and b/FlashGBX/res/fw_GBxCart_RW_v1_4.zip differ diff --git a/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip b/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip index 41eb8b9..45a2a91 100644 Binary files a/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip and b/FlashGBX/res/fw_GBxCart_RW_v1_4a.zip differ diff --git a/README.md b/README.md index 75a7f19..1dd1df6 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https:// ### Confirmed working reader/writer hardware and firmware versions -- [insideGadgets GBxCart RW Mini, v1.3 and v1.4 (Standard and Pro versions)](https://www.gbxcart.com/) - - Official firmware versions R30 to R32 (other hardware revisions and firmware versions may also work, but are untested) - - Lesserkuma’s high compatibility firmware versions L1 to L3 +- [insideGadgets GBxCart RW v1.3, v1.4 and Mini](https://www.gbxcart.com/) + - Official firmware versions R30 to R33 (other hardware revisions and firmware versions may also work, but are untested) + - Lesserkuma’s high compatibility firmware versions L1 to L4 ### Currently supported official cartridge memory mappers @@ -58,6 +58,7 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https:// - DIY cart with AT49F040 - DIY cart with MBC1 and AM29F080 - DIY cart with MBC3 and MX29LV640 + - Ferrante Crafts cart with SST39SF010A - GB-CART32K-A with SST39SF020A - GB Smart 32M - insideGadgets 32 KB @@ -122,6 +123,7 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https:// - SD007_TSOP_48BALL with L160DB12VI - SD007_TSOP_48BALL_V9 with 29LV160CBTC-70G - SD007_TSOP_48BALL_V10 with 29DL32TF-70 + - SD007_TSOP_48BALL_V10 with 29LV320CTXEI - SD007_TSOP_48BALL_V10 with GL032M10BFIR3 - SD007_TSOP_48BALL_V10 with M29W320DT - SD007_TSOP_64BALL_SOP28 with EN29LV160AB-70TCP @@ -145,6 +147,7 @@ for [Windows](https://github.com/lesserkuma/FlashGBX/releases), [Linux](https:// - 4050_4400_4000_4350_36L0R_V5 with M36L0R8060T - 4400 with 4400L0ZDQ0 - 4455_4400_4000_4350_36L0R_V3 with M36L0R7050T + - AA1030_TSOP88BALL with M36W0R603 - AGB-E05-01 with GL128S - AGB-E05-01 with MSP55LV128M - AGB-E05-01 with MX29GL128FHT2I-90G @@ -186,7 +189,7 @@ Available in the GitHub [Releases](https://github.com/lesserkuma/FlashGBX/releas 1. Download and install [Python](https://www.python.org/downloads/) (version 3.7 or higher) 2. Open a Terminal or Command Prompt window 3. Install or upgrade FlashGBX with this command:
`pip3 install -U FlashGBX` -* If you see an error about a conflict involving PySide2, try these commands instead:
`pip3 install pyserial Pillow setuptools requests python-dateutil`
`pip3 install --no-deps -U FlashGBX`
`pip3 install -U PySide2 --ignore-requires-python` +* If you see an error about a conflict involving PySide2, try these commands instead:
`pip3 install pyserial Pillow setuptools requests python-dateutil`
`pip3 install --no-deps -U FlashGBX`
`pip3 install --ignore-requires-python -U PySide2` * Pre-made Linux packages and instructions for select distributions are available [here](https://github.com/JJ-Fox/FlashGBX-Linux-builds/releases/latest). @@ -234,6 +237,7 @@ The author would like to thank the following very kind people for their help and - antPL (flash chip info) - bbsan (flash chip info) - ClassicOldSong (bug reports) +- crizzlycruz (flash chip info) - djedditt (testing) - dyf2007 (flash chip info) - easthighNerd (feature suggestions) diff --git a/setup.py b/setup.py index 084f2ec..cad169e 100644 --- a/setup.py +++ b/setup.py @@ -4,9 +4,9 @@ with open("README.md", "r", encoding="utf-8") as fh: long_description = fh.read( setuptools.setup( name="FlashGBX", - version="3.0", + version="3.1", author="Lesserkuma", - description="Reads and writes Game Boy and Game Boy Advance cartridge data. Currently supports the GBxCart RW hardware device by insideGadgets.", + description="Reads and writes Game Boy and Game Boy Advance cartridge data. Supported hardware: GBxCart RW v1.3 and v1.4 by insideGadgets.", url="https://github.com/lesserkuma/FlashGBX", packages=setuptools.find_packages(), install_requires=['PySide2', 'pyserial', 'Pillow', 'setuptools', 'requests', 'python-dateutil'],