embedded - 为时间戳 IP 创建 Linux 驱动程序
问题描述
我有一个运行 Linux 的嵌入式板。我想使用 PTP (IEEE 1588) 将板与网络大师同步。该板使用具有 ARM 处理器和 FPGA 的 Xilinx Zynq 设备。我已经开发了一些 IP 来做时间戳和 RTC。我现在需要将这两个 IP 与 Linux 接口。所以我需要创建一些驱动程序,但由于我不是 Linux 专家,我真的不知道该怎么做。
我对驱动程序开发有基本的了解,但问题是如何连接时间戳。我打算使用 Linux PTP 程序来做 PTP。从我可以通过查看其他执行此操作的驱动程序得出的结果来看,有一个 SO_TIMESTAMPING 标志可以启用硬件时间戳。然后在设置它的skb(套接字缓冲区)文件中有一些函数。有人能解释一下驱动程序需要什么来连接 PTP 程序吗?
谢谢
解决方案
编写内核模块不是一件容易的事。你肯定会面临学习曲线。
还有比这更多的部分,但在高层次上,您需要做一些事情。
- 确定您希望在 IP 和驱动程序之间交换信息的内存位置。
- 添加一个设备树条目,指定您将使用的内存范围。
- 编写驱动程序与您的 IP 接口。
- 将信息公开给用户空间。
当您弄清楚事情时,您可以在驱动程序中硬编码内存地址,但最终驱动程序应该从设备树中提取内存区域。一些技巧:
- 驱动程序需要请求内存区域(request_mem_region),然后映射它(ioremap_nocache)。
- 然后,您可以通过在 /proc/ 或 /dev/ 中创建文件、创建套接字或各种其他方法来将该信息公开给用户空间
- 如果您要在内核中使用 UDP 套接字,请查看https://lwn.net/Articles/625077/
- 首先介绍一些模块编写教程,例如http://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/