2016-04-03 74 views
0

如何編寫C程序(在用戶空間中)調用屬於內核驅動程序的函數?如果不可能直接做,我該怎麼辦呢?如何從用戶空間程序調用Linux內核驅動函數?

背景:我正在嘗試使用單板計算機(Intel NUC DE3815TYBE)的PWM引腳,以便我可以控制風扇。稱爲pwm_lpss的Linux驅動程序允許控制這些引腳(由英特爾開發的驅動程序,源代碼爲here)。我已通過使用lsmod命令驗證此驅動程序是否已安裝。這裏是打字modinfo pwm_lpss後的驅動程序信息:

filename:  /lib/modules/3.19.0-25-generic/kernel/drivers/pwm/pwm-lpss.ko 
license:  GPL v2 
author:   Mika Westerberg <[email protected]> 
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佔空比/頻率的文件。

+1

這是一個標準的驅動程序,因此,文檔在內核中已經很長時間了:https://www.kernel.org/doc/Documentation/pwm.txt – 0andriy

回答

4

這是一個標準的Linux PWM驅動程序,所以沒有特殊的文檔是必要的。

檢查/sys/class/pwm/目錄。 (/sys是內核提供訪問其數據結構的接口,它看起來像一個文件系統。)你應該有類似/sys/class/pwm/pwmchip0/的東西。每個這樣的目錄對應於一個PWM芯片。

該目錄將包含以下條目。您可能需要超級用戶權限來訪問這些(因爲你不會希望每個人都惹他們):

  • npwm:閱讀,找出多少PWM通道,該芯片具有。

  • export:寫一個通道號(0到任何最數IN- npwm -1),以使可用的信道從這個sysfs的接口

  • unexport:寫的信道號,以除去該通道從sysfs的接口控制

每個PWM通道出口經由sysfs的界面中使用將顯示爲一個名爲pwmN子目錄,其中N是通道號。在這裏,你可以讀取和寫入條目

  • period:總週期(關+上)在納秒。

  • duty_cycle:納秒時間。必須小於期限。

  • polarity如果芯片支持反轉信號極性,可以在這裏寫入inversed來反轉極性; normal是默認/正常極性。如果啓用,0如果禁用。

在讀取或寫入這些條目時,不需要特殊的鎖定。內核將接收一個write()中的所有數據,並返回一個read()操作中的所有數據。當write()成功時,內核已應用該設置。

+0

謝謝!我知道我錯過了一些東西。我無法找到文檔,因爲我正在搜索「pwm_lpss」,而不是僅僅搜索「linux pwm」。我感到非常愚蠢;我沒有意識到他們正在實施一個標準的驅動程序。 – GordonFreeman

1

some ioctlThe 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 { 
    .... 
} 
+2

錯誤,這個驅動程序,以及PWM框架,有sysfs接口。 – 0andriy

相關問題