我有一個內核驅動程序,它正在從傳感器讀取數據。 現在我必須編寫一個用戶空間應用程序,它將調用內核的sensor_read()
API並將數據發送到雲。將數據從內核驅動程序複製到用戶空間驅動程序的最佳方法
如何將內核的sensor_read()
調用暴露給用戶空間並從用戶空間讀取此數據?數據大約是10個字節。
我有一個內核驅動程序,它正在從傳感器讀取數據。 現在我必須編寫一個用戶空間應用程序,它將調用內核的sensor_read()
API並將數據發送到雲。將數據從內核驅動程序複製到用戶空間驅動程序的最佳方法
如何將內核的sensor_read()
調用暴露給用戶空間並從用戶空間讀取此數據?數據大約是10個字節。
可以使用IOCTL(ioctl/read)調用從用戶空間訪問內核函數。
我如何可以公開內核的
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*
文件,你基本上有兩種選擇:
O_NONBLOCK
和read()
;如果新數據不可用 - 它將返回-1,並且errno
將設置爲EAGAIN
;你可以做無限循環的讀取,例如謝謝Sam ... poll()似乎是很好的方法。但我有一個疑問。基本上我正在使用陀螺儀+加速度傳感器。 Linux驅動程序將爲它們發送EV_MSC類型的事件。 按照我的理解,我將從用戶空間打開兩個輸入設備,然後添加到我們要輪詢的FD列表。所以當有新事件發生時,我怎麼確定這個事件是來自陀螺儀還是阿貝爾? –
@SandeepSharma我編輯了我的答案並在那裏解答了你的問題。 –
非常感謝這麼好的解釋...我會檢查它...會更新。 –
有很多方法從內核空間訪問傳感器的數據,以用戶空間
您可以從/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。 –