如何读取 BeagleBone Black 上的外部定时器计数器?

How to read the external timer counter on the BeagleBone Black?

我需要使用 BBB 计算 50KHz 二进制信号的转换。我认为使用由连接到引脚 P8.07 的外部信号触发的 TIMER4 是最简单的方法。

因此,我发出了以下命令来加载正确的 cape 并将引脚设置为计时器:

./config-pin overlay cape-universaln
./config-pin P8.07 timer

一切似乎都正常,dmesg 中什么也没有出现。

我的问题是:如何读取TIMER4的值?我查看了 SysFs,没有发现任何有趣的东西。 /dev 中也没有任何内容。如何检索我刚刚设置的定时器计数器的值?我也对 C/C++ 解决方案持开放态度,但我想避免进行内核-space 编程。

我正在为 BeagleBone 使用最新的 Ubuntu Linux,内核 4.1.10-ti-r21。

通过谷歌搜索,我看到 pps driver for the AM335x DMTimer subsystem here: https://github.com/ddrown/pps-gmtimer

看起来它还没有被合并到上游,README 给出了如何将它构建到 3.8 内核中的说明 - 您可以恢复到 3.8,或者您可以将其调整为 4.1,在这种情况下您可能需要为 4.1.

中的 dtc 编译器的较新版本调整设备树覆盖

您还可以为 PRU 编写一个脉冲计数器固件(只有 50KHz 输入,根本不需要非常优化来捕获每个脉冲)。您可以经常向 ARM 发送一个信号,并在您的用户space 程序中捕获它。

另一种选择是使用 mmap 直接从用户 space 访问 DMTimer 寄存器以映射 /dev/mem 文件(此方法的示例用于 GPIO here) ,但这是一种很好的 "hacky" 方式,而且在 GNU/Linux 世界中,从用户 space 而不是内核 space 做这种事情通常是不受欢迎的.