Kirill_Good
Jan 26 2013, 10:04
Добрый день!
Есть проблема с ложным срабатыванием обработчика прерывания в системе. Девайс подключен ногой DATA_OUT к PIO ноге процессора. В драйвере ядра linux есть строчки gpio_to_irq(). Девайс не припаян к плате , а подключается через jack разъем. В процессе работы системы срабатывает в определенные моменты времени обработчик прерывания, хотя не девайс не был подключен. Схемотехника вроде правильная, вход процессора подтянут в питанию. Почему может возникнуть прерывание? PIO банк имеет восемь пинов. К банку подключен девайс и SPI флеш. После чтения литературы нашел понятие как pin change interrupt. Я правильно понимаю что, если irq привязвается к gpio, то прерывание привязвается не к конкретному пину, а ко всему банку и проверка какой пин сработал лежит на программисте? Если да, то не слишком ли высокий уровень абстакции у драйвера, чтобы проверять пины таким образом? Может ли это ложное срабатывание тянуться отсюда? Платформа не ARM , но подходы я думаю у всех похожи.
Не совсем понятно как вообще работает GPIO пин как внешнее прерывание. Это 8 разрядный регистр + логика на входе у банка и от него тянется одна линия ко внутреннему контроллеру прерывания SoC'a? И по изменению значений на нем генерируется прерывание?
Спасибо!
Golikov A.
Jan 26 2013, 15:22
Хорошо бы конечно платформу определить, у всех по разному бывает.
Есть такой вариант
4 ноги из порта имеют индивидуальные прерывания и еще есть 3 прерывания на группу по 4 ноги. То есть прерывания на каждой ноге из первых 4 вызовут каждый свой обработчик, а прерывание любой ноги из группы в остальных вызовет единое прерывание для группы.
Иногда прерывание вызывается для всего порта, и так далее...
на физическом уровне это сделано так: ножки от 4 портов идут на логическое или, а оно уже на детектор прерывания.
В любом случае что вызывало прерывание определяется по флагам, а то очень накладно иметь вектор прерывания для каждой ноги.
В вашем случае еще надо рассмотреть такой вариант, подтянутая резистором ножка не поддается влиянию наводок из воздуха (кстати сильным наводкам поддается и из воздуха), но если вы потрогаете ее пальцем она изменит свое состояние, не на долго, но может изменить. Так же поступает ваш разъем, он же имеет емкость, и когда вы его втыкаете он создает ток, и меняет положение ноги и вызывает прерывание.
Схемотехнически от этого трудно избавится, если вообще возможно.
Kirill_Good
Jan 26 2013, 16:10
На помеху как то не думается, потому что возникает это "ложное" прерывание почти при одних и тех же действиях в определенный момент времени. А кто должен определять какой именно пин из группы сработал? Драйвер или кто то на более низком уровне?
Golikov A.
Jan 26 2013, 16:20
От философии зависит.
С одной стороны кто пин использует тот и смотрит, но с другой стороны представьте что у вас 2 драйвера на одном порту, и у них пины в одной группе. Один драйвер обработает прерывание, своего пина там не найдет и снимет флаг, и другой даже не узнает что что-то было.
Так что скорее всего должна быть какая то самая низкая функция которая разбирает перерывания и уже адресно дергает драйвер. Надо читать спецификацию к драйверу, как его использовать предполагали авторы. Может он вообще написан для систем с раздельными прерываниями, или использует глобальный драйвер порта ввода вывода решающий все проблемы...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.