M1-M5 は実際には通常のキーです。キーを押すとスキャンコードが生成されるようになる前に、それらを有効にする必要があります。 tux_mark_5 は、正しい SET_REPORT メッセージを Razer キーボードに送信してこれらのキーを有効にする小さな Haskell プログラムを開発し、ex-parrot は同じコードを Python に移植しました。
Arch Linux システムでは、Python ポートがパッケージ化されており、https://aur.archlinux.org/packages.php?ID=60518 から入手できます。
Debian または Ubuntu システムでは、コードの Python ポートを設定するのは比較的簡単です。 PyUSB と libusb を (ルートとして) インストールする必要があります:
aptitude install python-usb
次に blackwidow_enable.py
を取得します http://finch.am/projects/blackwidow/ からファイルを作成し、それを実行します (root としても):
chmod +x blackwidow_enable.py
./blackwidow_enable.py
これにより、キーボードが取り外されるか、マシンが再起動されるまで、キーが有効になります。この永続的な呼び出しを行うには、最も好みのスタートアップ スクリプトのスタイルからスクリプトを呼び出します。 Debian でこれを設定する方法については、Debian のドキュメントを参照してください。
tux_mark_5 の Haskell コードを使用するには、Haskell をインストールして自分でコードをコンパイルする必要があります。これらの手順は、Debian ライクなシステム (Ubuntu を含む) 向けです。
<オール>GHC、libusb-1.0-0-dev、cabal を (root として) インストールします:
aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
パッケージのリストを取得します:
cabal update
Haskell 用の USB バインディングをインストールします (root は必要ありません):
cabal install usb
ユーティリティをダウンロード:
git clone git://github.com/tuxmark5/EnableRazer.git
ユーティリティをビルドします:
cabal configure
cabal build
ユーティリティを実行します (root としても):
./dist/build/EnableRazer/EnableRazer
この後、EnableRazer バイナリを好きな場所にコピーして、起動時に実行できます。
実行直後、X サーバーは M1 を XF86Tools、M2 を XF86Launch5、M3 を XF86Launch6、M4 を XF86Launch7、M5 を XF86Launch8 として認識します。 FN のイベントも発行されます。
これらのキーは、xbindkeys または KDE のシステム設定内で任意のアクションにバインドできます。
お使いのキーボードは異なる場合があるため、Main.hs の 64 行目の製品 ID を変更する必要がある場合があります:
withDevice 0x1532 0x<HERE GOES YOUR KEYBOARD's PRODUCT ID> $ \dev -> do
Razer は現在、すべてのユーザーにクラウドベースの Synapse 2 コンフィギュレーターを強制しているようで、ファームウェアをバージョン 2.* にアップグレードしています。ファームウェアをアップグレードすると、元に戻すことはできません (古いファームウェアでフラッシュしようとすると、キーボードは完全にブリックされます)。
tux_mark_5 の回答にある Haskell プログラムの「マジック バイト」は、最新のファームウェアでは機能しません。代わりに、ドライバーは初期化シーケンス中にこれらのバイトを送信します:‘0200 0403’.これらはマクロ キーを有効にしますが、キーボードは標準の HID プロトコルの代わりに 16 バイトのパケットを送信する独特のモードに入ります (おそらく同時に押すことができるキーの数を増やすため)。 Linux HID システムはこれに完全に対応できず、ほとんどのキーは期待どおりに機能しますが、マクロ キーは認識されないままです。HID ドライバーは、キーが押されたときに入力レイヤーにデータを供給しません。
キーボードをレガシー モード (マクロ キーが XF86Launch* キーコードを送信し、FN キーがキーコード 202 を送信するモード) に入るようにするには、次のバイトを送信します:0200 0402.
完全なパケットは次のようになります:
00000000 00020004 02000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 0400
これは、タスクを実行するために難解ではない Python 3 で作成した、非常に大雑把で汚いプログラムです。おまけとして、blackwidow.bwcmd() の Razer コントロール パケットと Razer ロゴ LED コマンドを生成するコードに注意してください :)
#!/usr/bin/python3
import usb
import sys
VENDOR_ID = 0x1532 # Razer
PRODUCT_ID = 0x010e # BlackWidow / BlackWidow Ultimate
USB_REQUEST_TYPE = 0x21 # Host To Device | Class | Interface
USB_REQUEST = 0x09 # SET_REPORT
USB_VALUE = 0x0300
USB_INDEX = 0x2
USB_INTERFACE = 2
LOG = sys.stderr.write
class blackwidow(object):
kernel_driver_detached = False
def __init__(self):
self.device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
if self.device is None:
raise ValueError("Device {}:{} not found\n".format(VENDOR_ID, PRODUCT_ID))
else:
LOG("Found device {}:{}\n".format(VENDOR_ID, PRODUCT_ID))
if self.device.is_kernel_driver_active(USB_INTERFACE):
LOG("Kernel driver active. Detaching it.\n")
self.device.detach_kernel_driver(USB_INTERFACE)
self.kernel_driver_detached = True
LOG("Claiming interface\n")
usb.util.claim_interface(self.device, USB_INTERFACE)
def __del__(self):
LOG("Releasing claimed interface\n")
usb.util.release_interface(self.device, USB_INTERFACE)
if self.kernel_driver_detached:
LOG("Reattaching the kernel driver\n")
self.device.attach_kernel_driver(USB_INTERFACE)
LOG("Done.\n")
def bwcmd(self, c):
from functools import reduce
c1 = bytes.fromhex(c)
c2 = [ reduce(int.__xor__, c1) ]
b = [0] * 90
b[5: 5+len(c1)] = c1
b[-2: -1] = c2
return bytes(b)
def send(self, c):
def _send(msg):
USB_BUFFER = self.bwcmd(msg)
result = 0
try:
result = self.device.ctrl_transfer(USB_REQUEST_TYPE, USB_REQUEST, wValue=USB_VALUE, wIndex=USB_INDEX, data_or_wLength=USB_BUFFER)
except:
sys.stderr.write("Could not send data.\n")
if result == len(USB_BUFFER):
LOG("Data sent successfully.\n")
return result
if isinstance(c, list):
#import time
for i in c:
print(' >> {}\n'.format(i))
_send(i)
#time.sleep(.05)
elif isinstance(c, str):
_send(c)
###############################################################################
def main():
init_new = '0200 0403'
init_old = '0200 0402'
pulsate = '0303 0201 0402'
bright = '0303 0301 04ff'
normal = '0303 0301 04a8'
dim = '0303 0301 0454'
off = '0303 0301 0400'
bw = blackwidow()
bw.send(init_old)
if __name__ == '__main__':
main()
おそらく、これは問題に光を当てるかもしれません (ショーキーのマンページから):
2.6 カーネルでは、raw モードまたはスキャンコード モードはまったく raw ではありません。スキャンコードは最初にキーコードに変換され、スキャンコードが必要な場合はキーコードが変換されます。さまざまな変換が必要であり、最終結果がキーボード ハードウェアが送信したものと一致するという保証はまったくありません。したがって、さまざまなキーから送信されたスキャン コードを知りたい場合は、2.4 カーネルを起動することをお勧めします。 2.6.9 以降、実際のスキャン コードを返すように 2.6 カーネルに指示する起動オプション atkbd.softraw=0 もあります。
raw スキャン コードは、AT および PS/2 キーボードでのみ使用できます。さらに、atkbd.softraw=0 カーネル パラメータが使用されない限り、それらは無効になります。生のスキャン コードが利用できない場合、カーネルは固定の組み込みテーブルを使用して、キーコードからスキャン コードを生成します。したがって、setkeycodes(8) は、スキャン コード ダンプ モードでの showkey の出力に影響を与える可能性があります。
この起動オプションが設定された後、showkey がマクロ キーで何かをダンプするかどうかを確認しようとしています。
編集:再起動後、成功しませんでしたが、USBデバイス自体から生の入力をキャプチャすることを検討していました。興味深いことに、次のことに注意しました (Razer Diamondback と BlackWidow を持っています):
[[email protected] by-id]# pwd
/dev/input/by-id
[[email protected] by-id]# ls
usb-Razer_Razer_BlackWidow_Ultimate-event-kbd usb-Razer_Razer_Diamondback_Optical_Mouse-event-mouse
usb-Razer_Razer_BlackWidow_Ultimate-event-mouse usb-Razer_Razer_Diamondback_Optical_Mouse-mouse
usb-Razer_Razer_BlackWidow_Ultimate-mouse
[[email protected] by-id]#
ただし、dd を使用して未加工の入力をキャプチャすると、ダイヤモンドバック マウスと event-kbd デバイスの両方で機能しますが、BlackWidow マウス デバイスでは機能しません。
インストールされているドライバーによって何らかの形でアクティブ化されるまで、おそらく出力を生成しないと思います。ただし、Linux USB についてはよく知らないので、これが理にかなっているのかどうかさえわかりません。おそらく、最初にバインドする必要がありますか?
/proc/bus/input/devices
には 3 つのブラック ウィドウ デバイスがすべて記載されています。 、しかし、それらは lsusb
に列挙されていないようです または /proc/bus/usb/devices
.これらのデバイスにアクセスして、何らかの方法でそれらをバインドまたはインターフェースしようとする方法がわかりません.
event4
実際のキーボードである event6 にマクロ キーが対応しているように見えますが、まだそれらからの入力をキャプチャできません。お役に立てば幸いです。
[[email protected] input]# ls
devices handlers
[[email protected] input]# cat handlers
N: Number=0 Name=kbd
N: Number=1 Name=mousedev Minor=32
N: Number=2 Name=evdev Minor=64
N: Number=3 Name=rfkill
[[email protected] input]# pwd
/proc/bus/input
[[email protected] input]# cat devices
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0
U: Uniq=
H: Handlers=kbd event0
B: EV=3
B: KEY=10000000000000 0
I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1
U: Uniq=
H: Handlers=kbd event1
B: EV=3
B: KEY=10000000000000 0
I: Bus=0017 Vendor=0001 Product=0001 Version=0100
N: Name="Macintosh mouse button emulation"
P: Phys=
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=mouse0 event2
B: EV=7
B: KEY=70000 0 0 0 0
B: REL=3
I: Bus=0003 Vendor=1532 Product=010d Version=0111
N: Name="Razer Razer BlackWidow Ultimate"
P: Phys=usb-0000:00:12.1-3/input0
S: Sysfs=/devices/pci0000:00/0000:00:12.1/usb4/4-3/4-3:1.0/input/input4
U: Uniq=
H: Handlers=kbd event4
B: EV=120013
B: KEY=1000000000007 ff9f207ac14057ff febeffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7
I: Bus=0003 Vendor=1532 Product=010d Version=0111
N: Name="Razer Razer BlackWidow Ultimate"
P: Phys=usb-0000:00:12.1-3/input1
S: Sysfs=/devices/pci0000:00/0000:00:12.1/usb4/4-3/4-3:1.1/input/input5
U: Uniq=
H: Handlers=kbd event5
B: EV=1f
B: KEY=837fff002c3027 bf00444400000000 1 c040a27c000 267bfad941dfed 9e000000000000 0
B: REL=40
B: ABS=100000000
B: MSC=10
I: Bus=0003 Vendor=1532 Product=010d Version=0111
N: Name="Razer Razer BlackWidow Ultimate"
P: Phys=usb-0000:00:12.1-3/input2
S: Sysfs=/devices/pci0000:00/0000:00:12.1/usb4/4-3/4-3:1.2/input/input6
U: Uniq=
H: Handlers=mouse2 event6
B: EV=17
B: KEY=70000 0 0 0 0
B: REL=103
B: MSC=10
I: Bus=0003 Vendor=1532 Product=0002 Version=0110
N: Name="Razer Razer Diamondback Optical Mouse"
P: Phys=usb-0000:00:12.1-2/input0
S: Sysfs=/devices/pci0000:00/0000:00:12.1/usb4/4-2/4-2:1.0/input/input9
U: Uniq=
H: Handlers=mouse1 event3
B: EV=17
B: KEY=7f0000 0 0 0 0
B: REL=103
B: MSC=10
[[email protected] input]#