Mendapatkan kunci makro dari Razer BlackWidow untuk bekerja di Linux


49

Saya mengambil Razer BlackWidow Ultimate yang memiliki kunci tambahan untuk makro yang diset menggunakan alat yang diinstal pada Windows . Saya berasumsi bahwa ini bukan beberapa kunci joojoo fancypants dan harus memancarkan scancode seperti kunci lainnya.

Pertama, apakah ada cara standar untuk memeriksa scancode ini di Linux? Kedua, bagaimana cara mengatur kunci ini untuk melakukan hal-hal di command line dan setup Linux berbasis X? Instalasi Linux saya saat ini adalah Xubuntu 10.10, tetapi saya akan beralih ke Kubuntu setelah saya menyelesaikan beberapa hal. Idealnya jawabannya harus umum dan luas untuk seluruh sistem.

Hal yang saya coba sejauh ini:

Hal-hal yang perlu saya coba

  • snoopy pro + reverse engineering (oh sayang)

  • Wireshark - persiapan awal sepertinya mengindikasikan tidak ada scancode yang dipancarkan ketika apa yang saya pikirkan adalah keyboard dimonitor dan tombol ditekan. Mungkin menunjukkan kunci tambahan adalah perangkat yang terpisah atau perlu diinisialisasi.

  • Perlu referensi silang dengan output lsusb dari Linux, dalam tiga skenario: standalone, diteruskan ke Windows VM tanpa driver diinstal, dan sama dengan.

  • LSUSB hanya mendeteksi satu perangkat pada instalasi Linux mandiri

  • Mungkin berguna untuk memeriksa apakah tikus menggunakan driver Razer Synapse yang sama, karena itu berarti beberapa variasi razercfg mungkin bekerja (tidak terdeteksi, hanya tampaknya bekerja untuk tikus)

Hal-hal yang saya kerjakan:

  • Dalam sistem Windows dengan driver, keyboard dilihat sebagai keyboard dan alat penunjuk. Perangkat penunjuk menggunakan - selain driver mouse standar rawa Anda - driver untuk sesuatu yang disebut Razer Synapse.

  • Driver mouse terlihat di Linux di bawah evdevdan lsusbjuga

  • Perangkat tunggal di bawah OS X tampaknya, meskipun saya belum mencoba yang lsusbsetara pada itu

  • Keyboard beralih ke mode cahaya latar berdenyut dalam OS X saat inisialisasi dengan driver. Ini mungkin harus menunjukkan bahwa ada beberapa urutan inisialisasi yang dikirim ke keyboard saat aktivasi.

  • Mereka, pada kenyataannya, kunci joojoo fancypants.

Perluas sedikit pertanyaan ini:

Saya memiliki akses ke sistem Windows jadi jika saya perlu menggunakan alat apa pun untuk membantu menjawab pertanyaan, tidak apa-apa. Saya juga dapat mencobanya pada sistem dengan dan tanpa utilitas konfigurasi. Hasil akhir yang diharapkan masih membuat kunci tersebut dapat digunakan di Linux.

Saya juga menyadari ini adalah keluarga perangkat keras yang sangat spesifik. Saya akan bersedia untuk menguji apa pun yang masuk akal pada sistem Linux jika saya memiliki instruksi rinci - ini harus membuka pertanyaan kepada orang-orang yang memiliki keterampilan Linux, tetapi tidak memiliki akses ke keyboard ini.

Hasil akhir minimum yang saya butuhkan:

Saya perlu kunci-kunci ini terdeteksi, dan dapat digunakan dengan cara apa pun pada varian Ubuntu mainstream grafis saat ini, dan tentu saja harus bekerja dengan keyboard saya. Cookie virtual dan alat peraga gila jika itu adalah sesuatu yang dikemas dengan baik dan dapat digunakan oleh rata-rata pengguna.

Saya akan memerlukan kode dikompilasi yang akan bekerja pada sistem saya, atau sumber yang saya dapat mengkompilasi (dengan petunjuk jika itu lebih kompleks dari ./configure, make, make install) jika perangkat lunak tambahan tidak pada repositori Ubuntu untuk LTS saat ini atau rilis desktop standar pada saat jawabannya. Saya juga akan memerlukan informasi yang cukup untuk ditiru, dan berhasil menggunakan kunci pada sistem saya sendiri.


tolong perbarui dengan solusi apa pun, saya ingin mencapai hal yang sama!
Jonathan Day

Saya benar-benar tidak punya waktu untuk mengerjakannya akhir-akhir ini, tetapi saya akan memperbarui pertanyaan ini dengan apa pun yang telah saya lakukan, sampai saya mendapatkan jawaban.
Journeyman Geek

Mungkin edit untuk menyebutkan 500 rep dalam font besar? Kalau tidak, proklamasi itu tidak masuk akal (mengingat hadiah 50 rep terdaftar dengan sistem)
Daniel Beck

Apakah ini masih bekerja untuk Anda? (Saya sedang berbicara tentang firmware terbaru yang disebutkan di bawah oleh Sergey)
Adonis K. Kakoulidis

Saya belum mengujinya, saya khawatir, saya bermaksud mencoba solusi sergey untuk melihat apakah itu berhasil, tetapi saya sudah menjalankan windows sebagian besar beberapa bulan terakhir untuk tugas sekolah. Jika ya, saya akan memposting komentar untuk efek itu
Journeyman Geek

Jawaban:


44

M1-M5 sebenarnya adalah kunci biasa - mereka hanya perlu diaktifkan secara khusus sebelum menekannya akan menghasilkan skancode. tux_mark_5 mengembangkan program Haskell kecil yang mengirimkan pesan SET_REPORT yang benar ke keyboard Razer untuk mengaktifkan kunci-kunci ini, dan ex-parrot mem-porting kode yang sama ke Python.

Pada sistem Arch Linux, port Python telah dipaket dan tersedia dari https://aur.archlinux.org/packages.php?ID=60518 .

Pada sistem Debian atau Ubuntu, pengaturan port kode Python relatif mudah. Anda perlu menginstal PyUSB dan libusb (sebagai root):

    aptitude install python-usb

Kemudian ambil blackwidow_enable.pyfile dari http://finch.am/projects/blackwidow/ dan jalankan (juga sebagai root):

    chmod +x blackwidow_enable.py
    ./blackwidow_enable.py

Ini akan mengaktifkan tombol sampai keyboard dicabut atau mesin di-boot ulang. Untuk membuat skrip panggilan permanen ini dari gaya skrip startup apa pun yang paling Anda sukai. Untuk instruksi tentang cara mengatur ini di Debian lihat dokumentasi Debian .

Untuk menggunakan kode Haskell tux_mark_5 Anda harus menginstal Haskell dan mengkompilasi kode sendiri. Instruksi ini untuk sistem seperti-Debian (termasuk Ubuntu).

  1. Instal GHC, libusb-1.0-0-dev dan komplotan rahasia (sebagai root):

    aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
    
  2. Ambil daftar paket:

    cabal update
    
  3. Instal binding USB untuk Haskell (tidak perlu root):

    cabal install usb
    
  4. Unduh utilitas:

    git clone git://github.com/tuxmark5/EnableRazer.git
    
  5. Bangun utilitas:

    cabal configure
    cabal build
    
  6. Jalankan utilitas (juga sebagai root):

    ./dist/build/EnableRazer/EnableRazer
    

Setelah ini, Anda dapat menyalin biner EnableRazer di mana pun Anda inginkan dan menjalankannya saat startup.

Segera setelah eksekusi, X server akan melihat M1 sebagai XF86Tools, M2 sebagai XF86Launch5, M3 sebagai XF86Launch6, M4 sebagai XF86Launch7 dan M5 sebagai XF86Launch8. Acara untuk FN juga dipancarkan.

Kunci-kunci ini dapat diikat dalam xbindkeys atau pengaturan sistem KDE untuk tindakan sewenang-wenang.

Karena keyboard Anda mungkin berbeda, Anda mungkin perlu mengubah ID produk di baris Main.hs 64:

withDevice 0x1532 0x<HERE GOES YOUR KEYBOARD's PRODUCT ID> $ \dev -> do

Ini bekerja, bagus. Anda akan mendapatkan 500 rep dalam satu atau dua hari, ketika sistem memungkinkan saya. Saya telah mengambil kebebasan untuk menambahkan pkg-config, yang diperlukan untuk menginstal prasyarat dari paket usb haskell ke daftar prasyarat. Perangkat lunak ini bekerja tanpa modifikasi apa pun pada blackwidow ultimate standar saya, dengan ID produk 1532: 010d menurut lsusb. Kunci terdeteksi pada evtest dan tampaknya dapat digunakan, jadi ini telah memenuhi persyaratan pertanyaan dengan sempurna.
Journeyman Geek

selain itu, kde dosen't memiliki opsi pengikatan kunci tampaknya, xbindkeys tampaknya bekerja dengan baik
Journeyman Geek

dengan ID 10e berfungsi dengan blackwidow standar saya (non-ultimate). Saya sarankan untuk menambahkan aturan udev, sehingga ia mulai secara otomatis, tanpa masalah, misalnya membuat file 99-enable-razer-keyboard.rules int /etc/udev/rules.d dengan SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010e", RUN+="/root/EnableRazer"di dalamnya (di sini Anda mungkin harus memodifikasi jalan dan id lagi)
flolo

Rupanya utilitas yang saya tulis juga berfungsi dengan Razer Anansi. Berikut adalah posting blog seseorang yang melakukan ini: norgelinux.blogspot.com/2012/02/razer-anasi-on-arch-linux.html
tux_mark_5

1
Saya memiliki Razer BlackWidow 2013 (bukan yang utama), ketika saya menjalankan skrip blackwidow_enable.py (dengan dan tanpa root), saya mendapatkan pesan "Blackwidow not found.". Bisakah Anda membantu saya men-debug ini? Saya di UbuntuGnome 13.04. Sepertinya Product_ID berbeda dan setelah mengubah ID produk, saya sekarang mendapatkan kesalahan ini:Could not select configuration endpoint.
Adonis K. Kakoulidis

22

Razer tampaknya memaksa konfigurator berbasis cloud 2 mereka di semua pengguna saat ini, dengan disertai peningkatan firmware ke versi 2. *. Setelah Anda memutakhirkan firmware, Anda tidak dapat kembali (keyboard sepenuhnya tertutup jika Anda mencoba untuk mem-flashnya dengan firmware yang lebih lama).

'Bytes ajaib' dari program Haskell dalam jawaban tux_mark_5 tidak akan berfungsi dengan firmware terbaru. Sebagai gantinya, driver mengirim byte ini selama urutan inisialisasi: '0200 0403'. Ini memungkinkan tombol makro, tetapi keyboard memasuki mode aneh di mana alih-alih protokol HID standar mengirimkan paket 16-byte (mungkin untuk menambah jumlah tombol yang dapat ditekan secara bersamaan). Sistem Linux HID tidak dapat mengatasi hal ini, dan sementara sebagian besar tombol berfungsi seperti yang diharapkan, kunci makro tetap tidak dikenali: driver HID tidak memberi makan data apa pun ke lapisan input saat ditekan.

Untuk membuat keyboard Anda memasuki mode lama (di mana kunci makro mengirim kode kunci XF86Launch *, dan tombol FN mengirim kode kunci 202), kirim byte ini: 0200 0402.

Paket lengkapnya adalah:

00000000 00020004 02000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 0400

Berikut ini adalah program yang sangat kasar dan kotor yang saya tulis dengan Python 3 yang kurang esoterik untuk melakukan tugas tersebut. Catat kode untuk menghasilkan paket kontrol Razer di blackwidow.bwcmd () dan perintah LED logo Razer sebagai bonus :)

#!/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()

keyboard saya ditingkatkan dan saya belum mencobanya. Saya akan mencobanya ketika saya memiliki sistem linux yang tepat lagi. Sayangnya saya tidak bisa memberikan hadiah lain untuk ini - sebagian karena cara kerja sistem hadiah. Saya mungkin akan mengalihkan jawaban yang benar kepada Anda jika itu benar.
Journeyman Geek

rupanya modul usb hilang pada sistem saya jadi ini tidak bekerja: /
Journeyman Geek

Modul usb mungkin dalam paket pyusb (atau python-usb atau yang serupa, tergantung distro).
Sergey

2
Sergey terima kasih banyak, ini berfungsi bahkan dengan Razer BlackWidow 2013 yang lebih baru dengan PRODUCT_ID = 0x011b. Saya belum mencoba untuk mengatur makro tapi saya melihat peristiwa datang dari / dev / input / by-id / usb-Razer_Razer_BlackWidow_2013-event-kbd dan juga di xev :).
binary_runner

Terima kasih, ini luar biasa. Saya menggunakannya untuk beberapa tahun sekarang tanpa masalah (akhirnya mendapat reputasi untuk mengomentari :)). Satu komentar pada pyusb: Karena Ubuntu masih tidak mengirimkan pyusb untuk python 3, saya harus menginstalnya secara manual dari sumber menggunakansudo python3 setup.py install
luator

8

Mungkin ini bisa menjelaskan masalah ini (dari halaman showkey):

Dalam 2,6 kernel raw mode, atau mode scancode, tidak terlalu mentah sama sekali. Kode pindai pertama-tama diterjemahkan ke kode kunci, dan ketika scancode diinginkan, kode kunci diterjemahkan kembali. Berbagai transformasi dilibatkan, dan tidak ada jaminan sama sekali bahwa hasil akhir sesuai dengan apa yang dikirim perangkat keras keyboard. Jadi, jika Anda ingin mengetahui kode pindaian yang dikirim oleh berbagai tombol, lebih baik boot kernel 2.4. Sejak 2.6.9 ada juga opsi boot atkbd.softraw = 0 yang memberitahu kernel 2.6 untuk mengembalikan kode pindaian yang sebenarnya.

Kode pindaian mentah hanya tersedia pada keyboard AT dan PS / 2, dan itupun dinonaktifkan kecuali atkbd.softraw = 0 parameter kernel digunakan. Ketika kode pindaian mentah tidak tersedia, kernel menggunakan tabel bawaan untuk menghasilkan kode pindaian dari kode kunci. Dengan demikian, setkeycodes (8) dapat memengaruhi output showkey dalam mode dump kode pindai.

Saya akan melihat apakah showkey akan membuang apa pun dengan kunci makro setelah opsi boot ini diatur.

EDIT: Setelah reboot, tidak berhasil, tetapi saya sedang mencari input mentah dari perangkat USB itu sendiri. Saya mencatat hal berikut, yang menarik (saya punya Razer Diamondback dan BlackWidow):

[root@kestrel by-id]# pwd
/dev/input/by-id
[root@kestrel 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
[root@kestrel by-id]#

Namun, menggunakan dd untuk menangkap input mentah berfungsi pada kedua mouse diamondback, pada perangkat event-kbd, tetapi tidak pada perangkat mouse BlackWidow.

Saya kira mungkin mereka tidak menghasilkan output apa pun sampai diaktifkan oleh driver yang diinstal. Saya tidak tahu banyak tentang Linux USB, jadi saya bahkan tidak tahu apakah ini masuk akal. Mungkin mereka perlu diikat dulu?

Ya, ketiga perangkat janda hitam ini dicatat /proc/bus/input/devices, namun tampaknya tidak disebutkan dalam lsusbatau /proc/bus/usb/devices. Saya tidak yakin cara mengakses perangkat ini untuk mencoba mengikatnya atau berinteraksi dengan mereka dengan cara apa pun.

event4tampaknya sesuai dengan keyboard yang sebenarnya, event6 dengan tombol makro, tapi saya masih tidak bisa menangkap input apa pun dari mereka. Semoga semua bisa membantu.

   [root@kestrel input]# ls
devices  handlers
[root@kestrel 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
[root@kestrel input]# pwd
/proc/bus/input
[root@kestrel 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

[root@kestrel input]# 

Saya menduga bahwa sistem harus berkomunikasi dengan keyboard untuk menginisialisasi mereka - dengan OS X, keyboard saya dilemparkan ke mode cahaya 'berdenyut'. Mungkin diperlukan beberapa inisialisasi sebelum kunci makro keyboard berfungsi
Journeyman Geek

Yang saya ingin tahu adalah bagaimana mengirim informasi itu ke mouse dan perangkat event-mouse. event-mouse tampaknya bertanggung jawab, karena terikat dengan pengendali event keyboard. Maksudku, secara teoritis, yang harus dilakukan adalah menginisialisasi perangkat dan mengatur kode kunci scancode-> yang tepat dengan setkeycode dan kemudian mengambil peristiwa sebagai penekanan tombol normal.
srmaddox

Mungkin saya bisa membuka gerhana dan menulis program untuk memungkinkan masuk / keluar mentah / dari perangkat. Maka coba-coba bisa menang.
srmaddox

jespersaur.com/drupal/book/export/html/21 ini harus menarik sejauh proses berjalan. Jauh melebihi skillet saya.
Journeyman Geek

7

Solusi saya adalah untuk Razer BlackWidow 2013 Mechanical Gaming Keyboard (Nomor Model: RZ03-0039) dan diuji pada openSUSE 12.3.

Saya menggunakan Google Translate pada tautan ini .

Pada dasarnya ia menggunakan versi modifikasi dari jawaban @ Sergey untuk pertanyaan ini, tetapi dengan modifikasi sederhana:

  1. Saya PRODUCT_ID = 0x011b

  2. Pada openSUSE 12.3 saya, python-usb tidak tersedia untuk Python 3, jadi saya mengkonversi skrip ini untuk bekerja dengan Python 2 dengan menghapus bwcmdmetode dan mendefinisikannya USB_BUFFER = ...seperti pada tautan dari jawaban @ tux_mark_5 .


Untuk kenyamanan di sini adalah konten saya /usr/local/sbin/init_blackwidow.py:

#!/usr/bin/python

"""This is a patched version of Sergey's code form
https://superuser.com/a/474595/8647

It worked for my Razer BlackWidow 2013 Mechanical Gaming Keyboard
(Model Number: RZ03-0039).

"""
import usb
import sys

VENDOR_ID = 0x1532       # Razer
PRODUCT_ID = 0x011b      # BlackWidow 2013 Mechanical Gaming Keyboard

USB_REQUEST_TYPE = 0x21  # Host To Device | Class | Interface
USB_REQUEST = 0x09       # SET_REPORT

USB_VALUE = 0x0300
USB_INDEX = 0x2
USB_INTERFACE = 2

USB_BUFFER = b"\x00\x00\x00\x00\x00\x02\x00\x04\x02\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00"

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 send(self, c):
        def _send(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):
            for i in c:
                print(' >> {}\n'.format(i))
                _send(i)
        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()

... dan saya /etc/udev/rules.d/99-razer-balckwidow.rulesadalah:

SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="011b", RUN+="/usr/local/sbin/init_blackwidow.py"

Di mana Anda menemukan salinan pyusb yang dimiliki usb.util?
KayEss

@ KayEss, saya menggunakan python-usb-1.0.0-21.1.noarch.rpm. IIRC itu adalah bagian dari repositori stadard dari 0penSUSE 12.3. Menurut rpm -qi, sumbernya ada di sourceforge.net/projects/pyusb dan sumber paketnya ob: //build.opensuse.org/devel: bahasa: python
Chen Levy

Saya di Ubuntu, dan tidak ada versi paket untuk python3 tentang itu. Saya kemudian mengalami sedikit kesulitan untuk mendapatkan semua sudo, python3, pip dan virtualenv dalam satu baris, tetapi sekarang disortir dan saya melihat kode untuk kunci makro.
KayEss

1
@ KayEss, untuk Ubuntu 14.04, saya menggunakan instruksi dari: github.com/walac/pyusb . Khususnya: sudo apt-get install python libusb-1.0-0sudodanpip install pyusb --pre
Chen Levy

2

Mungkin dokumen ini akan membantu Anda:

Keyboard dan konsol Linux HOWTO , Program yang bermanfaat


ini awal, dan layak mendapat upvote. Menariknya kunci makro tidak muncul sama sekali di showkeys
Journeyman Geek

mungkin kunci makro ini hanya memancarkan scancode dalam kombinasi dengan kunci lain. Seperti scancode untuk makro-1, dll?
ascobol

1
Mereka tampaknya bekerja secara independen setelah dikonfigurasi di windows. Saya mungkin perlu mempertimbangkan pendekatan tingkat yang lebih rendah. Dugaan saya adalah karena ada dukungan untuk mouse yang dibuat oleh perusahaan yang sama dengan razercfg menggunakan scancode non standar. heh. Jika itu mudah, saya kira saya akan menemukannya;)
Journeyman Geek

Dokumen itu belum diperbarui sejak 2002. Apakah masih mutakhir?
Peter Mortensen

1

Lihat Razer Key Mapper untuk Linux .

Ini berfungsi dengan semua makro perangkat Razer, diberi beberapa modifikasi kode. Jika Anda masih belum memiliki solusi dan perangkat Anda tidak terdaftar saya akan senang membantu Anda mengkonfigurasi perangkat Anda dan menambahkannya ke daftar yang didukung.


Bagaimana ini lebih baik daripada jawaban yang diterima?
Toto

1
Lebih sederhana, kurasa. Sebelum dibuat. Yang tersisa untuk dilakukan adalah mengisi file konfigurasi.
Camille Guay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.