如何编写C程序(在用户空间中)来调用属于内核驱动程序的函数?如果不能直接进行,我该怎么办?
背景:我正在尝试使用我的单板计算机(英特尔NUC DE3815TYBE)的PWM引脚,这样我就可以控制风扇。一个名为pwm_lpss的linux驱动程序允许控制这些引脚(由Intel开发的驱动程序,源代码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 <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程序中调用该函数?我怎么去#including它?或者这是不可能从用户空间做的?
不幸的是,英特尔为如何使用此驱动程序提供了零文档。我以为司机通常将他们的功能映射到一些用户可访问的文件。经过一些挖掘后,我能够找到一些与PWM相关的文件,但我还没有找到一个看起来可以设置PWM占空比/频率的文件。
答案 0 :(得分:5)
这是一个标准的Linux PWM驱动程序,因此无需特殊文档。
检查/sys/class/pwm/
目录。 (/sys
是内核为访问其数据结构而提供的接口。它看起来就像文件系统一样。)你应该有类似/sys/class/pwm/pwmchip0/
的东西。每个这样的目录对应一个PWM芯片。
该目录将包含以下条目。您可能需要超级用户权限才能访问这些权限(因为您不希望每个人都弄乱它们):
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()
成功时,内核已应用该设置。
答案 1 :(得分:1)
一些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 {
....
}