
私はしばらく努力しましたが、Game 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%確信しています。
acファイルに含めようとしましたが、ファイルが欠落しているように見えるため、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.
申し訳ありません。私はCの背景知識のないRubyプログラマーです。
不足している「linux /」ファイルをどのようにインポートし、私のCライブラリで参照しますか?または、シェルからコントローラにどのように書きますか?
答え1
シェルスクリプトの観点から見ると、比較的簡単ですが、送信する正しいコンテンツを知る必要があります。 /dev/hidraw デバイスは「raw」と呼ばれます。それはまさにそれだからです。この記事ずっと前に発見された開発者Fusionと呼ばれるサイト(具体的には「図3」)では、著者は4つのLED(各LED(1つ)と4つの「プレーヤー」コントローラ)のデバイスがオンまたはオフになります。簡単に言えば、彼らは6バイト1-6に対して次のように使用されることを発見しました。
バイト 1: 関係なし - 0x00 を推奨 バイト 2: 関係ありません - 0x00
を 推奨 バイト5:0x00(オフ)または0xFF(オン) - ハンドセット3バイト 6:0x00(オフ)または0xFF(オン) - ハンドセット4
そのため、いくつかの実験を行った後、次のように名前が付けられた、またはシンボリックリンクされた「Buzz」コントローラを備えたudevシステム(?)の場合、/dev/hidraw0
各LEDが順番に点滅することがわかりました。
#!/bin/bash私考える文字列を終了するには、最後のASCII "nul"文字が必要です。あるいは、記事の作成者が6バイトの代わりに7バイトを使用することを隠す言語(.NET / c#)のアーティファクトである可能性があります。その言語は私に完全に見慣れていました。正しい長さの文字列を使用しないと、最後のバイトが無視されることがわかりました。少なくとも最初の文字列が送信された後、文字列は認識されません。これは、「固定報告書の長さ」要件に準拠していると仮定します。遅延=0.1 そして[事実]; echo -e "\x00\x00\x00\x00\x00\x00\x00" > /dev/hidraw0 睡眠${遅延} echo -e "\x00\x00\x00\x00\x00\xff\x00" > /dev/hidraw0 睡眠${遅延} echo -e "\x00\x00\x00\x00\xff\x00\x00" > /dev/hidraw0 睡眠${遅延} echo -e "\x00\x00\x00\xff\x00\x00\x00" > /dev/hidraw0 睡眠${遅延} echo -e "\x00\x00\xff\x00\x00\x00\x00" > /dev/hidraw0 睡眠${遅延} echo -e "\x00\x00\x00\x00\x00\x00\x00" > /dev/hidraw0 睡眠${遅延} 完璧
udevを使用してこれらのデバイスに意味のある名前を付けることで作業をより簡単にしたかったので、/lib/udev/rules.d/10-local.rules
Debian Linuxの「Jessie」PC用のファイルを作成しました(「systemd」の代わりにsysV「init」を使用)。
ACTION!="追加|変更", GOTO="終了" #Sony Buzzコントローラのバズシンボリックリンクに一意の番号を割り当てます。 SUBSYSTEM == "usb", ATTRS{idVendor} == "054c", ATTRS{idProduct} == "1000", PROGRAM == "/sbin/unique_number /dev buzz", SYMLINK+="buzz%c", TAG+= 「バズ」、OPTIONS+=last_rule SUBSYSTEM == "usb", ATTRS{idVendor} == "054c", ATTRS{idProduct} == "0002", PROGRAM == "/sbin/unique_number /dev buzz", SYMLINK+="buzz%c", TAG+= 「バズ」、OPTIONS+=last_rule タグ="終了"
一意の番号を提供します。特に、複数のバズコントローラーを備えたハブに接続し、同時に複数のデバイスを追加または削除する場合は、/sbin/unique_number
SEのどこかからインポートしたものを使用しました。 (有効な著者の表示/著作権を提供するために編集されることを許可します。...):
#!/bin/bash #著作権(C)2015作成者:Stephen Lyons -[Eメール保護] # # Unique_number: このスクリプトは、ファイルに一意のサフィックスを提供するために使用されます。 # 指定されたディレクトリのファイル if [ $# -ne 2 ]; echo "使用法: $0 位置プレフィックス\n\n" >&2 echo "最初に使用されていない整数#サフィックスファイルを探します。" echo "フォームプレフィックス#の場所として指定されたディレクトリに、" echo「そして数字を出力してください」 1番出口 フィリピン諸島 場所="$1" プレフィックス="$2" インデックス=0 while [ -e "/var/lock/unique_number.lock" ]; 睡眠0.1; 完璧 「/var/lock/unique_number.lock」をタップします。 まで[! -e "${位置}/${プレフィックス}${インデックス}"]; ((インデックス++)); 完璧 エコ「$インデックス」 rm "/var/lock/unique_number.lock" 0番出口
しかし、これが私が望む/dev/buzz0、/dev/buzz1、/dev/hidraw0
この組み合わせは、最初のスクリプトの背部に代わるものを提供しません。
答え2
さて、ソースファイルはLinuxドライバのソースに対応します。したがって、モジュールにコンパイルする必要があります。カーネルソースツリーでコンパイルするには、次のmakefileを使用することをお勧めします。
ifneq ($(KERNELRELEASE),)
obj-m := hid-sony.o
else
KDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
endif
これをcソースコードと同じ場所にある「makefile」というファイルにコピーし、「make」コマンドを実行します。通常、パッケージ(debianの場合はlinux-headers-x.yy.zz-your_arch)で利用可能なLinuxカーネルヘッダをインストールする必要があります。これにより、.koファイルが生成され、insmodコマンド(rootが必要)を使用してカーネルにロードできます。
答え3
Sonyドライバをロードした後、ドライバは標準のLEDカーネルインタフェースを提供します。
echo 255 > /sys/class/leds/*buzz1/brightness
echo 0 > /sys/class/leds/*buzz1/brightness