如何从 Linux 存储库调用此方法?

How do I call this method from the Linux repo?

一段时间以来,我一直在努力寻找一种方法来控制游戏 Buzz(有线,来自 Playstation 2)中的一组控制器上的灯。您可以在 Stack Overflow

上的问题中看到我的一些失败尝试

所以我转而使用更基本的 linux 发送消息的方法,但通过将数据管道传输到 /dev/hidraw0 也失败了。

然后我在 linux 存储库中发现了一个文件,它专门提到了蜂鸣器控制器 (/linux/drivers/hid/hid-sony.c),以及它们有灯的事实。它甚至有一个名为 buzz_set_leds 的方法(第 1512 行):

static void buzz_set_leds(struct sony_sc *sc)

所以我 100% 确定这是我正在尝试做的代码。

我尝试过将其包含在 c 文件中,但无法包含 hid-sony,因为我似乎缺少这些文件。

#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/leds.h>
#include <linux/power_supply.h>
#include <linux/spinlock.h>
#include <linux/list.h>
#include <linux/idr.h>
#include <linux/input/mt.h>

#include "hid-ids.h"

在编译中,我得到这个错误:

hid-sony.c:29:26: fatal error: linux/device.h: No such file or directory
 #include <linux/device.h>
                          ^
compilation terminated.

抱歉,我是一名 Ruby 程序员,没有 C 语言背景。

如何获取这些丢失的 'linux/' 文件并从我的 c 库中引用它们?

答案是您不能单独编译该文件...它应该与整个 Linux 内核一起构建。该代码仅供内核 运行 使用,而不是用户程序。您希望该代码 运行,但您需要找出调用它的正确方法(通过系统调用或其他方式)。

tl;dr:你找错地方了,你不需要内核代码

非常感谢@brian-malehorn、@alan-au 和@colonel-thirty-two。我自己回答这个问题,因为 none 他们告诉了我确切的答案,但他们引导我找到了答案。

这个具体问题的答案是 "don't"。

根本问题是"how do I turn these lights on in Linux?",我就是这样做的。

在/sys/class/leds中,当控制器插入时,里面有这4个文件夹(不是实际文件夹,而是在文件系统中表示为文件夹)。

0003:054C:0002.0007::buzz1
0003:054C:0002.0007::buzz2
0003:054C:0002.0007::buzz3
0003:054C:0002.0007::buzz4

中间的2个十六进制数字是来自lsusb的设备描述符的元素

Bus 002 Device 011: ID 054c:0002 Sony Corp. Standard HUB

最后一个数字似乎是 USB 设备和实例插入时的标识符。如果我拔下此设备并重新插入,最后一个数字会递增。

我现在无法弄清楚第一个是什么,但从理论上讲,它可能是 HID 接口 class。这是来自 lsusb -vd 054c:0002

bInterfaceClass         3 Human Interface Device

这些文件夹中的每一个都包含一个 max_brightness 'file',其中包含数字 1,以及一个可用于控制它的亮度 'file'。

我不得不打开这些的权限(这有点笨拙,但是做到了):

cd /sys/class/leds
sudo chmod 777 */brightness

然后我可以像这样打开 LED:

echo 1 > 0003\:054C\:0002.0007\:\:buzz1/brightness

然后像这样关闭 LED:

echo 0 > 0003\:054C\:0002.0007\:\:buzz1/brightness

我也可以绕过所有那些复杂的数字变化和转义冒号:

echo 1 > *buzz1/brightness