staticint rmi_f30_read_control_parameters(struct rmi_function *fn, struct f30_data *f30)
{ int error;
error = rmi_read_block(fn->rmi_dev, fn->fd.control_base_addr,
f30->ctrl_regs, f30->ctrl_regs_size); if (error) {
dev_err(&fn->dev, "%s: Could not read control registers at 0x%x: %d\n",
__func__, fn->fd.control_base_addr, error); return error;
}
/* Read the gpi led data. */ if (drvdata->attn_data.data) { if (drvdata->attn_data.size < f30->register_count) {
dev_warn(&fn->dev, "F30 interrupted, but data is missing\n"); return IRQ_HANDLED;
}
memcpy(f30->data_regs, drvdata->attn_data.data,
f30->register_count);
drvdata->attn_data.data += f30->register_count;
drvdata->attn_data.size -= f30->register_count;
} else {
error = rmi_read_block(fn->rmi_dev, fn->fd.data_base_addr,
f30->data_regs, f30->register_count); if (error) {
dev_err(&fn->dev, "%s: Failed to read F30 data registers: %d\n",
__func__, error); return IRQ_RETVAL(error);
}
}
if (f30->has_gpio) { for (i = 0; i < f30->gpioled_count; i++) if (f30->gpioled_key_map[i] != KEY_RESERVED)
rmi_f30_report_button(fn, f30, i); if (f30->trackstick_buttons)
rmi_f03_commit_buttons(f30->f03);
}
/* can happen if gpio_data.disable is set */ if (!f30) return 0;
if (pdata->gpio_data.trackstick_buttons) { /* Try [re-]establish link to F03. */
f30->f03 = rmi_find_function(fn->rmi_dev, 0x03);
f30->trackstick_buttons = f30->f03 != NULL;
}
if (pdata->gpio_data.disable) {
drv->clear_irq_bits(fn->rmi_dev, fn->irq_mask);
} else { /* Write Control Register values back to device */
error = rmi_write_block(fn->rmi_dev, fn->fd.control_base_addr,
f30->ctrl_regs, f30->ctrl_regs_size); if (error) {
dev_err(&fn->dev, "%s: Could not write control registers at 0x%x: %d\n",
__func__, fn->fd.control_base_addr, error); return error;
}
/* * Buttonpad could be also inferred from f30->has_mech_mouse_btns, * but I am not sure, so use only the pdata info and the number of * mapped buttons.
*/ if (pdata->gpio_data.buttonpad || (button - BTN_LEFT == 1))
__set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
return 0;
}
staticint rmi_f30_initialize(struct rmi_function *fn, struct f30_data *f30)
{
u8 *ctrl_reg = f30->ctrl_regs; int control_address = fn->fd.control_base_addr;
u8 buf[RMI_F30_QUERY_SIZE]; int error;
error = rmi_read_block(fn->rmi_dev, fn->fd.query_base_addr,
buf, RMI_F30_QUERY_SIZE); if (error) {
dev_err(&fn->dev, "Failed to read query register\n"); return error;
}
if (f30->has_led || f30->has_gpio_driver_control) { /* control 6 uses a byte per gpio/led */
rmi_f30_set_ctrl_data(&f30->ctrl[6], &control_address,
f30->gpioled_count, &ctrl_reg);
}
if (f30->has_mappable_buttons) { /* control 7 uses a byte per gpio/led */
rmi_f30_set_ctrl_data(&f30->ctrl[7], &control_address,
f30->gpioled_count, &ctrl_reg);
}
if (f30->has_haptic) {
rmi_f30_set_ctrl_data(&f30->ctrl[8], &control_address,
f30->register_count, &ctrl_reg);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.