10

你好Linux内核驱动程序大师!访问串口从一个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); 

我的问题是:真正做到这一点的正确方法是什么?

回答

4

我相信,既然有串口的参与,这一定是某种嵌入式系统。毕竟,没有多少PC甚至有串口。我还假定串行端口可以被认为是永久连接,至少从用户的角度来看。如果那是真的,那么你真的不需要TTY设备。您想要将该设备作为专用UART访问。

如果你看看欧胜的音频编解码器(声音/ SOC/WM的* .c),你会看到,主要传达了I2S但对配置的辅助I2C接口的设备的一个例子。我相信这在概念上是你想要的。该驱动程序为软件提供统一的界面,并向任何适合的硬件发布命令。显然这比将硬件实现细节公开给用户空间要简单得多。

我无法找到这种方式工作的内核中UART驱动程序的一个很好的例子,但我希望我所描述寻找什么。从实用而非纯粹的技术角度来看,从内核执行文件I/O可能会更好。

+0

感谢:欧胜微驱动器是很好的例子。目前还不清楚如何最好地使用UART(我真的不想重写UART驱动!),但这是一个很好的开始。谢谢! – IndigoFire 2011-04-18 20:55:29

1

首先,我建议你找到一种方法,从用户空间如果有可能做到这一点:你什么尝试在这里实现真正的内核代码中的用户空间代码。

但是如果你没有找到一个方法来做到这一点,这article告诉您如何做内核空间用户空间的调用。

既然你要访问一个串行端口,你应该有一个TTY导向,例如用于开启来电:

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

我明白,这确实应该是在用户空间,所以我想的问题是:我怎么能有一个用v412驱动器,接收读写控制来控制变焦,需要发送通过串口命令? – IndigoFire 2011-03-22 15:48:45

+0

感谢您的伟大的文章!它解释了很多我在内核和用户空间中不理解的东西。 – IndigoFire 2011-03-22 15:49:25