Linux内核中的硬件时钟信号实现

Posted

技术标签:

【中文标题】Linux内核中的硬件时钟信号实现【英文标题】:Hardware clock signals implementation in Linux Kernel 【发布时间】:2011-09-27 00:20:57 【问题描述】:

我正在寻找一些指针,以了解 Linux 内核如何实现各种硬件时钟的设置。这基本上与设置 LCD、UART 等硬件功能将使用的各种时钟有关。例如,当 Linux 启动时,它如何处理设置 UART 或 USB 的时钟。可能是诸如时钟管理器之类的东西。

我基本上是在尝试在我正在开发的新硬件上为不同的操作系统实现类似的东西。任何帮助将非常感激。

[编辑] 感谢您的回复和链接。所以这是我到目前为止所实施的。这应该让你知道我要去哪里。

我查阅了我所针对的特定系统的硬件参考手册,并编写了一些代码来监视/修改我感兴趣的外围设备的信号/引脚,即从命令行打开/关闭它们。现在这些时钟/信号的集合一起控制外围设备。HRM 会说,如果你想打开 UART 或其他东西,那么就打开这样那样的信号/引脚。 @BjoernD 是的,我正在使用类似 mmap() 函数来与外围设备通信。

我的问题的核心是我想了解使用我已经编写的实用程序的时钟/外设管理器的设计和实现。这个时钟/外设管理器可以让我控制启用/禁用我想要的外围设备。基本上,这个管理器将使我能够对正在运行的初始化代码进行更改。此外,在运行时进程可以调用此管理器来打开/关闭设备,从而优化功耗。这可能没有完全的意义,但我自己正试图解决这个问题。

现在我确信这样的事情会在 Linux 或任何操作系统中实现性能问题(没有人愿意在启动时打开所有外围设备来浪费电力)。我想了解它的软件架构。到目前为止,来自任何操作系统的引用都至少可以抢占先机。此外,我不是在编写自己的操作系统,有一个操作系统,但我更多地关注板级软件,即 BSP 来工作。但是无论如何感谢操作系统链接,它们真的很棒。欣赏它。

谢谢!

【问题讨论】:

【参考方案1】:

您想要实现的目标与 a) 您正在使用的平台和 b) 您想要使用的设备高度相关。例如,在 x86 上,有 3 种方式与设备通信:

    中断允许设备向 CPU 发出信号。操作系统通常提供注册中断处理程序的机制——在发生中断时调用的函数。在 Linux 中查看 request_irq() 和 linux/include/interrupt.h 中的朋友 内存映射 I/O 是设备的物理内存,平台的 Bios 以与访问普通物理内存相同的方式提供设备的物理内存 - 只需写入内存地址即可。这种内存背后的具体内容(例如,网络接口配置寄存器或 LCD 帧缓冲区)取决于设备,通常在设备的数据表中指定。 I/O 端口通过特殊地址空间和特殊指令(INB/OUTB & co.)访问。除此之外,它们的工作方式类似于 I/O 内存。

有多种方法可以找出设备提供的资源以及 BIOS 映射它们的位置。一些平台使用 ACPI 表(谷歌自己了解 1,000k 页规范),PCI 通过 PCI 配置空间以标准化方式提供有关设备的信息,USB 具有类似的发现连接到总线的设备的方法,以及一些设备,例如 UARTS , 被简单地指定为在为您的平台固定的预配置 I/O 范围内可用。

作为了解 Linux 的开始,我推荐"Understanding the Linux kernel"。有关 Linux 如何处理设备以及编写驱动程序的详细信息,请查看Linux Device Drivers。此外,您需要了解您的平台和您要驱动的设备的特性。

如果您想启动自己的操作系统,UART 肯定会非常有助于打印调试输出,所以您可能想先这样做。

现在我写下了所有这些,您的实际问题似乎是:如何开始操作系统设计。这个问题应该对你很有价值:What are some resources for getting started in operating system development?

【讨论】:

所以我基本上想做的是建立某种系统,以便我可以适当地打开相应硬件所需的信号/时钟。 Contd (Return key 应该是粘贴注释) 所以例如在启动过程中可能只有 UART 可能打开,但其余的可能关闭以节省电源。稍后当 LCD 需要启动时,它可以发送请求到用于打开某些信号的实用程序/管理器(这些可以从硬件规范中得知)。因此该实用程序将通过在 LCD“HIGH”的控制寄存器中设置所需的位来采取适当的措施。 我确信这已经在 Linux 内核中以一种有组织的方式处理了,只是我不知道去哪里找。 好的,知道了。这实际上是特定于硬件和设备的。编辑我的回复。 我编辑了我的问题以添加更多详细信息并回答您发布的一些内容。【参考方案2】:

大多数计算机中的两个主要用户是 CPU 和磁盘。这两者都具有在 Linux 中省电的功能。 CPU 时钟可以在系统不忙时减慢,磁盘电机可以在没有 I/O 发生时停止。对于 UART,即使您通过关闭时钟节省了它使用的所有功率,它与其他的相比仍然很小,因为 UART 中没有太多逻辑。

省电的最佳方法是 1) 更高效的电源 2)用SSD替换旋转磁盘 3) 减慢 CPU 和内存总线

【讨论】:

你的回答与问题有什么关系? Steve - 感谢您提及节能方法,但正如我在问题中详述的那样,我正在寻找一种更有效地管理外围设备以节能的方法。我知道动态 CPU 频率缩放是一个不错的选择,但我现在还没有研究它。而且我不只是在谈论 UART,而是更多地处理所有外围设备的管理器,包括 LCD、USB 等,我想你会同意消耗大量电力。

以上是关于Linux内核中的硬件时钟信号实现的主要内容,如果未能解决你的问题,请参考以下文章

linux的硬件时钟

RK3399驱动开发 | 15 - RTC实时时钟芯片HYM8563S调试(基于linux5.4.32内核)

RK3399驱动开发 | 15 - RTC实时时钟芯片HYM8563S调试(基于linux5.4.32内核)

Linux系统时间硬件时间(datetzselectclockhwclockntpdate)

我使用过的Linux命令之hwclock - 查询和设置硬件时钟

Linux系统时间和硬件时间