我已经收到一个驱动程序(PCI卡的PCAN驱动程序,使用rtdm),它创建/dev/pcan0和/dev/pcan1被编译为netdev驱动程序。
这个驱动程序附带了许多工具,但是它们都是针对用户级程序读取CAN消息的。然而,我需要的是从内核模块读取这些消息。PCAN驱动程序不导出任何变量/函数,这意味着它不提供内核级API供我使用。我简单地看了一下代码,从/dev设备读取并写入它不使用copy_from_user
或copy_to_user
。因此,我认为从内核模块打开/dev/pcan0并从中读取应该是安全的。
现在我的问题是,我如何从一个内核模块打开/读/dev设备?
注:我想从RTAI实时线程的CAN总线读取数据,您认为这会导致问题吗(例如,每次读取都通过linux内核,从而破坏实时条件?)
您可以直接从内核空间使用系统调用:sys_open(), sys_read(), sys_close()。Linuxjournal上有一篇关于这个的文章。
p/S: copy_from_user()可以很好地处理内核空间地址
考虑到我正在使用RTDM,有两个选项:
- 使用RTDM直接函数,如rt_dev_open, rt_dev_read等
- 这在当前版本的pcan驱动程序 中没有实现
- 使用RTDM ioctl
- 这是解决方案,它工作