Приветствую!
Помогите разобраться с проблемой, пожалуйста.
Модуль SK-MVF6-NANO установлен в наше устройство. К нему по SPI подключен IMU ADIS16485.
На пин 38 (GPIO/JTDI) подан сигнал DATA-READY от ADIS16485 - сигнал о готовности данных. По этому сигналу мне необходимо получать данные от ADIS16485. Импульс имеет обратную полярность. Ширина импульса порядка 10 мкс (jitter 1.4мкс). Пин 38 подтянут к "+" через резистор 10к. Осциллографом импульс наблюдаю. Причем с той частотой, с которой я конфигурирую ADIS16485.
Ядро Linux-3.1.2. В ядре настроил 38 пин на GPIO:
В spi_dev.c на этот GPIO повесил прерывание. В нем считаю число полученных импульсов и на каждом 1000-м импульсе вывожу разницу по времени:
Далее настраиваю ADIS16485 на частоту выдачи 60 Гц. И вижу пропуск импульсов:
90000 48.163889943
91000 47.913995563
92000 49.380072441
93000 48.330490609
94000 48.780305261
95000 48.513764441
96000 49.013545033
97000 48.297182426
98000 48.830298125
99000 49.096848850
100000 49.080198033
Частота примерно в три раза меньше. И она плавает.
Пробовал разные частоты, от исходной - 2460Гц, до 6Гц. Всегда наблюдаю пропуск и частоту прерываний примерно в три раза меньше заданной.
sasamy,
По восходящему фронту (в доке на ADIS готовность данных).
Попробовал IRQF_TRIGGER_LOW и gpio_set_debounce на 1мс.
Теперь пошли какие-то бешенные частоты.
Тут пришла мысль.
Если по IRQF_TRIGGER_LOW я ловлю дребезг, может просто по прерыванию взводить таймер на 12-15 мкс и по его срабатыванию забрать данные.
LOW/HIGH - это прерывание по уровню
вам нужно RISING/FALLING - это по фронту..
а перед этив доке на проц прочитать - понимает ли он на прерывание от gpio нужный режим..
В общем, разобрались.
В драйвере GPIO в режиме входа принудительно включаются цифровые фильтры, видимо для устранения дребезга. Отключил - получаю прерывания с установленной частотой.
Конкретнее, файл $KERNEL_PATH/arch/arm/plat-mxc/gpio-mvf.c: