1

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

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

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

4

3 回答 3

2

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

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

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

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

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

一种更简单的可能性是在与 NVRAM 相同的电路和总线上拥有一个包含默认值的 ROM。AJ/K 触发器锁存器可以成为复位电路的一部分。您还需要一个三秒调谐的 RC 电路和比较器。在低于三秒的按下时,触发器应锁存0输出,在三秒以上的按下时,第二个 RC 电路应在 3 秒后触发比较器并将 a1提供给 J/K 锁存器,这将切换其输出。

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

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

您的引导代码可以检测到它是使用 ROM 芯片选择引导的,然后可以使用 GPIO 线重置 J/K 触发器。然后 CPU 将能够将好的值写回 NVRAM。希望能解开设备。

您想使用不可擦除或不可重复使用的 ROM。那种 ROM 对静电、电源故障和辐射的抵抗力最强。辐射比我们通常意识到的要多得多,例如,通过在客机上安装一个设备,宇宙射线通量的数量会成倍增加。

于 2010-08-11T03:31:02.507 回答
1

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

  1. 将输入引脚配置为中断输入。
  2. 当中断触发时禁用中断并启动一个短的 100ms-ish 计时器
  3. 当计时器触发时,检查按钮是否仍被按下(用于去抖动)。如果不是,则重新启用 GPIO 中断并重新启动,否则将定时器设置为在 3 秒超时后重新触发。
  4. 当计时器触发此时间时,如果未按下按钮,则重新启动,否则重置系统配置并重新启动。

如果引脚无法提供中断,则步骤 1 将是查看输入的轮询任务。

从按下去抖动按钮开始,按下复位按钮和运行完整的复位过程之间的时间始终为 3 秒。在重置情况下,这可能并不重要,特别是如果作为步骤 3 的一部分,您让用户清楚地看到重置序列已经开始 - 例如使显示器空白。

于 2010-08-11T08:17:18.597 回答
0

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

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

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

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

于 2010-08-17T21:18:30.783 回答