예제 #1
0
//******************************************************************************
/// \brief  Write packet to MXT chip
/// \return Number of databytes sent
static int hidraw_write_packet(struct mxt_device *mxt, struct hid_packet *write_pkt, uint8_t *byte_count)
{
  int ret;
  uint8_t pkt_size = write_pkt->rx_bytes + 4; /* allowing for header */

  if ((ret = write(mxt->conn->hidraw.fd, write_pkt, pkt_size)) != pkt_size) {
    mxt_verb(mxt->ctx, "HIDRAW retry");
    usleep(HIDRAW_WRITE_RETRY_DELAY_US);
    if ((ret = write(mxt->conn->hidraw.fd, &write_pkt, pkt_size)) != pkt_size) {
      mxt_err(mxt->ctx, "Error %s (%d) writing to hidraw",
              strerror(errno), errno);
      ret = mxt_errno_to_rc(errno);
    }
  }

  mxt_log_buffer(mxt->ctx, LOG_VERBOSE, "PKT TX:",
                 (const unsigned char *) write_pkt, pkt_size);

  *byte_count = ret - 6;

  mxt_dbg(mxt->ctx, "Sending packet: size: %d No. data bytes TX: %d",
          pkt_size, *byte_count);

  return MXT_SUCCESS;
}
//******************************************************************************
/// \brief  Read packet from MXT chip
/// \return #mxt_rc
static int hidraw_read_response(struct mxt_device *mxt, struct hid_packet *read_pkt,
                                size_t count)
{
  ssize_t ret = 0;
  size_t t_count = 0;
  int timeout = 0;

  do {
    ret = read(mxt->conn->hidraw.fd, read_pkt + t_count, count);
    if ((size_t)ret != count) {
      mxt_dbg(mxt->ctx, "Error %s (%d) reading from hidraw",
              strerror(errno), errno);
      ret = mxt_errno_to_rc(errno);
    } else {
      t_count += (size_t)ret;
    }
    usleep(HIDRAW_READ_RETRY_DELAY_US);
  } while (timeout++ <= HIDRAW_TIMEOUT_DELAY_US && t_count != count);

  mxt_dbg(mxt->ctx, "No. bytes requested: %zu, No. of bytes read: %zu",
          count, t_count);
  mxt_log_buffer(mxt->ctx, LOG_VERBOSE, "RD PKT RX:",
                 (const unsigned char *) read_pkt, count);
  return MXT_SUCCESS;
}
예제 #3
0
//******************************************************************************
/// \brief  Get T5 message as byte array
/// \param  mxt  Maxtouch Device
/// \param  buf  Pointer to buffer
/// \param  buflen  Length of buffer
/// \param  count length of message in bytes
/// \return #mxt_rc
int mxt_get_msg_bytes(struct mxt_device *mxt, unsigned char *buf,
                      size_t buflen, int *count)
{
  int ret;

  switch (mxt->conn->type) {
  case E_SYSFS:
    if (sysfs_has_debug_v2(mxt))
      ret = sysfs_get_msg_bytes_v2(mxt, buf, buflen, count);
    else
      ret = dmesg_get_msg_bytes(mxt, buf, buflen, count);
    break;

#ifdef HAVE_LIBUSB
  case E_USB:
#endif /* HAVE_LIBUSB */
  case E_I2C_DEV:
  case E_HIDRAW:
    ret = t44_get_msg_bytes(mxt, buf, buflen, count);
    break;

  default:
    mxt_err(mxt->ctx, "Device type not supported");
    ret = MXT_ERROR_NOT_SUPPORTED;
    break;
  }

  if (ret == MXT_SUCCESS)
    mxt_log_buffer(mxt->ctx, LOG_DEBUG, MSG_PREFIX, buf, *count);

  return ret;
}
예제 #4
0
//******************************************************************************
/// \brief  Read registers from MXT chip, in blocks
/// \return #mxt_rc
int mxt_read_register(struct mxt_device *mxt, uint8_t *buf,
                      int start_register, size_t count)
{
  int ret;
  size_t received;
  size_t off = 0;

  mxt_verb(mxt->ctx, "%s start_register:%d count:%zu", __func__,
           start_register, count);

  while (off < count) {
    ret = mxt_read_register_block(mxt, buf + off, start_register + off,
                                  count - off, &received);
    if (ret)
      return ret;

    off += received;
  }

  mxt_log_buffer(mxt->ctx, LOG_VERBOSE, "RX:", buf, count);

  return MXT_SUCCESS;
}
예제 #5
0
//******************************************************************************
/// \brief  Write register to MXT chip
/// \return #mxt_rc
int mxt_write_register(struct mxt_device *mxt, uint8_t const *buf,
                       int start_register, size_t count)
{
  int ret;

  mxt_verb(mxt->ctx, "%s start_register:%d count:%zu", __func__,
           start_register, count);

  switch (mxt->conn->type) {
  case E_SYSFS:
    ret = sysfs_write_register(mxt, buf, start_register, count);
    break;

  case E_I2C_DEV:
    ret = i2c_dev_write_register(mxt, buf, start_register, count);
    break;

#ifdef HAVE_LIBUSB
  case E_USB:
    ret = usb_write_register(mxt, buf, start_register, count);
    break;
#endif /* HAVE_LIBUSB */

  case E_HIDRAW:
    ret = hidraw_write_register(mxt, buf, start_register, count);
    break;

  default:
    mxt_err(mxt->ctx, "Device type not supported");
    ret = MXT_ERROR_NOT_SUPPORTED;
  }

  if (ret == MXT_SUCCESS)
    mxt_log_buffer(mxt->ctx, LOG_VERBOSE, "TX:", buf, count);

  return ret;
}