[英]How to call Linux kernel driver functions from a userspace program?
如何在用戶空間中編寫C程序來調用內核驅動程序中的函數? 如果無法直接進行操作,我該怎么辦?
上下文:我正在嘗試使用單板計算機(英特爾NUC DE3815TYBE)的PWM引腳,以便可以控制風扇。 名為pwm_lpss的linux驅動程序允許控制這些引腳(英特爾開發的驅動程序,源代碼在這里 )。 我已驗證使用lsmod
命令安裝了此驅動程序。 這是輸入modinfo pwm_lpss
后的驅動程序信息:
filename: /lib/modules/3.19.0-25-generic/kernel/drivers/pwm/pwm-lpss.ko
license: GPL v2
author: Mika Westerberg <mika.westerberg@linux.intel.com>
description: PWM driver for Intel LPSS
srcversion: 44AA14AF3E2F96C813770A8
depends:
intree: Y
vermagic: 3.19.0-25-generic SMP mod_unload modversions
signer: Magrathea: Glacier signing key
sig_key: 6A:AA:11:D1:8C:2D:3A:40:B1:B4:DB:E5:BF:8A:D6:56:DD:F5:18:38
sig_hashalgo: sha512
所以我知道驅動程序模塊在哪里( pwm-lpss.ko
文件),並且我有我知道要使用的源代碼,其中包含一個稱為pwm_lpss_config()
的函數。 如何從用戶空間C程序調用該函數? 我將如何處理#包括它? 還是無法從用戶空間做到這一點?
不幸的是,英特爾提供了有關如何使用此驅動程序的零文檔。 我認為驅動程序通常會將其功能映射到一些用戶可訪問的文件。 經過一些挖掘,我能夠找到一些與PWM相關的文件,但是我找不到一個看起來像它可以設置PWM占空比/頻率的文件。
它是標准的Linux PWM驅動程序,因此不需要特殊的文檔。
檢查/sys/class/pwm/
目錄。 ( /sys
是內核提供的用於訪問其數據結構的接口。它的外觀和行為類似於文件系統。)您應該具有/sys/class/pwm/pwmchip0/
東西。 每個這樣的目錄都對應一個PWM芯片。
該目錄將包含以下條目。 您可能需要超級用戶特權才能訪問這些特權(因為您不希望每個人都弄亂他們):
npwm
:閱讀npwm
以了解該芯片有多少個PWM通道。
export
:寫入通道號(0到npwm
-1中的任何數字),以使該通道可通過此sysfs接口使用
unexport
:編寫通道號以從sysfs接口控件中刪除該通道
通過sysfs接口導出的每個要使用的PWM通道將顯示為名為pwmN
的子目錄,其中N
是通道號。 在這里,您可以讀寫條目
period
:總時間(關閉+開啟),以納秒為單位。
duty_cycle
:開啟時間(以納秒為單位)。 必須少於期限。
polarity
:如果芯片支持反轉信號的極性,你可以寫inversed
這里反轉極性; normal
是默認/正常極性。
enable
:如果啟用,則為1
如果禁用,則為0
。
在讀取或寫入這些條目時,不需要特殊的鎖定。 內核將在一個write()
接收所有數據,並在一個read()
操作中返回所有數據。 當write()
成功時,內核已應用該設置。
一些ioctl
? The ioctl() function manipulates the underlying device parameters of special files.
沿線
fd = open("/dev/pwm0", O_RDONLY); // put whatever device you've got
if (ioctl(fd, STATUSGET, &status) == -1) // magic constant should be set
....
} else {
....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.