Read from chip XDATA via vendor control IN (bRequest=0xE4). wValue=addr, wLength=size.
(self, base_addr:int, length:int, **kwargs)
| 276 | # === XDATA read/write (0xE4/0xE5 vendor control transfers) === |
| 277 | |
| 278 | def read(self, base_addr:int, length:int, **kwargs) -> bytes: |
| 279 | """Read from chip XDATA via vendor control IN (bRequest=0xE4). wValue=addr, wLength=size.""" |
| 280 | result = b'' |
| 281 | for off in range(0, length, 0xFF): |
| 282 | chunk = min(0xFF, length - off) |
| 283 | ret = libusb.libusb_control_transfer(self.usb.handle, 0xC0, 0xE4, base_addr + off, 0, self._f0_out_buf, chunk, 1000) |
| 284 | assert ret == chunk, f"read(0x{base_addr + off:04X}, {chunk}) failed: {ret}" |
| 285 | result += bytes(self._f0_out_buf[:ret]) |
| 286 | return result[:length] |
| 287 | |
| 288 | def write(self, base_addr:int, data:bytes, **kwargs): |
| 289 | """Write to chip XDATA via vendor control OUT (bRequest=0xE5). wValue=addr, wIndex=val.""" |