miheyk 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Ку. Вступление: есть драйвер АЦП 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 успешно завершается независимо от переданной при его запуске длине данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
miheyk 0 24 июня, 2015 Опубликовано 24 июня, 2015 · Жалоба Тема получила развитие на лоре Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться