2016-04-03 77 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

相关问题