首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从linux内核模块访问串行端口

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

Stack Overflow用户
提问于 2011-03-21 23:20:30
回答 2查看 11.9K关注 0票数 13

您好,Linux内核驱动大师!

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

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

代码语言:javascript
复制
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);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-07 03:11:36

我推测由于涉及到串口,所以这一定是某种嵌入式系统。毕竟,连串口都没有的个人电脑也不多。我还假设串行端口可以被认为是永久连接,至少从用户的角度来看是这样。如果这一切都是真的,那么你并不是真的想要一个TTY设备。您希望将设备作为私有UART进行访问。

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

我在内核中找不到这样工作的UART驱动程序的好例子,但希望我已经描述了要寻找的东西。从实用而不是技术纯度的角度来看,从内核进行文件I/O可能会更好。

票数 5
EN

Stack Overflow用户

发布于 2011-03-22 16:48:24

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

但是如果你找不到这样做的方法,这个article将向你展示如何在内核空间中进行用户空间调用。

由于您希望访问串行端口,因此您应该具有面向tty调用,例如open:

代码语言:javascript
复制
serial_fd = sys_open("/dev/ttyS0",  O_RDWR | O_NOCTTY | O_NONBLOCK))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5379720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档