Atmel touch screen Driver移植

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
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值