轮询硬件按钮的状态

时间:2010-08-11 02:17:24

标签: embedded embedded-linux

我需要为在200mhz MIPS cpu上运行embedde linux的设备实现以下功能: 1)如果按下一个重置按钮并保持不到一秒钟 - 继续重启 2)如果按下一个复位按钮并保持至少3秒钟。 - 使用NVRAM中的默认值恢复系统配置,然后重新启动。

我正在考虑两种方式: 1)一个守护进程,它通过GPIO ioctls以适当的时序不断轮询按钮的状态 (可能开销太大,上下文切换很多?) 2)简单的char驱动程序轮询按钮,测量时间并报告状态,例如,通过/ proc到用户空间,守护进程或shell脚本可以检查并执行所需的操作。

对于这两种情况我都不知道如何衡量时间:( 你会建议/推荐什么?

3 个答案:

答案 0 :(得分:2)

您必须在硬件中实现这些功能。 “从NVRAM恢复默认值”的目的是恢复所谓的“砖砌”设备。

例如,如果NVRAM设置被修改(宇宙射线?)以致设备无法启动怎么办?在这种情况下,您建议的按钮轮询守护程序将永远不会执行。

对于持续重启的一秒钟,使用RC(电阻+电容)电路“按下”按钮按下。选择适合1秒延迟的RC时间常数。使用比较器观察RC电压,以发信号通知MIPS cpu上的RESET引脚。

对于三秒钟的按键功能(恢复NVRAM默认值),您可能需要做一些更复杂的事情。

一种可能性是将一个微型PIC单片机放入复位电路,但只使用带有熔丝(不可擦除)ROM的微控制器,而不是NVRAM。

更容易的可能性是在与NVRAM相同的电路和总线上安装包含默认值的ROM。 J / K触发器锁存器可以成为复位电路的一部分。您还需要一个3秒钟的RC电路和比较器。在亚三秒钟的按下时,触发器应该锁定一个0输出,并且在三秒钟的时间内按下,第二个RC电路应该在3秒后触发比较器并向1提供J / K锁存器,用于切换输出。

触发器输出Q将存储单个位,告诉您的电路该复位周期是否在三秒推送之后。如果是这样,那么输出Q正在驱动芯片选择到NVRAM,而Q*正在驱动芯片选择到ROM。 (我假设芯片选择在NVRAM和ROM芯片上都是负逻辑。)

然后,当CPU启动时,它将从NVRAM或ROM中获取设置,具体取决于芯片选择线。

您的启动代码可以检测到它是通过ROM芯片选择启动的,并且稍后可以使用GPIO线复位J / K触发器。然后CPU将能够将好的值写回NVRAM。希望这可以解决这个问题。

您想使用不可擦除或可重复使用的ROM。这种ROM最能抵抗静电,电源故障和辐射。辐射比我们通常意识到的要多得多,例如,宇宙射线通量的数量乘以飞机上的装置。

答案 1 :(得分:1)

我不熟悉您可能正在使用的MIPS处理器和引脚的GPIO /中断功能,但可能的方法如下。

  1. 将输入引脚配置为中断输入。
  2. 当中断触发时,禁用中断并启动短暂的100ms-ish定时器
  3. 当计时器触发时检查按钮是否仍被按下(用于去抖动)。如果不是,则重新启用GPIO中断并重新启动,否则将定时器设置为在3秒超时后重新触发。
  4. 当计时器触发此时间时,如果未按下按钮,则执行重启,否则重置系统配置并重新启动。
  5. 如果引脚无法提供中断,则步骤1将是查看输入的轮询任务。

    按下重置按钮和完全重置过程之间的时间将始终是去抖动按钮的3秒钟。在复位情况下,这可能并不重要,特别是如果作为步骤3的一部分,您可以向用户表明复位序列已经开始 - 例如,将显示屏空白。

答案 2 :(得分:0)

如果要在软件中执行此操作,则需要将其放在内核(中断)代码中,而不是在shell脚本或守护程序中。更好的方法是将其置于硬件中。

根据我的经验,重置设备的可能原因将是用户代码锁定或阻塞处理器。如果问题是由于RF能量或某种性质导致的内存损坏,您可能需要硬件或外部(硬化)处理器来重新刷新设备并解决问题。

在恶意用户代码的情况下,处理器中断和内核代码应该继续运行,而用户代码可能会完全停止。如果你可以从一个中断轮询引脚,你实际上有更好的机会获得你期望的复位。此外,这使您可以进行事件驱动编程,而不是不断轮询引脚。

另一种方法(不是您列出的规范,但是实现相同目标的常用方法)是让启动例程检查GPIO行,并在您想要重新初始化设备时按住按钮。在我见过的大多数嵌入式Linux设备上,“复位”按钮连接到微控制器上的专用复位引脚,而不连接到GPIO引脚。你可能不得不采用这条路线,除非你想开始切割痕迹。