簡體   English   中英

如何從用戶空間程序調用Linux內核驅動程序函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM