docs: def check_command(self, op_description, op=None, data=b'', chk=0, timeout=DEFAULT_TIMEOUT):
          """
          Execute a command with 'command', check the result code and throw an appropriate
          FatalError if it fails.
  
          Returns the "result" of a successful command.
          """
          val, data = self.command(op, data, chk, timeout=timeout)
  
          # things are a bit weird here, bear with us
  
          # the status bytes are the last 2/4 bytes in the data (depending on chip)
          if len(data) < self.STATUS_BYTES_LENGTH:
              raise FatalError("Failed to %s. Only got %d byte status response." % (op_description, len(data)))
          status_bytes = data[-self.STATUS_BYTES_LENGTH:]
          # we only care if the first one is non-zero. If it is, the second byte is a reason.
          if byte(status_bytes, 0) != 0:
              raise FatalError.WithResult('Failed to %s' % op_description, status_bytes)
  
          # if we had more data than just the status bytes, return it as the result
          # (this is used by the md5sum command, maybe other commands?)
          if len(data) > self.STATUS_BYTES_LENGTH:
              return data[:-self.STATUS_BYTES_LENGTH]
          else:  # otherwise, just return the 'val' field which comes from the reply header (this is used by read_reg)
              return val