//****************************************************************************** /// \brief Get messages from device and display to user, with Ctrl-C signal /// \param timeout_seconds Represent the time in seconds to continuously /// display messages to the user. By setting timeout_seconds to 0, or /// MSG_NO_WAIT the T5 object is read only once. By setting timeout_seconds to /// -1, or MSG_CONTINUOUS the T5 object is continually read until the user /// presses Ctrl-C. /// \param mxt Maxtouch Device /// \param context Additional context required by msg_func /// \param msg_func Pointer to function to read object status /// \return #mxt_rc int mxt_read_messages_sigint(struct mxt_device *mxt, int timeout_seconds, void *context, int (*msg_func)(struct mxt_device *mxt, uint8_t *msg, void *context, uint8_t size), int *flag) { int ret; struct sigaction sa; mxt_init_sigint_handler(mxt, sa); ret = mxt_read_messages(mxt, timeout_seconds, context, (msg_func), (int *)&mxt_sigint_rx); mxt_release_sigint_handler(mxt, sa); return ret; }
//****************************************************************************** /// \brief Calibrate maxtouch chip /// \return 0 = success, negative = fail int mxt_calibrate_chip(struct mxt_device *mxt) { int ret; uint16_t t6_addr; unsigned char write_value = CALIBRATE_COMMAND; /* Obtain command processor's address */ t6_addr = mxt_get_object_address(mxt, GEN_COMMANDPROCESSOR_T6, 0); if (t6_addr == OBJECT_NOT_FOUND) return MXT_ERROR_OBJECT_NOT_FOUND; mxt_flush_msgs(mxt); /* Write to command processor register to perform command */ ret = mxt_write_register(mxt, &write_value, t6_addr + MXT_T6_CALIBRATE_OFFSET, 1); if (ret == 0) { mxt_info(mxt->ctx, "Sent calibration command"); } else { mxt_err(mxt->ctx, "Failed to send calibration command"); } int state = 0; int flag = false; ret = mxt_read_messages(mxt, MXT_CALIBRATE_TIMEOUT, &state, handle_calibrate_msg, &flag); if (ret == MXT_ERROR_TIMEOUT) { mxt_warn(mxt->ctx, "WARN: timed out waiting for calibrate status"); return MXT_SUCCESS; } else if (ret) { mxt_err(mxt->ctx, "FAIL: device calibration failed"); return ret; } return MXT_SUCCESS; }
//****************************************************************************** /// \brief Run self cap tuning procedure without updating the config /// checksum /// \return #mxt_rc int mxt_self_cap_tune(struct mxt_device *mxt, mxt_app_cmd cmd) { int ret; uint16_t t6_addr; uint16_t t109_addr; uint8_t backupnv_value; uint8_t t109_command; mxt_msg_reset(mxt); // Enable self test object & reporting t6_addr = mxt_get_object_address(mxt, GEN_COMMANDPROCESSOR_T6, 0); if (t6_addr == OBJECT_NOT_FOUND) return MXT_ERROR_OBJECT_NOT_FOUND; t109_addr = mxt_get_object_address(mxt, SPT_SELFCAPGLOBALCONFIG_T109, 0); if (t109_addr == OBJECT_NOT_FOUND) return MXT_ERROR_OBJECT_NOT_FOUND; mxt_info(mxt->ctx, "Stopping T70"); backupnv_value = 0x33; ret = mxt_write_register(mxt, &backupnv_value, t6_addr + MXT_T6_BACKUPNV_OFFSET, 1); if (ret) return ret; // Wait for backup operation to complete (otherwise T109 report may be missed) mxt_msg_wait(mxt, 100); mxt_info(mxt->ctx, "Tuning"); t109_command = T109_CMD_TUNE; mxt_info(mxt->ctx, "Writing %u to T109 CMD register", cmd); ret = mxt_write_register(mxt, &t109_command, t109_addr + T109_CMD_OFFSET, 1); if (ret) return ret; ret = mxt_read_messages(mxt, T109_TIMEOUT, &t109_command, mxt_self_cap_command, (int *)&mxt_sigint_rx); if (ret) return ret; switch (cmd) { case CMD_SELF_CAP_TUNE_CONFIG: mxt_info(mxt->ctx, "Store to Config"); t109_command = T109_CMD_STORE_TO_CONFIG_RAM; break; default: case CMD_SELF_CAP_TUNE_NVRAM: mxt_info(mxt->ctx, "Store to NVRAM"); t109_command = T109_CMD_STORE_TO_NVM; break; } mxt_info(mxt->ctx, "Writing %u to T109 CMD register", cmd); ret = mxt_write_register(mxt, &t109_command, t109_addr + T109_CMD_OFFSET, 1); if (ret) return ret; ret = mxt_read_messages(mxt, 100, (void *) &t109_command, mxt_self_cap_command, (int *)&mxt_sigint_rx); if (ret) return ret; mxt_info(mxt->ctx, "Saving configuration"); ret = mxt_backup_config(mxt, BACKUPNV_COMMAND); if (ret) return ret; ret = mxt_reset_chip(mxt, false); if (ret) return ret; return MXT_SUCCESS; }