Eu tenho uma placa de avaliação BeagleBone verde e ADT7516 conectada com pinos SDA e SCL.
Quando faço i2cdetect -y -r 2, consigo ver o endereço i2c como 0x4b e sou capaz de sondar o driver adt7316 presente no subsistema IIO.
O driver adt7316 usa dados da plataforma para obter a descrição do hardware. Mas meu objetivo é remover dados de plataforma e usar ligações de DT.
Eu entendo algumas coisas básicas sobre as ligações do DT, como ...
Mas quando olho de perto para o motorista, vejo que há certas coisas que são retiradas dos dados da plataforma e são usadas em todo o driver.
Então, minha pergunta é como substituir essas coisas no driver, se eu remover os dados da plataforma e usar ligações DT.
Estou colocando o código da função de teste aqui.
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);
Assim, no código, podemos ver que chip- > ldac_pin e chip- > bus.irq_flags dados da plataforma. Se eu usar ligações DT, os dados da plataforma terão um valor NULL.
Então, como eu desenho minhas ligações DT aqui e como posso buscar esses dados no driver?
Eu tenho visto muitos exemplos de ligações DT, mas eu preciso de ajuda específica com o sensor adt7516.
Ficha técnica do sensor adt7516