Linux에서 작동하도록 Razer BlackWidow에서 매크로 키 가져 오기


49

Windows에 설치된 도구를 사용하여 설정된 매크로에 대한 추가 키가 있는 Razer BlackWidow Ultimate 을 선택했습니다 . 나는 이것들이 멋진 팬츠 joojoo 키가 아니며 다른 키와 같은 스캔 코드를 방출해야한다고 가정합니다.

첫째, Linux에서 이러한 스캔 코드를 확인하는 표준 방법이 있습니까? 둘째, 명령 행 및 X 기반 Linux 설정에서이 키를 설정하려면 어떻게해야합니까? 현재 Linux 설치는 Xubuntu 10.10이지만 몇 가지 사항이 수정되면 Kubuntu로 전환됩니다. 이상적으로는 대답이 일반적이고 시스템 전체에 있어야합니다.

내가 지금까지 시도한 것 :

시도해야 할 것

  • 스누피 프로 + 리버스 엔지니어링

  • Wireshark-예비 퍼징은 키보드를 모니터링하고 키를 눌렀을 때 스캔 코드가 생성되지 않았 음을 나타냅니다. 추가 키가 별도의 장치이거나 어떻게 든 초기화해야 함을 나타낼 수 있습니다.

  • Linux의 lsusb 출력을 사용하여 독립형, 드라이버를 설치하지 않고 Windows VM으로 전달하는 세 가지 시나리오에서이를 상호 참조해야합니다.

  • LSUSB는 독립형 Linux 설치에서 하나의 장치 만 감지합니다

  • 마우스가 동일한 Razer Synapse 드라이버를 사용하는지 확인하는 것이 유용 할 수 있습니다. 이는 razercfg의 일부 변형 이 작동 할 수 있음을 의미하기 때문입니다.

내가 일한 것 :

  • 드라이버가있는 Windows 시스템에서 키보드는 키보드 포인팅 장치로 표시됩니다. 포인팅 장치는 bog 표준 마우스 드라이버 외에도 Razer Synapse라는 드라이버를 사용합니다.

  • 마우스 드라이버는 아래에 리눅스에서 볼 evdevlsusb뿐만 아니라

  • OS X에서 단일 장치는 분명히 lsusb그와 동등한 것을 시도하지는 않았지만

  • 드라이버로 초기화하면 키보드가 OS X에서 펄스 백라이트 모드로 전환됩니다. 이것은 아마도 활성화시 키보드로 초기화 시퀀스가 ​​전송되었음을 나타냅니다.

  • 그들은 실제로 팬츠 joojoo 열쇠입니다.

이 질문을 약간 확장 :

Windows 시스템에 액세스 할 수 있으므로 질문에 대답하는 데 도움이되는 도구를 사용해야하는 경우 괜찮습니다. config 유틸리티가 있거나없는 시스템에서 시도해 볼 수도 있습니다. 그러나 최종 결과는 Linux에서 이러한 키를 계속 사용할 수있게하는 것입니다.

또한 이것이 매우 구체적인 하드웨어 제품군이라는 것을 알고 있습니다. 자세한 지시 사항이 있으면 Linux 시스템에서 의미가있는 것을 기꺼이 테스트하려고합니다. 이것은 Linux 기술을 보유하고 있지만이 키보드에 액세스 할 수없는 사람들에게 질문을 제공해야합니다.

내가 요구하는 최소 최종 결과 :

이 키가 감지 되어 현재 그래픽 주류 우분투 변형 에서 어떤 방식 으로든 사용할 수 있어야하며 당연히 키보드로 작업해야합니다. 가상 쿠키 및 미친 소품은 일반 사용자가 멋지게 포장하고 사용할 수있는 것입니다.

나는 컴파일 내 시스템에서 작동 코드, 또는 (가보다 더 복잡하다면 지침 내가 컴파일 할 수있는 소스가 필요합니다 ./configure, make, make install)의 경우 추가 소프트웨어없는시의 현재 LTS 또는 표준 데스크탑 버전의 우분투 저장소에 대답. 또한 복제 할 충분한 정보가 필요하며 내 시스템에서 키를 성공적으로 사용합니다.


모든 솔루션으로 업데이트하십시오. 동일하게 달성하고 싶습니다!
Jonathan Day

나는 최근에 그것에 대해 일할 시간이 없었지만 대답을 얻을 때까지 내가 한 일로이 질문을 업데이트 할 것입니다.
Journeyman Geek

큰 글꼴로 500 명의 담당자를 언급하도록 수정 하시겠습니까? 그렇지 않으면 그 선언은 그다지 의미가 없습니다 (시스템에 등록 된 50 명의 보상 현상금이 주어짐)
Daniel Beck

여전히 당신을 위해 작동합니까? (저는 Sergey가 언급 한 최신 펌웨어에 대해 이야기하고 있습니다)
Adonis K. Kakoulidis

나는 그것을 테스트하지 않았고, 두려운 데, sergey의 솔루션이 작동하는지 확인하기 위해 시도했지만 의미있는 것은 지난 몇 개월 동안 학업을 위해 창을 운영하고 있습니다. 그렇다면, 그 효과에 대한 의견을 게시하겠습니다
Journeyman Geek

답변:


44

M1-M5는 실제로 일반 키입니다. 키를 누르기 전에 스캔 코드를 생성하기 전에 특별히 활성화해야합니다. tux_mark_5는 올바른 SET_REPORT 메시지를 Razer 키보드로 전송하여 이러한 키를 활성화하고 동일한 코드를 Python으로 포팅하는 작은 Haskell 프로그램을 개발했습니다.

Arch Linux 시스템에서 Python 포트는 패키지되어 있으며 https://aur.archlinux.org/packages.php?ID=60518 에서 사용할 수 있습니다 .

데비안 또는 우분투 시스템에서 코드의 파이썬 포트를 설정하는 것은 비교적 쉽습니다. PyUSB 및 libusb를 루트로 설치해야합니다.

    aptitude install python-usb

그런 다음 http://finch.am/projects/blackwidow/ 에서 blackwidow_enable.py파일을 가져 와서 실행하십시오 (루트).

    chmod +x blackwidow_enable.py
    ./blackwidow_enable.py

키보드가 분리되거나 기기가 재부팅 될 때까지 키가 활성화됩니다. 이를 영구적으로 사용하려면 가장 선호하는 시작 스크립트 스타일에서 스크립트를 호출하십시오. 데비안에서이를 설정하는 방법에 대한 지침을 살펴 가지고 데비안 문서를 .

tux_mark_5의 Haskell 코드를 사용하려면 Haskell을 설치하고 코드를 직접 컴파일해야합니다. 이 지침은 데비안과 유사한 시스템 (우분투 포함)을위한 것입니다.

  1. GHC, libusb-1.0-0-dev 및 cabal을 설치하십시오 (루트로) :

    aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
    
  2. 패키지 목록을 가져옵니다.

    cabal update
    
  3. Haskell 용 USB 바인딩을 설치하십시오 (루트 필요 없음).

    cabal install usb
    
  4. 유틸리티를 다운로드하십시오 :

    git clone git://github.com/tuxmark5/EnableRazer.git
    
  5. 유틸리티를 빌드하십시오.

    cabal configure
    cabal build
    
  6. 유틸리티 (루트와 함께)를 실행하십시오.

    ./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

이것은 잘 작동합니다. 시스템에서 허용하는 경우 하루나 이틀 만에 500 명이 응답합니다. 필자는 haskell usb 패키지의 전제 조건을 전제 조건 목록에 설치하는 데 필요한 pkg-config를 자유롭게 추가했습니다. 이 소프트웨어는 lsusb에 따라 1532 : 010d의 제품 ID로 표준 blackwidow ultimate에서 전혀 수정하지 않고 작동합니다. 키는 evtest에서 감지되어 사용 가능한 것처럼 보이므로 질문의 요구 사항을 완벽하게 충족했습니다.
Journeyman Geek

또한 kde에는 키 바인딩 옵션이없는 것 같습니다. xbindkeys가 작동하는 것 같습니다
Journeyman Geek

ID 10e를 사용하면 표준 블랙 위도우 (최종)와 작동합니다. udev 규칙을 추가하여 문제없이 자동으로 시작되도록 권장합니다. 예를 들어 99-enable-razer-keyboard.rules int /etc/udev/rules.d 파일을 SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010e", RUN+="/root/EnableRazer"여기에 넣으 십시오 (여기에서 path and id again)
flolo

필자가 작성한 유틸리티는 Razer Anansi에서도 작동합니다. 다음은이를 해제 한 사람의 블로그 게시물입니다. norgelinux.blogspot.com/2012/02/razer-anasi-on-arch-linux.html
tux_mark_5

1
루트가 있거나없는 blackwidow_enable.py 스크립트를 실행하면 "Blackwidow not found"라는 메시지가 나타납니다. 이것을 디버깅하도록 도와 주시겠습니까? UbuntuGnome 13.04에 있습니다. Product_ID가 다르고 제품 ID를 변경 한 후 다음과 같은 오류가 발생합니다.Could not select configuration endpoint.
Adonis K. Kakoulidis

22

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()

키보드가 업그레이드되어 아직 시도하지 않았습니다. 적절한 리눅스 시스템을 다시 가질 때 나는 그것을 쏴 줄 것이다. 불행히도 바운티 시스템의 작동 방식으로 인해 다른 바운티를 줄 수 없습니다. 나는 그것이 상점 않으면 아마 당신에 대한 정확한 답을 전환.
Journeyman Geek

분명히 모듈 USB는 내 시스템에 있으므로이 작동하지 않습니다없는 : /
저니 긱

USB 모듈은 아마도 pyusb 패키지 (또는 배포판에 따라 python-usb 또는 이와 유사한 것)에있을 수 있습니다.
Sergey

2
Sergey는 대단히 감사합니다. PRODUCT_ID = 0x011b 인 최신 Razer BlackWidow 2013에서도 작동합니다. 아직 매크로를 설정하지는 않았지만 / dev / input / by-id / usb-Razer_Razer_BlackWidow_2013-event-kbd 및 xev에서 이벤트가 발생합니다. :)
binary_runner

고마워요, 훌륭합니다. 나는 몇 년 동안 아무런 문제없이 사용하고 있습니다 (최종적으로 명성을 얻었습니다 :)). pyusb에 대한 한 의견 : Ubuntu는 여전히 python 3을 python 3 용으로 제공하지 않기 때문에 다음을 사용하여 소스에서 수동으로 설치해야했습니다.sudo python3 setup.py install
luator

8

아마도 이것은 쇼키 맨 페이지에서 문제에 대해 약간의 조명을 줄 수 있습니다.

2.6 커널에서는 원시 모드 또는 스캔 코드 모드가 전혀 원시적이지 않습니다. 스캔 코드는 먼저 키 코드로 변환되고 스캔 코드가 필요한 경우 키 코드가 다시 변환됩니다. 다양한 변형이 수반되며, 최종 결과가 키보드 하드웨어가 전송 한 것과 일치한다는 보장은 없습니다. 따라서 다양한 키로 전송 된 스캔 코드를 알고 싶다면 2.4 커널로 부팅하는 것이 좋습니다. 2.6.9부터는 2.6 커널이 실제 스캔 코드를 반환하도록하는 부팅 옵션 atkbd.softraw = 0도 있습니다.

원시 스캔 코드는 AT 및 PS / 2 키보드에서만 사용할 수 있으며 atkbd.softraw = 0 커널 매개 변수를 사용하지 않으면 비활성화됩니다. 원시 스캔 코드를 사용할 수없는 경우 커널은 고정 내장 테이블을 사용하여 키 코드에서 스캔 코드를 생성합니다. 따라서 setkeycodes (8)는 스캔 코드 덤프 모드에서 showkey의 출력에 영향을 줄 수 있습니다.

이 부팅 옵션이 설정된 후 showkey가 매크로 키로 무엇이든 덤프하는지 확인하려고합니다.

편집 : 재부팅 후 성공하지 못했지만 USB 장치 자체에서 원시 입력을 캡처하려고했습니다. 나는 흥미롭게도 다음과 같이 지적했다. (Razer Diamondback과 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]#

그러나 dd를 사용하여 원시 입력을 캡처하면 두 다이아몬드 백 마우스, 이벤트 KBD 장치에서는 작동하지만 BlackWidow 마우스 장치에서는 작동하지 않습니다.

나는 그들이 설치된 드라이버에 의해 어떻게 든 활성화 될 때까지 출력을 생성하지 않을 것이라고 생각합니다. 그러나 Linux USB에 대해서는 많이 알지 못하므로 이것이 의미가 있는지조차 알지 못합니다. 아마도 그들은 먼저 묶어야합니까?

글쎄, 세 개의 검은 미망인 장치는 모두에 언급되어 /proc/bus/input/devices있지만 lsusb또는에 열거되어 있지는 않습니다 /proc/bus/usb/devices. 이 장치에 액세스하여 장치를 바인딩하거나 어떤 식 으로든 인터페이스를 시도하는 방법을 잘 모르겠습니다.

event4매크로 키가있는 실제 키보드, event6에 해당하는 것으로 보이지만 여전히 입력을 캡처 할 수 없습니다. 모두 도움이 되었기를 바랍니다.

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

OS X에서는 키보드가 '펄싱'라이트 모드로 전환됩니다. 시스템이 키보드와 통신하여 키보드를 초기화해야한다고 생각합니다. 키보드 매크로 키가 작동하기 전에 약간의 초기화가 필요합니다
Journeyman Geek

궁금한 점은 해당 정보를 마우스 및 이벤트 마우스 장치로 보내는 방법입니다. 이벤트 마우스는 키보드 이벤트 핸들러에 바인딩되어 있기 때문에 책임이있는 것으로 보입니다. 이론적으로는 장치를 초기화하고 setkeycode와 함께 적절한 스캔 코드-> 키 코드 맵을 설정하고 이벤트를 일반 키 입력으로 가져와야합니다.
srmaddox

아마도 이클립스를 열고 장치에 대한 원시 입출력을 허용하는 프로그램을 작성할 수 있습니다. 그러면 시행 착오가 우선 할 수 있습니다.
srmaddox

jespersaur.com/drupal/book/export/html/21 이것은 프로세스가 진행되는 한 관심을 가져야합니다. 그것은 저의 기술력을 훨씬 뛰어 넘습니다.
Journeyman Geek

7

내 솔루션은 Razer BlackWidow 2013 Mechanical 게임 키보드 (모델 번호 : RZ03-0039) 용 이며 openSUSE 12.3에서 테스트되었습니다.

이 링크 에서 Google 번역을 사용했습니다 .

기본적 으로이 질문에 대해 수정 된 @Sergey의 답변 버전을 사용 하지만 간단한 수정이 있습니다.

  1. 나의 PRODUCT_ID = 0x011b

  2. 내 오픈 수세 12.3에서 파이썬-USB 파이썬 3을 사용할 수 없습니다, 그래서 제거하여 파이썬 2를 사용하려면이 스크립트를 변환 bwcmd방법과 정의 USB_BUFFER = ...같이 링크 에서 @ tux_mark_5의 대답 .


편의를 위해 여기에 내 내용이 있습니다 /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()

... 그리고 내 /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"

pyusb의 사본은 어디서 찾았 usb.util습니까?
KayEss

@ KayEss, 사용하고 python-usb-1.0.0-21.1.noarch.rpm있습니다. IIRC는 0penSUSE 12.3의 표준 저장소의 일부입니다. 에 따르면 rpm -qi, 소스는 sourceforge.net/projects/pyusb에 있고 패키지 소스는 obs : //build.opensuse.org/devel : languages ​​: python
Chen Levy

나는 우분투에 있고 거기에 python3 용 패키지 버전이 없습니다. 그런 다음 줄에 sudo, python3, pip 및 virtualenv를 모두 가져 오는 데 약간의 어려움이 있었지만 지금 정렬되어 매크로 키 코드가 표시됩니다.
KayEss

1
@KayEss, Ubuntu 14.04의 경우 github.com/walac/pyusb 의 지침을 사용했습니다 . 특히 : sudo apt-get install python libusb-1.0-0sudopip install pyusb --pre
첸 레비

2

이 문서가 도움이 될 것입니다.

리눅스 키보드와 콘솔 하우투 , 유용한 프로그램


그것의 시작이며 공감할 가치가 있습니다. 흥미롭게도 매크로 키는 쇼키에 전혀 표시 되지 않습니다
Journeyman Geek

이 매크로 키는 다른 키와 함께 스캔 코드 만 내 보냅니다. 매크로 1 등의 스캔 코드처럼?
ascobol

1
창에서 한 번 구성되면 독립적으로 작동하는 것 같습니다. 저수준 접근법을 고려해야 할 수도 있습니다. 비표준 스캔 코드를 사용 하는 razercfg 를 사용하여 동일한 회사에서 만든 마우스를 지원하기 때문에 추측 합니다. ㅎ 그것이 쉬웠다면, 나는 그것을 발견했을 것이라고 생각한다;)
Journeyman Geek

이 문서는 2002 년 이후로 업데이트되지 않았습니다. 아직 최신 버전입니까?
피터 Mortensen

1

Linux 용 Razer Key Mapper를 참조하십시오 .

이것은 약간의 코드 수정이 주어지면 모든 Razer 장치의 매크로와 함께 작동합니다. 여전히 솔루션이없고 장치가 목록에없는 경우 장치를 구성하고 지원되는 목록에 추가하는 데 도움을 드리겠습니다.


이것이 허용되는 답변보다 어떻게 낫습니까?
Toto

1
더 간단합니다. 사전 제작. 구성 파일을 채우는 것만 남습니다.
Camille Guay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.