Как добавить функцию write_raw в мою структуру iio_info - PullRequest
0 голосов
/ 02 мая 2019

Я пишу драйвер, используя iio framework. Пока все идет хорошо. Все входы и записи 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);

P.S. Я не хочу удалять эту ошибку самым известным способом. QA (и я) будет недоволен. Спасибо

1 Ответ

0 голосов
/ 03 мая 2019

В соответствии с ссылкой функция 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);

Таким образом, вы объявляете два целочисленных параметра как указатели, но ожидается, что они будут переданы по значению. Я думаю, что это несоответствие, которое вызывает ошибку «несовместимый тип указателя».

...