attempt to address USB corruption by padding more
This commit is contained in:
parent
a7b8309b33
commit
6a147aa1d8
@ -152,11 +152,14 @@ def write_new_config_to_usb(config: Message, endpoint_out: object, endpoint_in:
|
|||||||
# we don't write the whole area, just the minimum from the end of the storage section
|
# 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
|
# nevertheless, the USB device needs writes to start at 256 byte boundaries
|
||||||
logger.debug("serialized: %s", serialized)
|
logger.debug("serialized: %s", serialized)
|
||||||
padding = 256 - (len(serialized) % 256)
|
# not sure why this minimal padding isn't working but it leads to corruption
|
||||||
|
# maybe claims that erase need to be on 4096 byte sectors?
|
||||||
|
# padding = 256 - (len(serialized) % 256)
|
||||||
|
padding = 4096 - (len(serialized) % 4096)
|
||||||
logger.debug("length: %s with %s bytes of padding", len(serialized), padding)
|
logger.debug("length: %s with %s bytes of padding", len(serialized), padding)
|
||||||
binary = bytearray(b'\x00' * padding) + serialized
|
binary = bytearray(b'\x00' * padding) + serialized
|
||||||
logger.debug("binary for writing: %s", binary)
|
logger.debug("binary for writing: %s", binary)
|
||||||
write(endpoint_out, endpoint_in, STORAGE_MEMORY_ADDRESS + (STORAGE_SIZE - len(binary)), binary)
|
write(endpoint_out, endpoint_in, STORAGE_MEMORY_ADDRESS + (STORAGE_SIZE - len(binary)), bytes(binary))
|
||||||
|
|
||||||
|
|
||||||
############
|
############
|
||||||
|
@ -198,8 +198,10 @@ def write(out_end: usb.core.Endpoint, in_end: usb.core.Endpoint, location: int,
|
|||||||
location: memory address of where to start reading from
|
location: memory address of where to start reading from
|
||||||
content: the data to write
|
content: the data to write
|
||||||
"""
|
"""
|
||||||
if (location % 256) != 0:
|
# not sure why 256 alignment isn't working but it leads to corruption
|
||||||
raise PicoAlignmentError("writes must start at 256 byte boundaries, please pad or align as appropriate!")
|
# maybe claims that erase need to be on 4096 byte sectors?
|
||||||
|
if (location % 4096) != 0:
|
||||||
|
raise PicoAlignmentError("writes must start at 4096 byte boundaries, please pad or align as appropriate!")
|
||||||
|
|
||||||
# set up the data
|
# set up the data
|
||||||
command_size = 8
|
command_size = 8
|
||||||
@ -209,13 +211,14 @@ def write(out_end: usb.core.Endpoint, in_end: usb.core.Endpoint, location: int,
|
|||||||
erase(out_end, in_end, location, len(content))
|
erase(out_end, in_end, location, len(content))
|
||||||
exit_xip(out_end, in_end)
|
exit_xip(out_end, in_end)
|
||||||
pico_token = 1
|
pico_token = 1
|
||||||
logger.debug("writing %s bytes to %s", len(content), location)
|
logger.debug("writing %s bytes to %s", len(content), hex(location))
|
||||||
payload = struct.pack(PICOBOOT_CMD_STRUCT + PICOBOOT_CMD_READ_SUFFIX_STRUCT,
|
payload = struct.pack(PICOBOOT_CMD_STRUCT + PICOBOOT_CMD_READ_SUFFIX_STRUCT,
|
||||||
PICO_MAGIC, pico_token, PICO_COMMANDS['WRITE'], command_size, len(content),
|
PICO_MAGIC, pico_token, PICO_COMMANDS['WRITE'], command_size, len(content),
|
||||||
location, len(content))
|
location, len(content))
|
||||||
logger.debug("WRITE: %s", payload)
|
logger.debug("WRITE: %s", payload)
|
||||||
out_end.write(payload)
|
out_end.write(payload)
|
||||||
logger.debug("actually writing bytes now...")
|
logger.debug("actually writing bytes now...")
|
||||||
|
logger.debug("payload: %s", content)
|
||||||
out_end.write(content)
|
out_end.write(content)
|
||||||
res = in_end.read(256)
|
res = in_end.read(256)
|
||||||
logger.debug("res: %s", res)
|
logger.debug("res: %s", res)
|
||||||
|
@ -163,8 +163,9 @@ def test_write_new_config_to_usb(config_binary):
|
|||||||
write_new_config_to_usb(config, end_out, end_in)
|
write_new_config_to_usb(config, end_out, end_in)
|
||||||
|
|
||||||
# check that it got padded
|
# check that it got padded
|
||||||
padded_serialized = bytearray(b'\x00' * 4) + serialized
|
assert len(serialized) == 2044
|
||||||
assert mock_write.call_args.args[2] % 256 == 0
|
padded_serialized = bytearray(b'\x00' * 2052) + serialized
|
||||||
|
assert mock_write.call_args.args[2] % 4096 == 0
|
||||||
assert mock_write.call_args.args[3] == padded_serialized
|
assert mock_write.call_args.args[3] == padded_serialized
|
||||||
|
|
||||||
|
|
||||||
|
@ -205,14 +205,19 @@ def test_misaligned_write():
|
|||||||
with pytest.raises(pico.PicoAlignmentError):
|
with pytest.raises(pico.PicoAlignmentError):
|
||||||
_ = pico.write(end_out, end_in, 0x101FE0FF, b'\x00\x01\x02\x03')
|
_ = pico.write(end_out, end_in, 0x101FE0FF, b'\x00\x01\x02\x03')
|
||||||
|
|
||||||
_ = pico.write(end_out, end_in, 0x101FE100, b'\x00\x01\x02\x03')
|
# 256 byte alignment is what is desired, but see comments around there for
|
||||||
|
# why only 4096 seems to work right...
|
||||||
|
with pytest.raises(pico.PicoAlignmentError):
|
||||||
|
_ = pico.write(end_out, end_in, 0x101FE100, b'\x00\x01\x02\x03')
|
||||||
|
|
||||||
|
_ = pico.write(end_out, end_in, 0x101FF000, b'\x00\x01\x02\x03')
|
||||||
|
|
||||||
expected_writes = [
|
expected_writes = [
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x3, 8, 0, 0x101FE100, 4)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x3, 8, 0, 0x101FF000, 4)),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x5, 8, 4, 0x101FE100, 4)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x5, 8, 4, 0x101FF000, 4)),
|
||||||
mock.call(b'\x00\x01\x02\x03'),
|
mock.call(b'\x00\x01\x02\x03'),
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
||||||
]
|
]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user