Jump to content

    

Драйвер ADC через IIO

Ку.

Вступление: есть драйвер АЦП ADS8638 чере IIO, в нем обработчик прерывания с проталкиванием данных от SPI в кольцевой буфер iio. Запуск сбора от триггера sysfs (sysfstrig1): echo 1 > /sys/bus/iio/devices/iio_sysfs_trigger/trigger1/trigger_now. Чтение данных примером generic_buffer.c из устройства /dev/iio:device1 с блокировкой через вызов poll.

Пример:

/* Обработчик */
static irqreturn_t ads8638_trigger_handler(int irq, void *p)
{
    struct iio_poll_func *pollfunc = p;
    struct iio_dev *idev = pollfunc->indio_dev;
    struct ads8638_state *state = iio_priv(idev);
    ssize_t ts_offset;
    u16 buf;
    int ret;

    ret = spi_read(state->spi, (u8 *)&state->rx_buf[0], 2);

    if (idev->scan_timestamp) {
        ts_offset = idev->scan_bytes / sizeof(s64) - 1;
        ((s64 *)state->rx_buf)[ts_offset] = pollfunc->timestamp;
    }

    iio_push_to_buffers(idev, (u8 *)state->rx_buf);
    iio_trigger_notify_done(idev->trig);

    return IRQ_HANDLED;
}

/* Настройка в probe */
ret = iio_triggered_buffer_setup(idev, &iio_pollfunc_store_time, \
            &ads8638_trigger_handler, &ads8638_ring_setup_ops);

static const struct iio_buffer_setup_ops ads8638_ring_setup_ops = {
    .preenable = &ads8638_ring_preenable,
    .postenable = &iio_triggered_buffer_postenable,
    .predisable = &iio_triggered_buffer_predisable,
    .postdisable = &ads8638_ring_postdisable,
};

Платформа: встраиваемая с ядром 3.8.13.

 

Вопрос: почему при запуске сбора прерывание происходит только один раз после команды echo 1 > /sys/bus/iio/devices/iio_sysfs_trigger/trigger1/trigger_now, в остальное время процесс generic_buffer висит в ожидании poll? Если повторно дать команду echo, то снова происходит прерывание и generic_buffer успешно завершается независимо от переданной при его запуске длине данных.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this