0

我正在使用 iio 框架编写驱动程序。到目前为止一切顺利。所有输入和 sysfs 条目都运行良好,测量值也很好。(它有很好的记录并且很容易)。但我需要一个小扩展才能在其中一个频道上写字。当我在 iio_info 中添加我的函数时,编译器会向我发出一个错误:

drivers/iio/adc/iio-ccuss.c:197:15: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
  .write_raw = ccuss_iio_write_raw,
               ^~~~~~~~~~~~~~~~~~~

这对我来说很奇怪。我什至不敢相信我在这里无耻地问这个问题,但我很沮丧。我为此失去了将近半天的时间。我的结构是:

static const struct iio_info ccuss_iio_info = {
    .driver_module = THIS_MODULE,
    .attrs = &ccuss_iio_attribute_group,
    .read_raw = ccuss_iio_read_raw,
    .write_raw = ccuss_iio_write_raw,
};

我的通道类型是 IIO_VOLTAGE、IIO_TEMP 和 IIO_HUMIDITYRELATIVE。我开始考虑将其作为设备属性:-(如果我在接下来的 12 小时内没有收到答案。

更新:根据墨菲的评论,只是为了更明显。

static int ccuss_iio_write_raw(struct iio_dev *iio,
                        struct iio_chan_spec const *channel, int *val1,
                        int *val2, long mask);

PS我不想以最知名的方式消除这个错误。QA(和我)会不高兴。谢谢

4

1 回答 1

0

根据参考write_raw()函数声明如下:

int (*write_raw)(
    struct iio_dev *indio_dev,
    struct iio_chan_spec const *chan,
    int val,
    int val2,
    long mask);

您的实现声明如下:

 static int ccuss_iio_write_raw(
     struct iio_dev *iio,
     struct iio_chan_spec const *channel,
     int *val1,
     int *val2,
     long mask);

因此,您将两个整数参数声明为指针,但它们应该按值传递。我认为这是导致“不兼容的指针类型”错误的不匹配。

于 2019-05-03T11:18:38.107 回答