2017-04-04 161 views
-1

我有一个内核驱动程序,它正在从传感器读取数据。 现在我必须编写一个用户空间应用程序,它将调用内核的sensor_read() API并将数据发送到云。将数据从内核驱动程序复制到用户空间驱动程序的最佳方法

如何将内核的sensor_read()调用暴露给用户空间并从用户空间读取此数据?数据大约是10个字节。

+0

有很多方法到达那里。但你甚至没有说你喜欢读什么传感器。如何使用'lm-sensor'?然后你想发送数据到一个完全不同的故事云。共享网关接口(cgi) – suleiman

+0

谢谢suleiman ..我正在使用Accl-Gyro传感器。我会检查lm传感器。云部分已经完成,需要实现暴露的云API。 –

回答

3

我如何可以公开内核的sensor_read()调用用户空间和读取用户空间这个数据?

很可能您应该使用IIO内核框架,因为它专门设计用于编写传感器驱动程序。 IIO为您的驱动程序公开必要的文件(在/sys/bus/iio//dev/iio*中)。你可以read()这些文件,或poll()他们(处理中断)。

官方文档可用here。你也可以使用一些现有的驱动程序作为参考,看看这里:drivers/iio/

在引入IIO框架之前,通常手动为驱动程序提供sysfs文件。所以如果你使用的是足够老的内核,那应该是写驱动程序的方法:手动处理你的总线(如I2C)和sysfs文件。但是,最好的方法是使用新内核和IIO。

我正在使用陀螺仪加速度传感器。 Linux驱动程序将发送类型EV_MSC事件为他们两个

芯片上有多个传感器是不寻常的。在这种情况下,您应该创建两个不同的驱动程序:一个用于加速计,另一个用于陀螺仪。这样你将有两个不同的文件,每个传感器一个文件。

例如,看看它是如何为LSM330DLC芯片(加速度计+陀螺仪)来完成:

两位车手都呼吁从iio_device_register()功能驱动程序的探测功能,它会创建相应的文件(您可以读取/轮询)。详情请参阅documentation

根据我的理解,我将从用户空间打开两个输入设备,然后添加到我们要轮询的FD列表。所以当有新事件发生时,我怎么确定这个事件是来自陀螺仪还是阿贝尔?

如果您想了解如何在用户空间处理两个/dev/input/event*文件,你基本上有两种选择:

  • 使用阻塞I/O:可以读/在不同的线程
  • 轮询他们使用非阻塞I/O的
  • :您可以在同一个线程中打开这些文件为O_NONBLOCKread();如果新数据不可用 - 它将返回-1,并且errno将设置为EAGAIN;你可以做无限循环的读取,例如

This答案包含例如如何处理输入文件中C.而且here你可以看到阻塞/非阻塞I/O。

+0

谢谢Sam ... poll()似乎是很好的方法。但我有一个疑问。基本上我正在使用陀螺仪+加速度传感器。 Linux驱动程序将为它们发送EV_MSC类型的事件。 按照我的理解,我将从用户空间打开两个输入设备,然后添加到我们要轮询的FD列表。所以当有新事件发生时,我怎么确定这个事件是来自陀螺仪还是阿贝尔? –

+0

@SandeepSharma我编辑了我的答案并在那里解答了你的问题。 –

+0

非常感谢这么好的解释...我会检查它...会更新。 –

1

有很多方法从内核空间访问传感器的数据,以用户空间

  1. 检查你使用的传感器的相关的驱动程序。检查它是否支持/提供sysfs支持。
  2. 您可以从/sys/class/接口读取数据。您需要确保将相关参数导出到sysfs。 例如:温度传感器应在sysfs条目中输出温度值(等效系数)。

    例子(下面的例子是只有小说)

    cat /sys/class/hwmon/tempsensor/value

    cat /sys/class/hwmon/tempsensor/min_value

    cat /sys/class/hwmon/tempsensor/max_value

  3. 在一些驱动程序,您可以通过ioctl/read/write API的阅读读/写传感器数据。

相关问题