Touch panel DTS 分析(MSM8994平台,Atmel 芯片)

Touch panel DTS 分析(MSM8994平台,Atmel 芯片)

在MSM8994平台下,Touch panel的DTS节点写在/kernel/arch/arm/boot/dts/qcom/msm8994-mtp.dtsi文件中。具体代码如下:

&soc {
          i2c@f9924000 {
                                   atmel_mxt_ts@4a {
                                            compatible = "atmel,atmel_mxt_ts";
                                            reg = <0x4a>;
                                            interrupt-parent = <&msm_gpio>;
                                            interrupts = <61 0x2008>;
                                            avdd-supply  = <&pm8994_l22>;
                                            vdd_io-supply = <&pm8994_l14>;
                                            .........
                                            };
                                };

在DTS节点中,我们主要看一下avdd-supply and vdd_io-supply两个属性。这两个属性在C代码里的使用方式如下:

/kernel/drivers/input/touchscreen/atmel_mxt_ts.c
mxt_probe_regulators(struct mxt_data *data)
{
     ........
     data->reg_vdd_io = regulator_get(dev, "vdd_io");
     ........
     data->reg_avdd = regulator_get(dev, "avdd");
     ........
}

/kernel/drivers/regulator/core.c
struct regulator *regulator_get(struct device *dev, const char *id)
{
     return _regulator_get(dev, id, 0);
}

static struct regulator *_regulator_get(struct device *dev, const char *id, int exclusive)
{
     .......
     rdev = regulator_dev_lookup(dev, id, &ret);
     if(rdev)
          goto found;
     ......
}

static struct regulator_dev *regulator_dev_lookup(struct devic *dev, const char *supply, int *ret)
{
     struct regulator_dev *r;
     struct device_node *node;
     ........
     /* first do a dt based lookup */
     if (dev && dev->of_node) {
          node = of_get_regulator(dev, supply)
          if (node) {
                    list_for_each_entry(r, &regulator_list, list)
                         if ( r->dev.parent && node == r->dev.of_node)
                                  return r;
                         ........
                         }
         }
}

static struct device_node *of_get_regulator(struct device *dev, const char *supply)
{
        struct device_node *regnode = NULL;
         char prop_name[32];
         .......
         snprintf(prop_name, 32, "%s-supply", supply);
          regnode = of_parse_phandle(dev->of_node, prop_name, 0);
         ........
}

从上述代码大致上可以看到DTS里的vdd_io-supply and avdd-supply属性是如何解析和使用的。在mxt_probe()函数中将字符串“avdd”和“vdd_io”传给regulator_get()函数,一步步调用下来后,在of_get_regulator()函数中将字符串合并成DTS中符合要求的字符串属性,之后通过属性的值来找到相应的regulator_dev 结构体!
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值