mirror of
https://github.com/lesserkuma/FlashGBX.git
synced 2026-09-09 01:15:21 -05:00
3.1
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
59
FlashGBX/config/fc_AGB_M36W0R603.txt
Normal file
59
FlashGBX/config/fc_AGB_M36W0R603.txt
Normal file
@@ -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 ]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> 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 <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> 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 <a href=\"https://www.gbxcart.com/\">https://www.gbxcart.com/</a> 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:
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
12
README.md
12
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:<br>`pip3 install -U FlashGBX`
|
||||
* If you see an error about a conflict involving PySide2, try these commands instead:<br>`pip3 install pyserial Pillow setuptools requests python-dateutil`<br>`pip3 install --no-deps -U FlashGBX`<br>`pip3 install -U PySide2 --ignore-requires-python`
|
||||
* If you see an error about a conflict involving PySide2, try these commands instead:<br>`pip3 install pyserial Pillow setuptools requests python-dateutil`<br>`pip3 install --no-deps -U FlashGBX`<br>`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)
|
||||
|
||||
4
setup.py
4
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'],
|
||||
|
||||
Reference in New Issue
Block a user