2017-04-04 121 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的閱讀讀/寫傳感器數據。

相關問題