从linux内核模块访问串行端口

时间:2011-03-21 15:20:30

标签: linux-kernel serial-port linux-device-driver kernel-module

Hello Linux内核驱动大师!

我正在为使用串行接口进行配置的相机编写v4l2驱动程序。我希望驱动程序配置相机,因为它可以保持客户端代码在相机型号之间保持一致。问题是:从驱动程序模块访问摄像机串行接口的最佳方法是什么?

据我所知,从内核驱动程序访问文件是一个很大的禁忌,但可以做到。因此,我目前正在使用以下代码片段,但感觉就像是黑客。

oldfs = get_fs();
set_fs(KERNEL_DS);

fd->f_pos=0;
fd->f_op->write(fd, data, data_len, &fd->f_pos);

set_fs(oldfs);

我的问题是:什么是正确的方法?

2 个答案:

答案 0 :(得分:5)

我认为由于涉及串行端口,因此必须使用某种嵌入式系统。毕竟,没有多少PC甚至有串口。我还假设串口可以被认为是永久连接,至少从用户的角度来看。如果这一切都是真的,那么你真的不想要一个TTY设备。您希望将设备作为专用UART访问。

如果您查看Wolfson音频编解码器(sound / soc / wm * .c),您将看到主要通过I2S进行通信但具有辅助I2C接口进行配置的设备示例。我相信这在概念上是你想要的。驱动程序为软件提供统一的接口,并向适当的硬件发出命令。显然,这比向用户空间公开硬件实现细节要清晰得多。

我找不到内核中以这种方式工作的UART驱动程序的好例子,但希望我已经描述了要查找的内容。从实际而非技术纯度的角度来看,从内核执行文件I / O可能更好。

答案 1 :(得分:1)

首先,如果可能,我建议您从用户空间中找到一种方法:在这里尝试实现的是内核代码中的用户空间代码。

但是如果你找不到办法,那么article将向你展示如何在内核空间中进行用户空间调用。

由于你想访问一个串口,你应该有一个tty面向的调用,例如open:

serial_fd = sys_open("/dev/ttyS0",  O_RDWR | O_NOCTTY | O_NONBLOCK))