Atmel toch MXT641T_AT && MXT641T_CCU
MX641T_AT 和 MXT641T_CCU属于同一系列IC,AT 是车规级,CCU属于消费级。驱动主体框架部分没有大的区别细节部分有些差异。
本驱动主要结合frescale中的driver对atmel_touch进行讲解
首先给出驱动在dts中的配置
//电源配置
atmel_vdd: vdd {
compatible = "regulator-fixed";
regulator-name = "vdd";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
atmel_avdd: avdd {
compatible = "regulator-fixed";
regulator-name = "avdd";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
atmel_mxt_ts@4a{
compatible = "atmel,mxt641t";
reg = <0x4a>; //touch IC挂在I2C总线下地址0x4a
interrupt-parent = <&gpio7>; //中断配置
interrupts = <11 2>;
wakeup-gpios = <&gpio7 11 0>;
atmel,reset-gpio = <&pca9555_b 5 0>;
//触摸按键设置,由于AT 和CCU采用不同的按键模式因此在相应同一个事件时按键映射有差异
atmel,key-buttons_at = <158 102 63 305 115 139 114 306 106 113>;
atmel,key-buttons_ccu = <106 114 306 113 0 0 0 0 158 102 0 63 305 0 115 139>;
atmel,suspend-mode = <2>;
atmel,input_name = "atmel_touchscreen";
atmel,cfg_name_at = "atmel_mxt641t_at.raw";
atmel,cfg_name_ccu = "atmel_mxt641t_ccu.raw"; //升级firmware所需的配置文件名称
}
驱动代码部分从probe函数开始解析。
static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct mxt_data *data;
const struct mxt_platform_data *pdata;
int error;
//probe_1: 解析dts文件,配置gpio, regulator, enable.注册等常规驱动基本操作
pdata = dev_get_platdata(&client->dev);
if (!pdata) {
pdata = mxt_parse_dt(client);
if (IS_ERR(pdata))
return PTR_ERR(pdata);
}
data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
if (!data)
return -ENOMEM;
snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0",
client->adapter->nr, client->addr);
data->client = client;
data->pdata = pdata;
i2c_set_clientdata(client, data);
if (data->pdata->cfg_name)
mxt_update_file_name(&data->client->dev,
&data->cfg_name,
data->pdata->cfg_name,
strlen(data->pdata->cfg_name));
if (data->pdata->cfg_name_1)
mxt_update_file_name(&data->client->dev,
&data->cfg_name_1,
data->pdata->cfg_name_1,
strlen(data->pdata->cfg_name_1));
init_completion(&data->reset_completion);
init_completion(&data->crc_completion);
init_completion(&data->chg_completion);
mutex_init(&data