method to write the config over USB at the proper alignment
This commit is contained in:
parent
2d024c5b34
commit
5bcb3dba3f
|
@ -6,8 +6,9 @@ import logging
|
|||
from google.protobuf.message import Message
|
||||
|
||||
from gp2040ce_bintools import core_parser
|
||||
from gp2040ce_bintools.storage import (STORAGE_BINARY_LOCATION, STORAGE_SIZE, pad_config_to_storage_size,
|
||||
serialize_config_with_footer)
|
||||
from gp2040ce_bintools.pico import write
|
||||
from gp2040ce_bintools.storage import (STORAGE_BINARY_LOCATION, STORAGE_MEMORY_ADDRESS, STORAGE_SIZE,
|
||||
pad_config_to_storage_size, serialize_config_with_footer)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -113,6 +114,22 @@ def write_new_config_to_filename(config: Message, filename: str, inject: bool =
|
|||
file.write(binary)
|
||||
|
||||
|
||||
def write_new_config_to_usb(config: Message, endpoint_out: object, endpoint_in: object):
|
||||
"""Serialize the provided config to a device over USB, in the proper location for a GP2040-CE board.
|
||||
|
||||
Args:
|
||||
config: the Protobuf configuration to write to a Pico board in BOOTSEL mode
|
||||
endpoint_out: the USB endpoint to write to
|
||||
endpoint_in: the USB endpoint to read from
|
||||
"""
|
||||
serialized = serialize_config_with_footer(config)
|
||||
# we don't write the whole area, just the minimum from the end of the storage section
|
||||
# nevertheless, the USB device needs writes to start at 256 byte boundaries
|
||||
padding = 256 - (len(serialized) % 256)
|
||||
binary = bytearray(b'\x00' * padding) + serialized
|
||||
write(endpoint_out, endpoint_in, STORAGE_MEMORY_ADDRESS + (STORAGE_SIZE - len(binary)), binary)
|
||||
|
||||
|
||||
############
|
||||
# COMMANDS #
|
||||
############
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
"""Tests for the image builder module."""
|
||||
import os
|
||||
import sys
|
||||
import unittest.mock as mock
|
||||
|
||||
import pytest
|
||||
from decorator import decorator
|
||||
|
||||
from gp2040ce_bintools import get_config_pb2
|
||||
from gp2040ce_bintools.builder import (FirmwareLengthError, combine_firmware_and_config, pad_firmware_up_to_storage,
|
||||
replace_config_in_binary, write_new_config_to_filename)
|
||||
from gp2040ce_bintools.storage import get_config, get_config_footer, get_storage_section
|
||||
replace_config_in_binary, write_new_config_to_filename, write_new_config_to_usb)
|
||||
from gp2040ce_bintools.storage import get_config, get_config_footer, get_storage_section, serialize_config_with_footer
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
@ -134,3 +135,18 @@ def test_write_new_config_to_config_bin(firmware_binary, tmp_path):
|
|||
config_size, _, _ = get_config_footer(config_dump)
|
||||
assert config.boardVersion == 'v0.7.2-COOL'
|
||||
assert len(config_dump) == config_size + 12
|
||||
|
||||
|
||||
@with_pb2s
|
||||
def test_write_new_config_to_usb(config_binary):
|
||||
"""Test that the config can be written to USB at the proper alignment."""
|
||||
config = get_config(config_binary)
|
||||
serialized = serialize_config_with_footer(config)
|
||||
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
||||
with mock.patch('gp2040ce_bintools.builder.write') as mock_write:
|
||||
write_new_config_to_usb(config, end_out, end_in)
|
||||
|
||||
# check that it got padded
|
||||
padded_serialized = bytearray(b'\x00' * 4) + serialized
|
||||
assert mock_write.call_args.args[2] % 256 == 0
|
||||
assert mock_write.call_args.args[3] == padded_serialized
|
||||
|
|
Loading…
Reference in New Issue