将数据从内核驱动程序复制到用户空间驱动程序的最佳方法
我有一个内核驱动程序,它正在从传感器读取数据。 现在我必须编写一个用户空间应用程序,它将调用内核的sensor_read()
API并将数据发送到云。将数据从内核驱动程序复制到用户空间驱动程序的最佳方法
如何将内核的sensor_read()
调用暴露给用户空间并从用户空间读取此数据?数据大约是10个字节。
我如何可以公开内核的
sensor_read()
调用用户空间和读取用户空间这个数据?
很可能您应该使用IIO内核框架,因为它专门设计用于编写传感器驱动程序。 IIO为您的驱动程序公开必要的文件(在/sys/bus/iio/
和/dev/iio*
中)。你可以read()
这些文件,或poll()
他们(处理中断)。
官方文档可用here。你也可以使用一些现有的驱动程序作为参考,看看这里:drivers/iio/。
在引入IIO框架之前,通常手动为驱动程序提供sysfs文件。所以如果你使用的是足够老的内核,那应该是写驱动程序的方法:手动处理你的总线(如I2C)和sysfs文件。但是,最好的方法是使用新内核和IIO。
我正在使用陀螺仪加速度传感器。 Linux驱动程序将发送类型EV_MSC事件为他们两个
芯片上有多个传感器是不寻常的。在这种情况下,您应该创建两个不同的驱动程序:一个用于加速计,另一个用于陀螺仪。这样你将有两个不同的文件,每个传感器一个文件。
例如,看看它是如何为LSM330DLC芯片(加速度计+陀螺仪)来完成:
- 加速驱动程序:drivers/iio/accel/st_accel_core.c
- 陀螺仪驱动程序:drivers/iio/gyro/st_gyro_core.c
两位车手都呼吁从iio_device_register()
功能驱动程序的探测功能,它会创建相应的文件(您可以读取/轮询)。详情请参阅documentation。
根据我的理解,我将从用户空间打开两个输入设备,然后添加到我们要轮询的FD列表。所以当有新事件发生时,我怎么确定这个事件是来自陀螺仪还是阿贝尔?
如果您想了解如何在用户空间处理两个/dev/input/event*
文件,你基本上有两种选择:
- 使用阻塞I/O:可以读/在不同的线程 轮询他们使用非阻塞I/O的
- :您可以在同一个线程中打开这些文件为
O_NONBLOCK
和read()
;如果新数据不可用 - 它将返回-1,并且errno
将设置为EAGAIN
;你可以做无限循环的读取,例如
谢谢Sam ... poll()似乎是很好的方法。但我有一个疑问。基本上我正在使用陀螺仪+加速度传感器。 Linux驱动程序将为它们发送EV_MSC类型的事件。 按照我的理解,我将从用户空间打开两个输入设备,然后添加到我们要轮询的FD列表。所以当有新事件发生时,我怎么确定这个事件是来自陀螺仪还是阿贝尔? –
@SandeepSharma我编辑了我的答案并在那里解答了你的问题。 –
非常感谢这么好的解释...我会检查它...会更新。 –
有很多方法从内核空间访问传感器的数据,以用户空间
- 检查你使用的传感器的相关的驱动程序。检查它是否支持/提供sysfs支持。
-
您可以从
/sys/class/
接口读取数据。您需要确保将相关参数导出到sysfs
。 例如:温度传感器应在sysfs条目中输出温度值(等效系数)。例子(下面的例子是只有小说)
cat /sys/class/hwmon/tempsensor/value
cat /sys/class/hwmon/tempsensor/min_value
cat /sys/class/hwmon/tempsensor/max_value
在一些驱动程序,您可以通过
ioctl/read/write
API的阅读读/写传感器数据。
有很多方法到达那里。但你甚至没有说你喜欢读什么传感器。如何使用'lm-sensor'?然后你想发送数据到一个完全不同的故事云。共享网关接口(cgi) – suleiman
谢谢suleiman ..我正在使用Accl-Gyro传感器。我会检查lm传感器。云部分已经完成,需要实现暴露的云API。 –