Linux'ta çalışmak için bir Razer BlackWidow'dan makro anahtarları alma


49

Windows'ta yüklü bir araç kullanarak ayarlanan makrolar için ek anahtarlara sahip olan bir Razer BlackWidow Ultimate yazılımı aldım . Bunların bazı süslü değil joojoo tuşları olmadığını ve diğer anahtarlar gibi taramalı kodlar çıkarması gerektiğini düşünüyorum.

Öncelikle, Linux'ta bu tarama kodlarını kontrol etmenin standart bir yolu var mı? İkincisi, bu anahtarları komut satırında ve X tabanlı Linux kurulumlarında işleri yapacak şekilde nasıl ayarlarım? Şu anki Linux kurulumum Xubuntu 10.10, fakat bir şeyler hallettikten sonra Kubuntu'ya geçeceğim. İdeal olarak cevap genel ve sistem çapında olmalıdır.

Şimdiye kadar denediğim şeyler:

Denemem gereken şeyler

  • snoopy pro + ters mühendislik (ah canım)

  • Wireshark - öndeki kızartmayı önleme, sanırım klavye izlendiğinde ve tuşlara basıldığında düşündüğümde yayılan hiçbir tarama kodunu göstermiyor gibi görünüyor. Ek tuşların ayrı bir cihaz olduğunu veya bir şekilde başlatılması gerektiğini gösterebilir.

  • Linux'tan lsusb çıktısı olan üç senaryoda referansı geçmemiz gerekiyor: bağımsız, sürücüler yüklü olmadan Windows VM'ye geçiyor ve aynı.

  • LSUSB, bağımsız bir Linux kurulumunda yalnızca bir cihazı algılar

  • Farelerin aynı Razer Synapse sürücüsünü kullanıp kullanmadığını kontrol etmek faydalı olabilir, çünkü bu, bazı razercfg varyasyonlarının çalışabileceği anlamına gelir (algılanmadı, yalnızca fareler için çalışıyor gibi görünüyor).

Çalıştığım şeyler:

  • Sürücülü bir Windows sisteminde klavye, klavye ve işaretleme aygıtı olarak görülür . İşaretleme aygıtı, bataklık standart fare sürücülerinize ek olarak, Razer Synapse adı verilen bir sürücü için de kullanır.

  • Fare sürücüsü altında Linux görüldüğü evdevve lsusbaynı zamanda

  • Görünüşe göre OS X altında tek bir cihaz var, ancak buna lsusbeşdeğer bir şey denemedim

  • Klavye, sürücü ile başlatıldıktan sonra OS X'te darbeli arka ışık moduna geçer. Bu muhtemelen etkinleştirme sırasında klavyeye gönderilen bir başlatma dizisi olduğunu göstermelidir.

  • Aslında, fantezi joojoo anahtarlar.

Bu soruyu biraz genişletmek:

Bir Windows sistemine erişebiliyorum, bu yüzden soruyu cevaplamak için herhangi bir araç kullanmam gerekiyorsa sorun değil. Ayrıca config yardımcı programı olan ve olmayan sistemlerde deneyebilirim. Beklenen sonuç, yine de bu anahtarları Linux'ta kullanılabilir hale getirmektir.

Ayrıca bunun çok özel bir donanım ailesi olduğunun farkındayım. Ayrıntılı talimatlarım varsa, bir Linux sisteminde anlamlı olan herhangi bir şeyi test etmeye istekli olurdum - bu soruyu Linux becerisine sahip olan ancak bu klavyeye erişimi olmayan kişilere açmalıdır.

İstediğim minimum sonuç:

Bu anahtarların algılanmasını ve şu anki grafik ana Ubuntu türevlerinin herhangi birinde herhangi bir şekilde kullanılabilir olmasına ve doğal olarak klavyemle çalışmak zorunda kalmasına ihtiyacım var. Ortalama bir kullanıcı tarafından güzelce paketlenmiş ve kullanılabilir bir şeyse sanal çerez ve çılgın aksesuarlar.

Ben derlenmiş sistemimde çalışacak kodu veya (o daha karmaşık olursa talimatlarla ben derlemek bir kaynak gerektirecektir ./configure, make, make install) eğer ek yazılım değil anındaki akım LTS veya standart masaüstü serbest bırakılması için Ubuntu depolarından üzerinde cevap. Ayrıca, kendi sistemimde anahtarları çoğaltmak ve başarılı bir şekilde kullanmak için yeterli bilgiye de ihtiyacım olacak.


Herhangi bir çözüm ile güncelleyin, aynı elde etmek isterim!
Jonathan Day

Son zamanlarda üzerinde çalışacak vaktim olmadı, ancak bir cevap bulana kadar bu soruyu ne yaparsam yapayım.
Journeyman Geek

Belki de büyük yazı tipinde 500 temsilciden bahsedecek şekilde düzenlenebilir mi? Aksi taktirde, bu ilan pek bir anlam ifade etmiyor (sisteme kayıtlı 50 rep ödül verildiğinde)
Daniel Beck

Bu hala senin için çalışıyor mu? (Ben Sergey tarafından belirtilen en son üretici yazılımı hakkında konuşuyorum)
Adonis K. Kakoulidis

Test etmedim, korkarım, işe yarayıp yaramadığını görmek için Sergey'in çözümünü denemek istemiştim, ancak okul çalışmaları için çoğunlukla son birkaç aydır pencere kullanıyordum. Olursa, bu etkiye bir yorum gönderirim
Journeyman Geek

Yanıtlar:


44

Aslında M1-M5 normal anahtarlardır - yalnızca bir tarama kodu üretmeden önce özel olarak etkinleştirilmeleri gerekir. tux_mark_5, bu tuşları etkinleştirmek için Razer klavyelerine doğru SET_REPORT mesajını gönderen küçük bir Haskell programı geliştirdi ve eski papağan aynı kodu Python'a taşıdı.

Arch Linux sistemlerinde Python portu paketlenmiştir ve https://aur.archlinux.org/packages.php?ID=60518 adresinden edinilebilir .

Debian veya Ubuntu sistemlerinde kodun Python portunu ayarlamak nispeten kolaydır. PyUSB ve libusb (root olarak) kurmanız gerekir:

    aptitude install python-usb

Sonra blackwidow_enable.pydosyayı http://finch.am/projects/blackwidow/ adresinden alın ve çalıştırın (ayrıca root olarak):

    chmod +x blackwidow_enable.py
    ./blackwidow_enable.py

Bu, klavye çıkarılıncaya veya makine yeniden başlatılıncaya kadar tuşları etkinleştirir. Bu kalıcı hale getirmek için betiği en çok tercih ettiğiniz başlangıç ​​betiği stilinden arayın. Bunu Debian'da nasıl kuracağınızla ilgili talimatlar için Debian belgelerine bakın .

Tux_mark_5 Haskell kodunu kullanmak için Haskell kurmanız ve kodu kendiniz derlemeniz gerekir. Bu talimatlar Debian benzeri bir sistem içindir (Ubuntu dahil).

  1. GHC, libusb-1.0-0-dev ve cabal'ı (root olarak) kurun:

    aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
    
  2. Paketlerin listesini getir:

    cabal update
    
  3. Haskell için USB bağları kurun (root gerektirmez):

    cabal install usb
    
  4. Yardımcı programı indirin:

    git clone git://github.com/tuxmark5/EnableRazer.git
    
  5. Yardımcı programı oluşturun:

    cabal configure
    cabal build
    
  6. Yardımcı programı çalıştırın (ayrıca root olarak):

    ./dist/build/EnableRazer/EnableRazer
    

Bundan sonra EnableRazer binary'i istediğiniz yere kopyalayıp başlangıçta çalıştırabilirsiniz.

Yürütmeden hemen sonra, X sunucusunun M1'i XF86Tools, M2'yi XF86Launch5, M3'ü XF86Launch6, M4'ü XF86Launch7 ve M5'i XF86Launch8 olarak görmelidir. FN için olaylar da yayılır.

Bu anahtarlar, xbindkeys veya KDE'nin sistem ayarlarında isteğe bağlı işlemlere bağlanabilir.

Klavyeniz farklı olabileceğinden, ürün kimliğini Main.hs satır 64’de değiştirmeniz gerekebilir:

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

Bu işe yarar, iyi gidiyor. Sistem izin verdiğinde bir veya iki günde 500 rep alacaksınız. Haskell usb paketinin bir önkoşulunu önkoşul listesine eklemek için gereken pkg-config ekleme özgürlüğünü aldım. Yazılım, standart blackwidow ultimate ürünümde hiçbir değişiklik yapmadan çalışır, lsusb'ye göre 1532: 010d ürün kimliği ile çalışır. Anahtarlar en baştan algılanır ve kullanılabilir gibi görünür, bu nedenle bu sorunun gereklerini tam olarak karşılamıştır.
Journeyman Geek

Buna ek olarak, kde göründüğü kadar önemli bir ciltleme seçeneğine sahip değil, xbindkeys tho çalışıyor gibi görünüyor
Journeyman Geek

ID 10e ile standart blackwidow'umla çalışıyor (nihai değil). Bir udev kuralı eklemenizi tavsiye ediyorum, bu yüzden otomatik olarak başlatılıyor, sorunsuz bir şekilde çalışıyor, örn. 99-enable-razer-keyboard.rules int /etc/udev/rules.d içinde bir dosya oluşturun SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010e", RUN+="/root/EnableRazer"(burada değiştirmek zorunda kalabilirsiniz) yol ve kimliği tekrar)
flolo

Görünüşe göre yazdığım program Razer Anansi ile de çalışıyor. İşte bunu çekti birisinin blog yazısı: norgelinux.blogspot.com/2012/02/razer-anasi-on-arch-linux.html
tux_mark_5 17.08

1
Blackwidow_enable.py betiğini (köklü ve köksüz) çalıştırdığımda Razer BlackWidow 2013 (sonuncusu değil) var, "Blackwidow bulunamadı" iletisini alıyorum. Lütfen bu hata ayıklama bana yardımcı olabilir misiniz? UbuntuGnome 13.04’dayım. Product_ID farklı gibi görünüyor ve ürün kimliğini değiştirdikten sonra şimdi bu hatayı alıyorum:Could not select configuration endpoint.
Adonis K. Kakoulidis 19:13

22

Razer, bulut tabanlı Synapse 2 konfigüratörlerini bugünlerde tüm kullanıcılara zorluyor gibi gözüküyor, sürüm 2'ye eşlik eden ürün yazılımı yükseltmesi *. Bellenimi yükselttikten sonra geri dönemezsiniz (eski bellenim ile yanıp sönmeye çalışırsanız klavye tamamen tuğlasıyla yazılır).

Tux_mark_5'in cevabındaki Haskell programından çıkan 'sihirli bayt' en son firmware ile çalışmaz. Bunun yerine, sürücü bu baytları başlatma sırasına gönderir: '0200 0403'. Bunlar makro tuşlarını etkinleştirir, ancak klavye, standart HID protokolü yerine 16 baytlık paketler gönderdiği (muhtemelen aynı anda basılabilen tuşların sayısını artırmak için) gönderdiği tuhaf bir moda girer. Linux HID sistemi bununla tam olarak başa çıkamaz ve çoğu tuş beklendiği gibi çalışır, ancak makro tuşlar tanınmaz halde kalır: HID sürücüsü, basıldığında girdi katmanına herhangi bir veri beslemez.

Klavyenizin eski moda girmesini sağlamak için (makro tuşlarının XF86Launch * tuş kodlarını ve FN tuşunun 202 tuş kodunu gönderdiği), bu baytları gönderin: 0200 0402.

Paketin tamamı:

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

İşte görevimi gerçekleştirmek için daha az ezoterik Python 3 ile yazdığım çok kaba ve kirli bir program. Razer kontrol paketlerini blackwidow.bwcmd () biçiminde üretme kodunu ve Razer logo LED'ini bonus olarak komut edin :)

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

klavyem yükseltildi ve henüz denemedim. Tekrar uygun bir linux sistemim varken bir şans vereceğim. Ne yazık ki, bunun için başka bir ödül veremiyorum - kısmen de ödül sisteminin nasıl çalıştığı yüzünden. Ben olacak o tho eğer muhtemelen sizinkine doğru cevap geçiş.
Journeyman Geek

Görünüşe göre modül usb sistemimde eksik, bu yüzden bu işe yaramazsa: /
Journeyman Geek

Usb modülü muhtemelen pyusb paketindedir (veya dağıtımına bağlı olarak python-usb veya benzeri bir şey).
Sergey

2
Sergey çok teşekkür ederim, yeni Razer BlackWidow 2013 ile PRODUCT_ID = 0x011b ile bile çalışıyor. Henüz herhangi bir makroyu ayarlamayı denemedim ama / dev / input / by-id / usb-Razer_Razer_BlackWidow_2013-event-kbd'den gelen olayları ve xev :) 'de gelen olayları görüyorum :).
binary_runner

Teşekkürler, bu harika. Bazı yıllar boyunca hiç sorun yaşamadan kullanıyorum (nihayet yorum yapma ünü aldım :)). Pyusb hakkında bir yorum: Ubuntu python 3 için pyusb'yi hala göndermediğinden, onu kullanarak kaynaktan el ile kurmak zorunda kaldımsudo python3 setup.py install
luator

8

Belki de bu konuya biraz ışık tutabilir (showkey man sayfasından):

2.6 çekirdeklerde ham mod veya tarama kodu modu hiç ham değildir. Tarama kodları önce tuş kodlarına, tarama kodları istendiğinde, tuş kodları geri çevrilir. Çeşitli dönüşümler söz konusudur ve nihai sonucun klavye donanımının gönderdiklerine tekabül ettiği garanti edilemez. Bu nedenle, çeşitli tuşlarla gönderilen tarama kodlarını bilmek istiyorsanız, 2.4 çekirdeği başlatmak daha iyidir. 2.6.9'dan bu yana, 2.6 çekirdeğe gerçek tarama kodlarını döndürmesini söyleyen atkbd.softraw = 0 önyükleme seçeneği de vardır.

Ham tarama kodları yalnızca AT ve PS / 2 klavyelerde bulunur ve atkbd.softraw = 0 çekirdek parametresi kullanılmadığı sürece bile devre dışı bırakılır. Ham tarama kodları mevcut olmadığında, çekirdek, tuş kodlarından tarama kodları üretmek için sabit bir yerleşik tablo kullanır. Bu nedenle, setkey kodları (8), tarama kodu döküm modunda showkey çıktısını etkileyebilir.

Bu önyükleme seçeneği ayarlandıktan sonra showkey'in makro tuşlarıyla herhangi bir şey bırakıp bırakmayacağını görmek üzereyim.

EDIT: Yeniden başlattıktan sonra başarılı olamadım, ancak USB cihazlarının kendisinden ham girdiler almak istiyordum. Aşağıdakileri ilginç bir şekilde not aldım (BlackWidow'un yanı sıra bir Razer Diamondback'im var):

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

Bununla birlikte, ham girişi yakalamak için dd kullanımı, her iki diamondback farede, event-kbd cihazında çalışır, ancak BlackWidow fare cihazlarında çalışmaz.

Sanırım kurulu sürücüler tarafından bir şekilde aktif hale getirilinceye kadar herhangi bir çıktı üretmiyorlar. Bununla birlikte Linux USB hakkında pek bir şey bilmiyorum, bu yüzden bunun mantıklı olup olmadığını bile bilmiyorum. Belki de ilk önce bağlı kalmaları gerekir?

Eh, her üç kara dul cihazı da belirtilmiştir /proc/bus/input/devices, ancak lsusbveya içinde numaralandırılmamış gibi görünmektedir /proc/bus/usb/devices. Herhangi bir şekilde onları bağlamak veya onlarla bağlantı kurmak için bu cihazlara nasıl erişeceğimi bilmiyorum.

event4Makro tuşlarıyla event6, event6'ya karşılık geliyor gibi gözüküyor, ancak onlardan hala herhangi bir girdi alamıyorum. Umarım hepsi yardımcı oldu.

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

Sistemin bunları başlatmak için klavyeyle iletişim kurması gerektiğini tahmin ediyorum - OS X ile klavyem 'darbeli' ışık moduna geçti. Klavye makro tuşlarının çalışmasından önce gerekli bazı başlangıçlar muhtemelen vardır
Journeyman Geek

Merak ettiğim şey bu bilgiyi fareye ve olay faresi cihazlarına nasıl göndereceğimiz. olay faresi bir klavye olay işleyicisine bağlı olduğundan sorumlu görünüyor. Teorik olarak, tek yapmamız gereken cihazı başlatmak ve uygun scancode-> keycode haritasını setkeycode ile ayarlamak ve olayları normal tuş vuruşları olarak almak.
srmaddox

Belki de cihazın tutulmasına / çıkmasına izin vermek için güneş tutulması açabilir ve bir program yazabilirim. Sonra deneme yanılma hakim olabilir.
srmaddox

jespersaur.com/drupal/book/export/html/21 bu sürece kadar ilgi çekici olmalıdır. Benim beceri setimin çok ötesinde.
Usta Geek

7

Benim çözüm için Razer Blackwidow 2013 Mekanik Gaming Keyboard (Model Numarası: RZ03-0039) ve openSUSE 12.3 üzerinde test edilmiştir.

Bu bağlantıda Google Translate'i kullandım .

Temel olarak @ Sergey'in bu sorunun cevabının değiştirilmiş versiyonunu kullanır , fakat basit değişikliklerle:

  1. Benim PRODUCT_ID = 0x011b

  2. Benim openSUSE 12.3 günü, piton-usb Python 3 için kullanılamaz, bu yüzden kaldırarak Python 2 ile çalışmak için bu senaryoyu dönüştürülen bwcmdyöntemi ve tanımlanmış USB_BUFFER = ...olduğu gibi bağlantı den @ tux_mark_5 cevabı .


Burada kolaylık sağlamak için benim içeriğinin /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()

... ve benim /etc/udev/rules.d/99-razer-balckwidow.rules:

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

Sahip olduğu bir pyusb kopyasını nereden buldun usb.util?
KayEss

@KayEss, kullanıyorum python-usb-1.0.0-21.1.noarch.rpm. IIRC, 0penSUSE 12.3'ün stadard depolarının bir parçasıdır. Buna göre rpm -qikaynak sourceforge.net/projects/pyusb adresinde ve paket kaynağı obs: //build.opensuse.org/devel adresinde bulunuyor: diller: python
Chen Levy

Ubuntu'dayım ve bunun üzerinde python3 için paketlenmiş bir sürüm yok. Daha sonra bir satırdaki tüm sudo, python3, pip ve virtualenv'i almakta biraz sıkıntı yaşıyordum, ama şimdi sıralandı ve makro tuşlarının kodlarını görüyorum.
KayEss

1
@KayEss, Ubuntu 14.04 için şu talimatları kullandım: github.com/walac/pyusb . Özellikle: sudo apt-get install python libusb-1.0-0sudovepip install pyusb --pre
Chen Levy

2

Belki bu belge size yardımcı olacaktır:

Linux klavye ve konsol NASIL , Faydalı programlar


onun bir başlangıç ​​ve bir değer. İlginçtir ki, makro tuşları hiç gösterilerde görünmez
Journeyman Geek

belki de bu makro tuşu sadece başka bir tuşla birlikte tarama kodunu yayar. Makro-1 için bir tarama kodu gibi mi?
ascobol

1
Pencerelerde yapılandırılmış bir kez bağımsız çalışıyor gibi görünüyorlar. Daha düşük seviyeli bir yaklaşım düşünmem gerekebilir. Tahminimce, aynı şirket tarafından razercfg ile standart olmayan tarama kodlarını kullanan fareler için destek var . heh. Kolay olsaydı, onu bulurdum sanırım;)
Journeyman Geek

Bu doküman 2002'den beri güncellenmedi. Halen güncel mi?
Peter Mortensen

1

Linux için Razer Key Mapper'a bakınız .

Bu, bazı kod modifikasyonu verilen tüm Razer cihazlarının makrolarıyla çalışır. Hala bir çözümünüz yoksa ve cihazınız listede yoksa, cihazınızı yapılandırmanıza ve desteklenen listeme eklemenize yardımcı olmaktan memnuniyet duyarım.


Bu kabul edilen cevaptan daha iyi nasıl olabilir?
Toto

1
Daha basit sanırım. Önceden hazırlanmış. Tek yapmamız gereken config dosyalarını doldurmak.
Camille Guay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.