GNU/Linux >> Linux の 問題 >  >> Linux

Razer BlackWidow からマクロ キーを取得して Linux で動作させる

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]# 
    

    Linux
    1. LinuxでPostgreSQLを使い始める

    2. Linux – Linuxでマシンのハードウェアに関する情報を取得しますか?

    3. Tmuxで256色を機能させるには?

    1. Linux – Wodim –デバイスが機能しないときにCd / dvdドライブの機能を取得しますか?

    2. Linux – Linuxからブートローダーを実行する方法は?

    3. LinuxコマンドラインからOpenofficeマクロを呼び出す方法は?

    1. クリップボードからの Linux イメージ

    2. Linux カーネルの copy_from_user は内部でどのように機能しますか?

    3. Linux にソースから TBB をインストールして動作させる方法