Nhận các phím macro từ Razer BlackWidow để hoạt động trên Linux


49

Tôi đã chọn Razer BlackWidow Ultimate có các phím bổ sung dành cho các macro được thiết lập bằng công cụ được cài đặt trên Windows . Tôi giả định rằng đây không phải là một số khóa joojoo ưa thích và sẽ phát ra các đoạn mã giống như bất kỳ khóa nào khác.

Thứ nhất, có một cách tiêu chuẩn để kiểm tra các scancodes này trong Linux không? Thứ hai, làm cách nào để tôi thiết lập các khóa này để thực hiện mọi việc trong các thiết lập dòng lệnh và Linux dựa trên X? Bản cài đặt Linux hiện tại của tôi là Xubfox 10.10, nhưng tôi sẽ chuyển sang Kubfox khi tôi có một vài thứ được sửa. Lý tưởng nhất là câu trả lời phải chung chung và toàn hệ thống.

Những điều tôi đã cố gắng cho đến nay:

Những điều tôi cần thử

  • snoopy pro + kỹ thuật đảo ngược (oh thân yêu)

  • Wireshark - đóng gói sơ bộ xung quanh dường như cho thấy không có scancodes nào phát ra khi điều mà tôi dường như nghĩ là bàn phím được theo dõi và nhấn phím. Có thể chỉ ra các khóa bổ sung là một thiết bị riêng biệt hoặc cần được khởi tạo bằng cách nào đó.

  • Cần tham chiếu chéo rằng với đầu ra lsusb từ Linux, trong ba trường hợp: độc lập, được chuyển qua Windows VM mà không cần trình điều khiển được cài đặt và tương tự với.

  • LSUSB chỉ phát hiện một thiết bị trên bản cài đặt Linux độc lập

  • Có thể hữu ích để kiểm tra xem chuột có sử dụng cùng trình điều khiển Razer Synapse hay không, vì điều đó có nghĩa là một số biến thể của razercfg có thể hoạt động (không được phát hiện, dường như chỉ hoạt động đối với chuột)

Những điều tôi đã làm việc:

  • Trong một hệ thống Windows có trình điều khiển, bàn phím được xem là bàn phím thiết bị trỏ. Thiết bị trỏ sử dụng - ngoài trình điều khiển chuột tiêu chuẩn không có thật của bạn - trình điều khiển cho một thứ gọi là Razer Synapse.

  • Chuột lái xe nhìn thấy trong Linux dưới evdevlsusbcũng

  • Thiết bị duy nhất trong OS X rõ ràng, mặc dù tôi chưa thử lsusbtương đương với điều đó

  • Bàn phím chuyển sang chế độ đèn nền xung trong OS X khi khởi tạo với trình điều khiển. Điều này có lẽ sẽ chỉ ra rằng có một số trình tự khởi tạo được gửi đến bàn phím khi kích hoạt.

  • Trên thực tế, chúng là các phím joojoo.

Mở rộng câu hỏi này một chút:

Tôi có quyền truy cập vào hệ thống Windows vì vậy nếu tôi cần sử dụng bất kỳ công cụ nào để giúp trả lời câu hỏi thì không sao. Tôi cũng có thể thử nó trên các hệ thống có và không có tiện ích cấu hình. Tuy nhiên, kết quả cuối cùng dự kiến ​​vẫn là làm cho các khóa đó có thể sử dụng được trên Linux.

Tôi cũng nhận ra đây là một họ phần cứng rất đặc biệt. Tôi sẽ sẵn sàng kiểm tra bất cứ điều gì có ý nghĩa trên hệ thống Linux nếu tôi có hướng dẫn chi tiết - điều này sẽ mở ra câu hỏi cho những người có kỹ năng Linux, nhưng không có quyền truy cập vào bàn phím này.

Kết quả cuối cùng tối thiểu tôi yêu cầu:

Tôi cần các khóa này được phát hiện và có thể sử dụng theo bất kỳ cách nào trên bất kỳ biến thể Ubuntu chính nào về đồ họa hiện tại và tự nhiên phải hoạt động với bàn phím của tôi. Cookie ảo và đạo cụ điên nếu đó là thứ gì đó được đóng gói độc đáo và có thể sử dụng được bởi người dùng trung bình.

Tôi sẽ yêu cầu mã biên dịch sẽ làm việc trên hệ thống của tôi, hoặc một nguồn mà tôi có thể biên dịch (với các hướng dẫn nếu nó phức tạp hơn ./configure, make, make install) nếu phần mềm bổ sung không có trong kho của Ubuntu cho LTS hiện tại hoặc phát hành máy tính để bàn tiêu chuẩn tại thời điểm câu trả lời. Tôi cũng sẽ yêu cầu đủ thông tin để sao chép và sử dụng thành công các khóa trên hệ thống của riêng tôi.


vui lòng cập nhật với bất kỳ giải pháp nào, tôi muốn đạt được điều tương tự!
Ngày Jonathan

Gần đây tôi thực sự không có thời gian để làm việc với nó, nhưng tôi sẽ cập nhật câu hỏi này với bất cứ điều gì tôi đã làm, cho đến khi tôi nhận được câu trả lời.
Journeyman Geek

Có thể chỉnh sửa để đề cập đến 500 rep trong phông chữ lớn? Mặt khác, tuyên bố đó không có ý nghĩa gì nhiều (với 50 tiền thưởng được đăng ký với hệ thống)
Daniel Beck

Điều này vẫn còn làm việc cho bạn? (Tôi đang nói về phần sụn mới nhất được đề cập dưới đây bởi
Serge

Tôi đã không kiểm tra nó, tôi sợ, tôi đã có ý định thử giải pháp của sergey để xem nó có hoạt động không, nhưng tôi đã chạy các cửa sổ trong vài tháng qua để làm việc ở trường. Nếu vậy, tôi sẽ đăng một bình luận cho hiệu ứng đó
Journeyman Geek

Câu trả lời:


44

Trên thực tế, M1-M5 là các phím thông thường - chúng chỉ cần được kích hoạt cụ thể trước khi nhấn chúng sẽ tạo ra một scancode. tux_mark_5 đã phát triển một chương trình Haskell nhỏ gửi thông điệp SET_REPORT chính xác tới bàn phím Razer để kích hoạt các phím này và ex-parrot đã chuyển cùng mã cho Python.

Trên các hệ thống Arch Linux, cổng Python đã được đóng gói và có sẵn từ https://aur.archlinux.org/packages.php?ID=60518 .

Trên các hệ thống Debian hoặc Ubuntu, việc thiết lập cổng Python của mã tương đối dễ dàng. Bạn cần cài đặt PyUSB và libusb (với quyền root):

    aptitude install python-usb

Sau đó lấy blackwidow_enable.pytệp từ http://finch.am/projects/blackwidow/ và thực thi nó (cũng như root):

    chmod +x blackwidow_enable.py
    ./blackwidow_enable.py

Điều này sẽ kích hoạt các phím cho đến khi rút bàn phím hoặc khởi động lại máy. Để thực hiện việc này, hãy gọi tập lệnh từ bất kỳ kiểu tập lệnh khởi động nào bạn thích nhất. Để biết hướng dẫn về cách thiết lập tính năng này trong Debian, hãy xem tài liệu Debian .

Để sử dụng mã Haskell của tux_mark_5, bạn sẽ cần cài đặt Haskell và tự biên dịch mã. Các hướng dẫn này dành cho một hệ thống giống như Debian (bao gồm Ubuntu).

  1. Cài đặt GHC, libusb-1.0-0-dev và cabal (với quyền root):

    aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
    
  2. Lấy danh sách các gói:

    cabal update
    
  3. Cài đặt các ràng buộc USB cho Haskell (không cần root):

    cabal install usb
    
  4. Tải xuống tiện ích:

    git clone git://github.com/tuxmark5/EnableRazer.git
    
  5. Xây dựng tiện ích:

    cabal configure
    cabal build
    
  6. Chạy tiện ích (cũng như root):

    ./dist/build/EnableRazer/EnableRazer
    

Sau này, bạn có thể sao chép tệp nhị phân EnableRazer ở bất cứ đâu bạn muốn và chạy nó khi khởi động.

Ngay sau khi thực thi, máy chủ X sẽ thấy M1 là XF86Tools, M2 là XF86Launch5, M3 là XF86Launch6, M4 là XF86Launch7 và M5 là XF86Launch8. Các sự kiện cho FN cũng được phát ra.

Các khóa này có thể được liên kết trong xbindkey hoặc cài đặt hệ thống của KDE thành các hành động tùy ý.

Vì bàn phím của bạn có thể khác, bạn có thể cần thay đổi ID sản phẩm trong dòng 64. Mains:

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

Điều này làm việc, đi tốt. Bạn sẽ nhận được 500 rep trong một hoặc hai ngày, khi hệ thống cho phép tôi. Tôi đã tự do thêm pkg-config, cần thiết để cài đặt một điều kiện tiên quyết của gói usb haskell vào danh sách các điều kiện tiên quyết. Phần mềm hoạt động mà không có bất kỳ sửa đổi nào trên bản đen tiêu chuẩn cuối cùng của tôi, với ID sản phẩm là 1532: 010d theo lsusb. Các khóa được phát hiện trên evtest và dường như có thể sử dụng được, vì vậy điều này đã đáp ứng hoàn hảo các yêu cầu của câu hỏi.
Journeyman Geek

Ngoài ra, dường như kde không có tùy chọn ràng buộc chính, xbindkeys dường như hoạt động tho
Journeyman Geek

với ID 10e, nó hoạt động với tiêu chuẩn đen của tôi (không tối ưu). Tôi khuyên bạn nên thêm quy tắc udev để nó được khởi động tự động, không gặp sự cố, ví dụ: tạo tệp 99-enable-razer-keyboard.rules int /etc/udev/rules.d với SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010e", RUN+="/root/EnableRazer"nó (ở đây bạn có thể phải sửa đổi đường dẫn và id một lần nữa)
flolo

Rõ ràng tiện ích tôi đã viết cũng hoạt động với Razer Anansi. Đây là bài đăng trên blog của một người đã thực hiện điều này: norgelinux.blogspot.com/2012/02/razer-anasi-on-arch-linux.html
tux_mark_5

1
Tôi có Razer BlackWidow 2013 (không phải bản cuối cùng), khi tôi thực thi tập lệnh blackwidow_enable.py (có và không có root), tôi nhận được thông báo "Không tìm thấy Blackwidow.". Bạn có thể vui lòng giúp tôi gỡ lỗi này? Tôi đang dùng UbuntuGnome 13.04. Có vẻ như Product_ID khác và sau khi thay đổi ID sản phẩm, bây giờ tôi gặp lỗi này:Could not select configuration endpoint.
Adonis K. Kakoulidis

22

Razer dường như đang buộc cấu hình Synapse 2 dựa trên đám mây của họ trên tất cả người dùng hiện nay, với bản nâng cấp firmware đi kèm lên phiên bản 2. *. Khi bạn đã nâng cấp chương trình cơ sở, bạn không thể quay lại (bàn phím bị gạch hoàn toàn nếu bạn cố gắng flash nó với chương trình cơ sở cũ hơn).

'Byte ma thuật' từ chương trình Haskell trong câu trả lời của tux_mark_5 sẽ không hoạt động với phần sụn mới nhất. Thay vào đó, trình điều khiển gửi các byte này trong chuỗi khởi tạo: '0200 0403'. Các phím này kích hoạt các phím macro, nhưng bàn phím chuyển sang chế độ đặc biệt, thay vì giao thức HID tiêu chuẩn, nó sẽ gửi các gói 16 byte (có lẽ để tăng số lượng phím có thể được nhấn đồng thời). Hệ thống Linux HID hoàn toàn không thể đối phó với điều này và trong khi hầu hết các khóa hoạt động như mong đợi, các phím macro vẫn không được nhận dạng: trình điều khiển HID không cung cấp bất kỳ dữ liệu nào cho lớp đầu vào khi chúng được nhấn.

Để làm cho bàn phím của bạn vào chế độ cũ (trong đó các phím macro gửi mã khóa XF86Launch * và phím FN gửi mã khóa 202), hãy gửi các byte này: 0200 0402.

Gói đầy đủ sẽ là:

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

Đây là một chương trình rất thô sơ và bẩn thỉu tôi đã viết bằng Python 3 ít bí truyền để thực hiện nhiệm vụ. Lưu ý mã để tạo các gói điều khiển Razer trong blackwidow.bwcmd () và các lệnh LED biểu tượng Razer như một phần thưởng :)

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

Bàn phím của tôi đã được nâng cấp và tôi chưa thử. Tôi sẽ cung cấp cho nó một shot khi tôi có một hệ thống linux thích hợp một lần nữa. Thật không may, tôi không thể đưa tiền thưởng khác cho việc này - một phần do cách hệ thống tiền thưởng hoạt động. Tôi có thể sẽ chuyển qua câu trả lời đúng cho bạn nếu nó không tho.
Journeyman Geek

rõ ràng là usb mô-đun bị thiếu trên hệ thống của tôi nên điều này không hoạt động: /
Journeyman Geek

Mô-đun usb có thể nằm trong gói pyusb (hoặc python-usb hoặc một cái gì đó tương tự, tùy thuộc vào bản phân phối).
Sergey

2
Sergey cảm ơn bạn rất nhiều, nó hoạt động ngay cả với Razer BlackWidow 2013 mới hơn với PRODUCT_ID = 0x011b. Tôi chưa thử đặt bất kỳ macro nào nhưng tôi thấy các sự kiện đến từ / dev / input / by-id / usb-Razer_Razer_BlackWidow_2013-event-kbd và cả trong xev :).
binary_runner

Cảm ơn bạn, điều này là tuyệt vời. Tôi đang sử dụng nó trong một số năm nay mà không gặp rắc rối nào (cuối cùng cũng có tiếng để bình luận :)). Một nhận xét về pyusb: Vì Ubuntu vẫn không gửi pyusb cho python 3, tôi đã phải cài đặt thủ công từ nguồn bằng cách sử dụngsudo python3 setup.py install
luator 10/03/2015

8

Có lẽ điều này có thể làm sáng tỏ vấn đề (từ trang web của showkey):

Trong chế độ thô 2,6 nhân, hoặc chế độ scancode, không hoàn toàn thô. Mã quét đầu tiên được dịch thành mã khóa và khi muốn mã hóa, mã khóa được dịch trở lại. Các biến đổi khác nhau có liên quan và không có gì đảm bảo rằng kết quả cuối cùng tương ứng với những gì phần cứng bàn phím đã gửi. Vì vậy, nếu bạn muốn biết mã quét được gửi bởi các khóa khác nhau, tốt hơn là khởi động kernel 2.4. Kể từ 2.6.9, cũng có tùy chọn khởi động atkbd.softraw = 0 cho biết kernel 2.6 trả về mã quét thực tế.

Mã quét thô chỉ khả dụng trên bàn phím AT và PS / 2, và thậm chí sau đó chúng bị vô hiệu hóa trừ khi tham số kernel atkbd.softraw = 0 được sử dụng. Khi mã quét thô không có sẵn, kernel sử dụng bảng dựng sẵn cố định để tạo mã quét từ mã khóa. Do đó, setkeycodes (8) có thể ảnh hưởng đến đầu ra của showkey trong chế độ kết xuất mã quét.

Tôi sắp xem liệu showkey có kết xuất bất cứ thứ gì với các phím macro sau khi tùy chọn khởi động này được đặt không.

EDIT: Sau khi khởi động lại, không thành công, nhưng tôi đã xem xét việc thu thập dữ liệu thô từ chính các thiết bị USB. Tôi đã lưu ý những điều sau đây, thật thú vị (tôi có Razer Diamondback cũng như 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]#

Tuy nhiên, sử dụng dd để chụp đầu vào thô hoạt động trên cả chuột kim cương, trên thiết bị event-kbd, nhưng không phải trên thiết bị chuột BlackWidow.

Tôi đoán có lẽ họ không tạo ra bất kỳ đầu ra nào cho đến khi bằng cách nào đó được kích hoạt bởi trình điều khiển được cài đặt. Tuy nhiên, tôi không biết nhiều về USB Linux, vì vậy tôi thậm chí không biết điều này có hợp lý hay không. Có lẽ họ cần phải bị ràng buộc đầu tiên?

Chà, cả ba thiết bị góa phụ đen đều được ghi chú /proc/bus/input/devices, tuy nhiên chúng dường như không được liệt kê trong lsusbhoặc /proc/bus/usb/devices. Tôi không chắc chắn làm thế nào để truy cập các thiết bị này để cố gắng liên kết chúng hoặc giao diện với chúng theo bất kỳ cách nào.

event4dường như tương ứng với bàn phím thực tế, event6 với các phím macro, nhưng tôi vẫn không thể nắm bắt bất kỳ đầu vào nào từ chúng. Mong rằng tất cả đã giúp.

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

Tôi đoán rằng hệ thống phải giao tiếp với bàn phím để khởi tạo chúng - với OS X, bàn phím của tôi bị ném vào chế độ ánh sáng 'đập'. Có thể cần một số khởi tạo trước khi các phím macro của bàn phím hoạt động
Journeyman Geek

Điều tôi băn khoăn là làm thế nào để gửi thông tin đó đến các thiết bị chuột và chuột sự kiện. chuột sự kiện dường như chịu trách nhiệm, vì nó bị ràng buộc với một trình xử lý sự kiện bàn phím. Ý tôi là, về mặt lý thuyết, tất cả mọi người sẽ phải khởi tạo thiết bị và thiết lập sơ đồ mã hóa chính xác-> mã khóa với setkeycode và ittl đón các sự kiện như tổ hợp phím thông thường.
srmaddox

Có lẽ tôi chỉ có thể mở nhật thực và viết chương trình cho phép nhập / xuất thô đến / từ thiết bị. Sau đó dùng thử và lỗi có thể thắng thế.
srmaddox

jespersaur.com/drupal/book/export/html/21 điều này nên được quan tâm theo như quá trình này. Nó vượt xa kỹ năng của tôi tho.
Journeyman Geek

7

Giải pháp của tôi là dành cho Bàn phím cơ chơi game Razer BlackWidow 2013 (Số hiệu: RZ03-0039) và đã được thử nghiệm trên openSUSE 12.3.

Tôi đã sử dụng Google Dịch trên liên kết này .

Về cơ bản, nó sử dụng phiên bản sửa đổi của câu trả lời @ Sergey cho câu hỏi này, nhưng với những sửa đổi đơn giản:

  1. Của tôi PRODUCT_ID = 0x011b

  2. Trên openSUSE 12.3 của tôi, python-usb không có sẵn cho Python 3, vì vậy tôi đã chuyển đổi tập lệnh này để hoạt động với Python 2 bằng cách xóa bwcmdphương thức và định nghĩa USB_BUFFER = ...như trong liên kết từ câu trả lời của @ tux_mark_5 .


Để thuận tiện ở đây là nội dung của tôi /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()

... và tôi /etc/udev/rules.d/99-razer-balckwidow.ruleslà:

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

Nơi mà bạn đã tìm thấy một bản sao của pyusb có usb.util?
KayEss

@KayEss, tôi đang sử dụng python-usb-1.0.0-21.1.noarch.rpm. IIRC nó là một phần của kho lưu trữ mạnh mẽ của 0penSUSE 12.3. Theo rpm -qi, nguồn này có tại sourceforge.net/projects/pyusb và nguồn gói là tại obs: //build.opensuse.org/devel: Languages: python
Chen Levy

Tôi đang dùng Ubuntu và không có phiên bản đóng gói nào cho python3. Sau đó tôi đã gặp một chút rắc rối khi nhận tất cả sudo, python3, pip và virtualenv trong một dòng, nhưng bây giờ nó đã được sắp xếp và tôi đang thấy mã cho các phím macro.
KayEss

1
@KayEss, đối với Ubuntu 14.04, tôi đã sử dụng các hướng dẫn từ: github.com/walac/pyusb . Cụ thể: sudo apt-get install python libusb-1.0-0sudopip install pyusb --pre
Chen Levy

2

đó là một khởi đầu, và giá trị một upvote. Điều thú vị là các phím macro hoàn toàn không hiển thị trong showkey
Journeyman Geek

có thể khóa macro này chỉ phát ra scancode kết hợp với một khóa khác. Giống như một scancode cho macro-1, v.v?
ascobol

1
Chúng dường như hoạt động độc lập một khi được cấu hình trong windows. Tôi có thể cần phải xem xét một cách tiếp cận cấp thấp hơn. Tôi đoán là vì có sự hỗ trợ cho những con chuột được sản xuất bởi cùng một công ty với razercfg, nó sử dụng các scancodes không chuẩn. heh Nếu nó dễ dàng, tôi cho rằng tôi đã tìm thấy nó;)
Journeyman Geek

Tài liệu đó chưa được cập nhật từ năm 2002. Nó có còn hiện hành không?
Peter Mortensen

1

Xem Razer Key Mapper cho Linux .

Điều này hoạt động với tất cả các macro của thiết bị Razer, được cung cấp một số sửa đổi mã. Nếu bạn vẫn chưa có giải pháp và thiết bị của bạn không được liệt kê, tôi rất vui lòng giúp bạn định cấu hình thiết bị của mình và thêm nó vào danh sách được hỗ trợ của tôi.


Làm thế nào là điều này tốt hơn câu trả lời được chấp nhận?
Toto

1
Tôi đoán đơn giản hơn. Làm sẵn. Tất cả còn lại để làm là điền vào các tập tin cấu hình.
Camille Guay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.