前言:
让大家初步了解对高通MSM8916平台的输入子系统的实现,给大家提供Dragon Board 410c平台开发输入系统设备的思路。(如:按键设备、触摸屏、轨迹球等)
在高通MSM8916平台中,具有触摸屏、轨迹球和简单按键功能,这些功能是由Android系统内中的驱动程序实现的,并且需要用户空间的内容来协助实现。
一、触摸屏驱动编写
高通MSM8916平台的触摸屏驱动程序的实现文件是drivers/input/touchscreen/synapTIcs_i2c_rmi4.c,此文件的核心是函数synapTIcs_ts_probe(),在该函数中需要进行触摸屏工作模式的初始化,对作为输出设备的触摸屏驱动在Linux平台下的设备名注册,同事初始化触摸时间触发时引起的中断操作。此函数的实现代码如下:
staTIc int synapTIcs_rmi4_probe
{
int retval = 0;
unsigned char ii;
unsigned char attr_count;
struct synaptics_rmi4_f1a_handle *f1a;
struct synaptics_rmi4_fn *fhandler;
struct synaptics_rmi4_fn *next_fhandler;
struct synaptics_rmi4_data *rmi4_data;
struct synaptics_rmi4_device_info *rmi;
struct synaptics_rmi4_platform_data *platform_data =
client->dev.platform_data;
struct dentry *temp;
if
return retval;
} else {
platform_data = client->dev.platform_data;
}
if
snprintf
dev_err
dev_err
rmi4_data->disp_maxx = rmi4_data->board->disp_maxx;
else
rmi4_data->disp_maxx = rmi4_data->sensor_max_x;
if
rmi4_data->disp_maxy = rmi4_data->board->disp_maxy;
else
rmi4_data->disp_maxy = rmi4_data->sensor_max_y;
if
rmi4_data->disp_minx = rmi4_data->board->disp_minx;
else
rmi4_data->disp_minx = 0;
if
rmi4_data->disp_miny = rmi4_data->board->disp_miny;
else
rmi4_data->disp_miny = 0;
input_set_abs_params
f1a = fhandler->data;
}
}
mutex_unlock
synaptics_rmi4_f1a_kfree
gpio_free
gpio_free
pr_err("failed to select release pinctrl state");
}
}
synaptics_rmi4_power_on(rmi4_data, false);
err_power_device:
synaptics_rmi4_regulator_configure(rmi4_data, false);
err_reg_configure:
input_free_device(rmi4_data->input_dev);
rmi4_data->input_dev = NULL;
err_input_device:
kfree(rmi4_data);
return retval;
}
在上述代码中,通过I2c_smb_read_byte_data()函数对其寄存器信息进行读取即可完成其事件信息的获取,也可以通过i2c_transfer完成对其寄存器信息的批量读取。