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

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

你好 Linux 内核驱动大师!

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

据我所知,从内核驱动程序访问文件是一个很大的禁忌,但它可以做到。因此,我目前正在使用以下代码片段,但感觉就像是 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);

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

最佳答案

我想既然涉及到串口,那一定是某种嵌入式系统。毕竟,没有多少PC甚至有串口。我还假设串行端口可以被认为是一个永久连接,至少从用户的角度来看是这样。如果这一切都是真的,那么你真的不需要 TTY 设备。您希望将设备作为私有(private) UART 访问。

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

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

关于linux-kernel - 从 linux 内核模块访问串行端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5379720/

相关文章:

linux-kernel - 从 FIQ 中断处理程序访问内核驱动程序数据失败

为两个 SC2681 DUART 配置内核驱动程序

linux - 在 Linux 的系统调用上下文中,EAX 寄存器有什么用?

更改内核函数指针的地址

c++ - 使用 win32 API 写入串行端口 - 端口不会打开,直到我在其他地方打开它

java - 如何删除 "Context.USB_SERVICE"处的错误(Eclipse -> Android)

python - 杀死引发设备或资源繁忙的进程 : '/dev/ttyUSB0' ?

Python 和 UIO 设备 : Why does mmap. read() 工作而 os.read() 失败?

linux-kernel - 等待队列和竞争条件

linux - 查找正在运行进程的处理器 ID [通过类似于 top 的命令/界面]