私はBeagleBoneグリーンとADT7516の評価ボードをSDAピンとSCLピンに接続しました。
i2cDetect -y -r 2を実行すると、i2cアドレスが0x4bであることを確認でき、IIOサブシステムでadt7316ドライバの存在を検出できます。
adt7316ドライバは、プラットフォームデータを使用してハードウェア記述を取得します。しかし、私の目標は、プラットフォームデータを削除してDTバインディングを使用することです。
私は次のDTバインディングに関するいくつかの基本的な知識を理解しています。
- 互換性
- 登録する
ちなみに、ドライバーを詳しく見ると、プラットフォームデータからインポートされ、ドライバー全体で使用するものがあることがわかります。
したがって、私の質問は、プラットフォームデータを削除し、DTバインディングを使用している場合、ドライバはそれをどのように置き換えますか?
ここにプローブ機能のコードを入れます。
int adt7316_probe(struct device *dev, struct adt7316_bus *bus,
const char *name)
{
struct adt7316_chip_info *chip;
struct iio_dev *indio_dev;
unsigned short *adt7316_platform_data = dev->platform_data;
int ret = 0;
indio_dev = devm_iio_device_alloc(dev, sizeof(*chip));
if (!indio_dev)
return -ENOMEM;
chip = iio_priv(indio_dev);
/* this is only used for device removal purposes */
dev_set_drvdata(dev, indio_dev);
chip->bus = *bus;
if (name[4] == '3')
chip->id = ID_ADT7316 + (name[6] - '6');
else if (name[4] == '5')
chip->id = ID_ADT7516 + (name[6] - '6');
else
return -ENODEV;
chip->ldac_pin = adt7316_platform_data[1];
if (chip->ldac_pin) {
chip->config3 |= ADT7316_DA_EN_VIA_DAC_LDCA;
if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
chip->config1 |= ADT7516_SEL_AIN3;
}
chip->int_mask = ADT7316_TEMP_INT_MASK | ADT7316_VDD_INT_MASK;
if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
chip->int_mask |= ADT7516_AIN_INT_MASK;
indio_dev->dev.parent = dev;
if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX)
indio_dev->info = &adt7516_info;
else
indio_dev->info = &adt7316_info;
indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE;
if (chip->bus.irq > 0) {
if (adt7316_platform_data[0])
chip->bus.irq_flags = adt7316_platform_data[0];
ret = devm_request_threaded_irq(dev, chip->bus.irq,
NULL,
adt7316_event_handler,
chip->bus.irq_flags |
IRQF_ONESHOT,
indio_dev->name,
indio_dev);
if (ret)
return ret;
if (chip->bus.irq_flags & IRQF_TRIGGER_HIGH)
chip->config1 |= ADT7316_INT_POLARITY;
}
ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG1, chip->config1);
if (ret)
return -EIO;
ret = chip->bus.write(chip->bus.client, ADT7316_CONFIG3, chip->config3);
if (ret)
return -EIO;
ret = devm_iio_device_register(dev, indio_dev);
if (ret)
return ret;
dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n",
indio_dev->name);
return 0;
}
EXPORT_SYMBOL(adt7316_probe);
コードでは、私たちは見ることができますチップ->ldac_pinそしてチップ -> Bus.irq_flagsプラットフォームデータを使用してください。 DTバインディングを使用すると、プラットフォームデータにNULL値が含まれます。
それでは、ここでDTバインディングをどのように設計し、ドライバからこのデータをどのように取得できますか?
DTバインディングの多くの例を見てきましたが、adt7516センサーの具体的な助けが必要です。
adt7516センサーデータシート
http://www.analog.com/media/en/technical-documentation/data-sheets/ADT7516_7517_7519.pdf