Gor*_*man 1 c linux linux-kernel
如何在用户空间中编写C程序来调用内核驱动程序中的函数?如果无法直接进行操作,我该怎么办?
上下文:我正在尝试使用单板计算机(Intel 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
Run Code Online (Sandbox Code Playgroud)
所以我知道驱动程序模块(pwm-lpss.ko文件)在哪里,并且我知道源代码中包含一个pwm_lpss_config()我想使用的函数。如何从用户空间C程序调用该函数?我将如何处理#包括它?还是无法从用户空间做到这一点?
不幸的是,英特尔提供了有关如何使用此驱动程序的零文档。我认为驱动程序通常会将其功能映射到一些用户可访问的文件。经过一些挖掘,我能够找到一些与PWM相关的文件,但是却找不到一个可以设置PWM占空比/频率的文件。
它是标准的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()成功时,内核已应用该设置。