состояние аппаратной кнопки опроса - PullRequest
1 голос
/ 11 августа 2010

Мне нужно реализовать следующую функцию для моего устройства, работающего с Embedde Linux на 200 МГц процессоре MIPS: 1) если кнопка сброса нажата и удерживается менее секунды - продолжить перезагрузку 2), если нажата кнопка сброса ипроводится не менее 3 сек.- восстановить конфигурацию системы со значениями по умолчанию из NVRAM и затем перезагрузить компьютер.

Я думаю о двух способах: 1) демон, который постоянно опрашивает состояние кнопки с правильными временными значениями через ioctl GPIO (вероятно, слишком большие издержки,много переключений контекста?) 2) простой драйвер char, опрашивающий кнопку, измеряющий время и сообщающий о состоянии, например, через / proc в пространство пользователя, где демон или скрипт оболочки могут проверять и делать то, что требуется.

И в обоих случаях я не знаю, как измерить время :( Что бы вы посоветовали / порекомендовали?

Ответы [ 3 ]

2 голосов
/ 11 августа 2010

Вы должны реализовать это на оборудовании. Целью «восстановления настроек по умолчанию с NVRAM» является восстановление так называемого «кирпичного» устройства.

Например, что, если настройка NVRAM изменена (космический луч?) Так, что устройство не может загрузиться? В этом случае предложенный вами демон опроса кнопок никогда не будет выполнен.

Для перезагрузки, удерживаемой в течение одной секунды, используйте цепь RC (резистор + конденсатор), чтобы «отменить» нажатие кнопки. Выберите постоянную времени RC, которая соответствует задержке в одну секунду. Используйте компаратор, следящий за напряжением ПДУ, чтобы подать сигнал на вывод RESET на процессоре MIPS.

Для функции печати в течение трех секунд (восстановить настройки NVRAM по умолчанию) вам нужно сделать что-то более сложное, вероятно.

Одна возможность состоит в том, чтобы вставить крошечный микроконтроллер PIC в схему сброса, но использовать только микроконтроллер с ПЗУ с плавким предохранителем (не стираемое), а не NVRAM.

Более простая возможность - иметь ПЗУ с настройками по умолчанию на той же схеме и шине, что и NVRAM. Триггер J / K может стать частью вашей схемы сброса. Вам также понадобится настроенная на три секунды RC-схема и компаратор. На нажатиях менее трех секунд триггер должен защелкнуть выход 0, а на трехсекундных нажатиях вторая RC-цепь должна запустить компаратор через 3 секунды и подать 1 на J / K защелка, которая переключит свой выход.

Триггерный выход Q будет хранить один бит, сообщающий вашей схеме, был ли этот цикл сброса последующим после трехсекундного нажатия. Если это так, то этот вывод Q управляет выбором микросхемы в NVRAM, а Q* управляет выбором микросхемы в ПЗУ. (Я предполагаю, что выбор микросхемы является негативной логикой как для чипов NVRAM, так и для ROM.)

Затем, когда ваш процессор загружается, он выбирает настройки либо с NVRAM, либо из ПЗУ, в зависимости от строки выбора микросхемы.

Ваш загрузочный код может обнаружить, что он загружен с выбором микросхемы ПЗУ, и позже может сбросить триггер J / K с помощью линии GPIO. Тогда процессор сможет записывать хорошие значения обратно в NVRAM. Надеюсь, это разблокирует устройство.

Вы хотите использовать ПЗУ, которое нельзя стирать или использовать повторно. Этот тип ПЗУ наиболее устойчив к статическому электричеству, проблемам с питанием и радиации. Излучение намного больше, чем мы обычно предполагаем, и количество потока космических лучей умножается, например, при помощи устройства на борту авиалайнера.

1 голос
/ 11 августа 2010

Я не знаком с процессором MIPS и возможностями GPIO / прерываний на выводе, который вы могли бы использовать, но возможная методология может быть следующей:

  1. Сконфигурируйте входной вывод как прерываниеinput.
  2. Когда срабатывает прерывание, отключите прерывание и запустите короткий таймер на 100 мсек
  3. Когда срабатывает таймер, убедитесь, что кнопка все еще нажата (для отладки).Если это не так, повторно включите прерывание и перезапуск GPIO, в противном случае установите таймер на повторный запуск после 3-секундного тайм-аута.
  4. Если таймер сработает на этот раз, то, если кнопка не нажата, выполнитев противном случае перезагрузите компьютер, сбросьте конфигурацию системы и перезагрузите компьютер.

Если вывод не может обеспечить прерывание, то шаг 1 будет задачей опроса для проверки входа.

Время между сбросомНажатие кнопки и запуск процесса полного сброса всегда будут через 3 секунды после нажатия кнопки.В ситуации сброса это может не иметь особого значения, особенно если на этапе 3 вы даете пользователю понять, что началась последовательность сброса - например, на экране ничего не отображается.

0 голосов
/ 18 августа 2010

Если вы хотите сделать это в программном обеспечении, вам нужно поместить это в код ядра (прерывания), а не в сценарий оболочки или демон.Лучшим подходом было бы установить это аппаратно.

По моему опыту, вероятной причиной сброса устройства будет неверный пользовательский код, который заблокировал или заблокировал процессор.Если проблема связана с повреждением памяти из-за радиочастотной энергии или чего-то в этом роде, вам может потребоваться аппаратное обеспечение или внешний (усиленный) процессор для перепрошивки устройства и устранения проблемы.

В случае неправильного пользовательского кода прерывания процессора и код ядра должны продолжаться, в то время как код пользователя может быть полностью остановлен.Если вы можете опросить пин-код от прерывания, у вас гораздо больше шансов получить ожидаемый сброс.Кроме того, это позволяет выполнять программирование на основе событий, а не постоянно опрашивать контакт.

Еще один подход (не к перечисленным вами спецификациям, а популярный метод для достижения той же цели) состоит в том, чтобы подпрограммы запуска проверяли линию GPIO и удерживали кнопку, когда вы хотите восстановитьинициализировать устройство.На большинстве встраиваемых Linux-устройств, которые я видел, кнопка «Сброс» подключена к выделенному выводу сброса на микроконтроллере, а не к выводу GPIO.Возможно, вам придется пойти по этому маршруту, если вы не хотите начинать вырезать следы.

...