staticint rmi_f12_read_sensor_tuning(struct f12_data *f12)
{ conststruct rmi_register_desc_item *item; struct rmi_2d_sensor *sensor = &f12->sensor; struct rmi_function *fn = sensor->fn; struct rmi_device *rmi_dev = fn->rmi_dev; int ret; int offset;
u8 buf[15]; int pitch_x = 0; int pitch_y = 0; int rx_receivers = 0; int tx_receivers = 0;
u16 query_dpm_addr = 0; int dpm_resolution = 0;
item = rmi_get_register_desc_item(&f12->control_reg_desc, 8); if (!item) {
dev_err(&fn->dev, "F12 does not have the sensor tuning control register\n"); return -ENODEV;
}
if (item->reg_size > sizeof(buf)) {
dev_err(&fn->dev, "F12 control8 should be no bigger than %zd bytes, not: %ld\n", sizeof(buf), item->reg_size); return -ENODEV;
}
ret = rmi_read_block(rmi_dev, fn->fd.control_base_addr + offset, buf,
item->reg_size); if (ret) return ret;
if (f12->has_dribble
&& (f12->sensor.dribble != RMI_REG_STATE_DEFAULT)) {
item = rmi_get_register_desc_item(&f12->control_reg_desc, 20); if (item) {
control_offset = rmi_register_desc_calc_reg_offset(
&f12->control_reg_desc, 20);
/* * The byte containing the EnableDribble bit will be * in either byte 0 or byte 2 of control 20. Depending * on the existence of subpacket 0. If control 20 is * larger then 3 bytes, just read the first 3.
*/
control_size = min(item->reg_size, 3UL);
ret = rmi_read_block(rmi_dev, fn->fd.control_base_addr
+ control_offset, buf, control_size); if (ret) return ret;
if (rmi_register_desc_has_subpacket(item, 0))
subpacket_offset += 1;
switch (f12->sensor.dribble) { case RMI_REG_STATE_OFF:
buf[subpacket_offset] &= ~BIT(2); break; case RMI_REG_STATE_ON:
buf[subpacket_offset] |= BIT(2); break; case RMI_REG_STATE_DEFAULT: default: break;
}
ret = rmi_write_block(rmi_dev,
fn->fd.control_base_addr + control_offset,
buf, control_size); if (ret) return ret;
}
}
ret = rmi_read(fn->rmi_dev, query_addr, &buf); if (ret < 0) {
dev_err(&fn->dev, "Failed to read general info register: %d\n",
ret); return -ENODEV;
}
++query_addr;
if (!(buf & BIT(0))) {
dev_err(&fn->dev, "Behavior of F12 without register descriptors is undefined.\n"); return -ENODEV;
}
if (fn->dev.of_node) {
ret = rmi_2d_sensor_of_probe(&fn->dev, &f12->sensor_pdata); if (ret) return ret;
} else {
f12->sensor_pdata = pdata->sensor_pdata;
}
ret = rmi_read_register_desc(rmi_dev, query_addr,
&f12->query_reg_desc); if (ret) {
dev_err(&fn->dev, "Failed to read the Query Register Descriptor: %d\n",
ret); return ret;
}
query_addr += 3;
ret = rmi_read_register_desc(rmi_dev, query_addr,
&f12->control_reg_desc); if (ret) {
dev_err(&fn->dev, "Failed to read the Control Register Descriptor: %d\n",
ret); return ret;
}
query_addr += 3;
ret = rmi_read_register_desc(rmi_dev, query_addr,
&f12->data_reg_desc); if (ret) {
dev_err(&fn->dev, "Failed to read the Data Register Descriptor: %d\n",
ret); return ret;
}
query_addr += 3;
if (sensor->sensor_type == rmi_sensor_default)
sensor->sensor_type =
f12->sensor_pdata.sensor_type;
rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s: data packet size: %d\n", __func__,
sensor->pkt_size);
sensor->data_pkt = devm_kzalloc(&fn->dev, sensor->pkt_size, GFP_KERNEL); if (!sensor->data_pkt) return -ENOMEM;
dev_set_drvdata(&fn->dev, f12);
ret = rmi_f12_read_sensor_tuning(f12); if (ret) return ret;
/* * Figure out what data is contained in the data registers. HID devices * may have registers defined, but their data is not reported in the * HID attention report. Registers which are not reported in the HID * attention report check to see if the device is receiving data from * HID attention reports.
*/
item = rmi_get_register_desc_item(&f12->data_reg_desc, 0); if (item && !drvdata->attn_data.data)
data_offset += item->reg_size;
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.