从Linux内核模块访问串口

13

大家好,我正在编写一个v4l2驱动程序,用于控制一个使用串行接口进行配置的摄像头。我希望驱动程序能够对摄像头进行配置,这样可以使得客户端代码在不同型号的摄像头上保持一致。我的问题是:从驱动模块中访问相机的串行接口最佳方式是什么?

根据我所了解的情况,从内核驱动程序中访问文件是不可取的,但这确实是可行的。因此,目前我正在使用以下代码片段,但感觉这是一种hack方法。

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个回答

5
我认为由于涉及串口,这必须是某种嵌入式系统。毕竟,很少有个人电脑甚至带有串口。我还假设串口可以被视为一个永久的连接,至少从用户的角度来看。如果所有这些都是真的,那么你实际上并不需要TTY设备。你需要访问设备作为一个私有的UART。
如果您查看Wolfson音频编解码器(sound/soc/wm*.c),您将看到主要通过I2S进行通信但具有用于配置的辅助I2C接口的设备示例。我相信这就是您想要的概念。驱动程序向软件呈现统一的接口,并向适当的硬件发出命令。显然,这比向用户空间公开硬件实现细节要干净得多。
我找不到内核中工作方式如此的UART驱动程序的好例子,但希望我已经描述了要查找的内容。从实践而不是技术纯粹性的角度来看,从内核进行文件I/O可能更好些。

谢谢你提供的Wolfson Micro驱动程序,它们是很好的示例。虽然如何最好地使用UART仍不清楚(我真的不想重写UART驱动程序!),但这是一个很好的开始。谢谢! - IndigoFire

2

首先,我建议您尽可能从用户空间找到一种方法来实现这一点:你所尝试实现的内容实际上是内核代码中的用户空间代码。

但是,如果您找不到一种方法来实现它,这篇文章向您展示如何在内核空间进行用户空间调用 article

因为您想要访问串口,您应该拥有tty定向的调用,例如open:

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

我明白这个应该放在用户空间,所以问题是:我如何让一个v4l2驱动程序接收ioctl来控制缩放,而这需要通过串口发送命令? - IndigoFire
感谢这篇精彩的文章!它解释了许多我之前不理解的关于内核和用户空间的事情。 - IndigoFire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接