update the reserved storage size and board config location for 32 KB

this change is in GP2040-CE main and bumping it up is necessary for the
concatenate invocation to put the board config at the right location

Signed-off-by: Brian S. Stephan <bss@incorporeal.org>
This commit is contained in:
Brian S. Stephan 2025-02-10 18:23:39 -06:00
parent 697c30406d
commit 3d4d826566
Signed by: bss
GPG Key ID: 3DE06D3180895FCB
8 changed files with 23 additions and 22 deletions

View File

@ -232,11 +232,11 @@ The latest update of the configuration snapshot is from **v0.7.8**.
### Dumping the GP2040-CE board with picotool ### Dumping the GP2040-CE board with picotool
Some of these tools require a dump of your GP2040-CE board, either the storage section or the whole board, depending on Some of these tools require a dump of your GP2040-CE board, either the storage section or the whole board, depending on
the context. The storage section of a GP2040-CE board is a reserved 16 KB starting at `0x101FC000`. To dump your board's the context. The user config storage section of a GP2040-CE board is a reserved 32 KB starting at `0x101F8000`. To dump
storage with picotool: your board's storage with picotool:
``` ```
% picotool save -r 101FC000 10200000 memory.bin % picotool save -r 101F8000 10200000 memory.bin
``` ```
And to dump your whole board: And to dump your whole board:

View File

@ -17,10 +17,11 @@ from gp2040ce_bintools.rp2040 import get_bootsel_endpoints, read
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
BOARD_CONFIG_BINARY_LOCATION = 0x1F8000 STORAGE_SIZE = 32768
BOARD_CONFIG_BINARY_LOCATION = (2 * 1024 * 1024) - (STORAGE_SIZE * 2) # 0x1F0000
BOARD_CONFIG_BOOTSEL_ADDRESS = 0x10000000 + BOARD_CONFIG_BINARY_LOCATION BOARD_CONFIG_BOOTSEL_ADDRESS = 0x10000000 + BOARD_CONFIG_BINARY_LOCATION
STORAGE_SIZE = 16384 USER_CONFIG_BINARY_LOCATION = (2 * 1024 * 1024) - STORAGE_SIZE # 0x1F8000
USER_CONFIG_BINARY_LOCATION = 0x1FC000
USER_CONFIG_BOOTSEL_ADDRESS = 0x10000000 + USER_CONFIG_BINARY_LOCATION USER_CONFIG_BOOTSEL_ADDRESS = 0x10000000 + USER_CONFIG_BINARY_LOCATION
FOOTER_SIZE = 12 FOOTER_SIZE = 12
@ -425,7 +426,7 @@ def visualize():
group.add_argument('--usb', action='store_true', help="retrieve the config from a RP2040 board connected over USB " group.add_argument('--usb', action='store_true', help="retrieve the config from a RP2040 board connected over USB "
"and in BOOTSEL mode") "and in BOOTSEL mode")
group.add_argument('--filename', help=".bin file of a GP2040-CE board's storage section, bytes " group.add_argument('--filename', help=".bin file of a GP2040-CE board's storage section, bytes "
"101FC000-10200000, or of a GP2040-CE's whole board dump " "101F8000-10200000, or of a GP2040-CE's whole board dump "
"if --whole-board is specified") "if --whole-board is specified")
args, _ = parser.parse_known_args() args, _ = parser.parse_known_args()

View File

@ -42,7 +42,7 @@ def firmware_binary():
@pytest.fixture @pytest.fixture
def storage_dump(): def storage_dump():
"""Read in a test storage dump file (101FC000-10200000) of a GP2040-CE board.""" """Read in a test storage dump file (101F8000-10200000) of a GP2040-CE board."""
filename = os.path.join(HERE, 'test-files', 'test-storage-area.bin') filename = os.path.join(HERE, 'test-files', 'test-storage-area.bin')
with open(filename, 'rb') as file: with open(filename, 'rb') as file:
content = file.read() content = file.read()

View File

@ -57,7 +57,7 @@ def test_concatenate_board_config_to_file(tmp_path):
combined_filename=tmp_file) combined_filename=tmp_file)
with open(tmp_file, 'rb') as file: with open(tmp_file, 'rb') as file:
content = file.read() content = file.read()
assert len(content) == (2 * 1024 * 1024) - (16 * 1024) assert len(content) == (2 * 1024 * 1024) - (32 * 1024)
def test_concatenate_both_configs_to_file(tmp_path): def test_concatenate_both_configs_to_file(tmp_path):
@ -180,19 +180,19 @@ def test_dont_always_find_version_string(firmware_binary):
def test_padding_firmware(firmware_binary): def test_padding_firmware(firmware_binary):
"""Test that firmware is padded to the expected size.""" """Test that firmware is padded to the expected size."""
padded = builder.pad_binary_up_to_user_config(firmware_binary) padded = builder.pad_binary_up_to_user_config(firmware_binary)
assert len(padded) == 2080768 assert len(padded) == 2064384
def test_padding_firmware_can_truncate(): def test_padding_firmware_can_truncate():
"""Test that firmware is padded to the expected size.""" """Test that firmware is padded to the expected size."""
padded = builder.pad_binary_up_to_user_config(bytearray(b'\x00' * 4 * 1024 * 1024), or_truncate=True) padded = builder.pad_binary_up_to_user_config(bytearray(b'\x00' * 4 * 1024 * 1024), or_truncate=True)
assert len(padded) == 2080768 assert len(padded) == 2064384
def test_padding_firmware_to_board(firmware_binary): def test_padding_firmware_to_board(firmware_binary):
"""Test that firmware is padded to the expected size.""" """Test that firmware is padded to the expected size."""
padded = builder.pad_binary_up_to_board_config(firmware_binary) padded = builder.pad_binary_up_to_board_config(firmware_binary)
assert len(padded) == 2080768 - (16 * 1024) assert len(padded) == 2064384 - (32 * 1024)
def test_firmware_plus_storage_section(firmware_binary, storage_dump): def test_firmware_plus_storage_section(firmware_binary, storage_dump):
@ -226,7 +226,7 @@ def test_chunky_firmware_plus_user_config_binary(config_binary):
def test_firmware_plus_board_config_binary(firmware_binary, config_binary): def test_firmware_plus_board_config_binary(firmware_binary, config_binary):
"""Test that combining firmware and board config produces a valid combined binary.""" """Test that combining firmware and board config produces a valid combined binary."""
almost_whole_board = builder.combine_firmware_and_config(firmware_binary, config_binary, None) almost_whole_board = builder.combine_firmware_and_config(firmware_binary, config_binary, None)
assert len(almost_whole_board) == (2 * 1024 * 1024) - (16 * 1024) assert len(almost_whole_board) == (2 * 1024 * 1024) - (32 * 1024)
# if this is valid, we should be able to find the storage and footer again # if this is valid, we should be able to find the storage and footer again
storage = get_board_storage_section(almost_whole_board) storage = get_board_storage_section(almost_whole_board)
footer_size, _, _ = get_config_footer(storage) footer_size, _, _ = get_config_footer(storage)

View File

@ -51,7 +51,7 @@ def test_concatenate_invocation(tmpdir):
with open(out_filename, 'rb') as out_file, open('tests/test-files/test-storage-area.bin', 'rb') as storage_file: with open(out_filename, 'rb') as out_file, open('tests/test-files/test-storage-area.bin', 'rb') as storage_file:
out = out_file.read() out = out_file.read()
storage = storage_file.read() storage = storage_file.read()
assert out[2080768:2097152] == storage assert out[2064384:2097152] == storage
def test_concatenate_invocation_json(tmpdir): def test_concatenate_invocation_json(tmpdir):
@ -88,7 +88,7 @@ def test_debug_storage_dump_invocation():
'--filename', 'tests/test-files/test-storage-area.bin'], '--filename', 'tests/test-files/test-storage-area.bin'],
capture_output=True, encoding='utf8') capture_output=True, encoding='utf8')
assert 'boardVersion: "v0.7.5"' in result.stdout assert 'boardVersion: "v0.7.5"' in result.stdout
assert 'length of content to look for footer in: 16384' in result.stderr assert 'length of content to look for footer in: 32768' in result.stderr
def test_storage_dump_json_invocation(): def test_storage_dump_json_invocation():

View File

@ -97,7 +97,7 @@ def test_get_board_config_from_file_whole_board_dump():
"""Test that we can open a storage dump file and find its config.""" """Test that we can open a storage dump file and find its config."""
filename = os.path.join(HERE, 'test-files', 'test-whole-board-with-board-config.bin') filename = os.path.join(HERE, 'test-files', 'test-whole-board-with-board-config.bin')
config = storage.get_config_from_file(filename, whole_board=True, board_config=True) config = storage.get_config_from_file(filename, whole_board=True, board_config=True)
assert config.boardVersion == 'v0.7.6-15-g71f4512' assert config.boardVersion == 'v0.7.8'
assert config.addonOptions.bootselButtonOptions.enabled is False assert config.addonOptions.bootselButtonOptions.enabled is False
@ -167,7 +167,7 @@ def test_convert_binary_to_uf2_with_offsets(whole_board_with_board_config_dump):
assert len(uf2) == 4194304 # binary is 8192 256 byte chunks, UF2 is 512 b per chunk assert len(uf2) == 4194304 # binary is 8192 256 byte chunks, UF2 is 512 b per chunk
assert uf2[0:4] == b'\x55\x46\x32\x0a' == b'UF2\n' # proper magic assert uf2[0:4] == b'\x55\x46\x32\x0a' == b'UF2\n' # proper magic
assert uf2[8:12] == bytearray(b'\x00\x20\x00\x00') # family ID set assert uf2[8:12] == bytearray(b'\x00\x20\x00\x00') # family ID set
assert uf2[524:528] == bytearray(b'\x00\xc1\x1f\x10') # address to write the second chunk assert uf2[524:528] == bytearray(b'\x00\x81\x1f\x10') # address to write the second chunk
def test_convert_binary_to_uf2_to_binary(whole_board_with_board_config_dump): def test_convert_binary_to_uf2_to_binary(whole_board_with_board_config_dump):
@ -215,7 +215,7 @@ def test_read_created_uf2(tmp_path, firmware_binary, config_binary):
binary = storage.convert_uf2_to_binary(content) binary = storage.convert_uf2_to_binary(content)
# the converted binary should be aligned properly and of the right size # the converted binary should be aligned properly and of the right size
assert len(binary) == 2 * 1024 * 1024 assert len(binary) == 2 * 1024 * 1024
assert binary[-16384-4:-16384] == storage.FOOTER_MAGIC assert binary[-32768-4:-32768] == storage.FOOTER_MAGIC
assert binary[-4:] == storage.FOOTER_MAGIC assert binary[-4:] == storage.FOOTER_MAGIC
user_storage = storage.get_user_storage_section(binary) user_storage = storage.get_user_storage_section(binary)
footer_size, _, _ = storage.get_config_footer(user_storage) footer_size, _, _ = storage.get_config_footer(user_storage)
@ -257,13 +257,13 @@ def test_serialize_modified_config_with_footer(storage_dump):
def test_pad_config_to_storage(config_binary): def test_pad_config_to_storage(config_binary):
"""Test that we can properly pad a config section to the correct storage section size.""" """Test that we can properly pad a config section to the correct storage section size."""
storage_section = storage.pad_config_to_storage_size(config_binary) storage_section = storage.pad_config_to_storage_size(config_binary)
assert len(storage_section) == 16384 assert len(storage_section) == 32768
def test_pad_config_to_storage_raises(config_binary): def test_pad_config_to_storage_raises(config_binary):
"""Test that we raise an exception if the config is bigger than the storage section.""" """Test that we raise an exception if the config is bigger than the storage section."""
with pytest.raises(storage.ConfigLengthError): with pytest.raises(storage.ConfigLengthError):
_ = storage.pad_config_to_storage_size(config_binary * 5) _ = storage.pad_config_to_storage_size(config_binary * 10)
@with_pb2s @with_pb2s
@ -280,7 +280,7 @@ def test_get_board_config_from_usb(config_binary):
config, _, _ = storage.get_board_config_from_usb() config, _, _ = storage.get_board_config_from_usb()
mock_get.assert_called_once() mock_get.assert_called_once()
mock_read.assert_called_with(mock_out, mock_in, 0x101F8000, 16384) mock_read.assert_called_with(mock_out, mock_in, 0x101F0000, 32768)
assert config == storage.get_config(config_binary) assert config == storage.get_config(config_binary)
@ -298,7 +298,7 @@ def test_get_user_config_from_usb(config_binary):
config, _, _ = storage.get_user_config_from_usb() config, _, _ = storage.get_user_config_from_usb()
mock_get.assert_called_once() mock_get.assert_called_once()
mock_read.assert_called_with(mock_out, mock_in, 0x101FC000, 16384) mock_read.assert_called_with(mock_out, mock_in, 0x101F8000, 32768)
assert config == storage.get_config(config_binary) assert config == storage.get_config(config_binary)