รับคีย์มาโครจาก Razer BlackWidow เพื่อทำงานบน Linux


49

ผมหยิบขึ้นมาRazer BlackWidow ที่ดีที่สุดที่มีปุ่มเพิ่มเติมความหมายสำหรับแมโครที่มีการตั้งค่าการใช้เครื่องมือที่ติดตั้งบน Windows ฉันสมมติว่าสิ่งเหล่านี้ไม่ใช่ปุ่มแฟนซีจู๊นท์ของ joojoo และควรปล่อย scancodes เหมือนปุ่มอื่น ๆ

ประการแรกมีวิธีมาตรฐานในการตรวจสอบ scancodes เหล่านี้ใน Linux หรือไม่? ประการที่สองฉันจะตั้งค่าคีย์เหล่านี้ให้ทำสิ่งต่าง ๆ ในการตั้งค่าบรรทัดคำสั่งและ X-based Linux ได้อย่างไร การติดตั้ง Linux ปัจจุบันของฉันคือ Xubuntu 10.10 แต่ฉันจะเปลี่ยนไปใช้ Kubuntu เมื่อฉันแก้ไขบางสิ่งแล้ว คำตอบที่ดีควรเป็นคำทั่วไปและทั่วทั้งระบบ

สิ่งที่ฉันได้ลองมาแล้ว:

สิ่งที่ฉันต้องลอง

  • snoopy pro + reverse engineering (โอ้ที่รัก)

  • Wireshark - การซื้อขายล่วงหน้าเบื้องต้นดูเหมือนว่าจะไม่มี scancodes ที่ปล่อยออกมาเมื่อสิ่งที่ฉันคิดว่าเป็นแป้นพิมพ์ที่มีการตรวจสอบและกดปุ่ม อาจระบุว่าคีย์เพิ่มเติมเป็นอุปกรณ์แยกต่างหากหรือจำเป็นต้องเริ่มต้นใหม่อย่างใด

  • จำเป็นต้องอ้างอิงข้ามซึ่งมีเอาต์พุต lsusb จาก Linux ในสามสถานการณ์: แบบสแตนด์อโลนส่งผ่านไปยัง Windows VM โดยไม่ต้องติดตั้งไดรเวอร์และสิ่งเดียวกันกับ

  • LSUSB ตรวจพบอุปกรณ์เดียวในการติดตั้ง Linux แบบสแตนด์อโลน

  • อาจเป็นประโยชน์ในการตรวจสอบว่าหนูใช้ไดรเวอร์ Razer Synapse เดียวกันหรือไม่เนื่องจากนั่นหมายความว่าrazercfgบางรูปแบบอาจทำงานได้ (ไม่ตรวจจับดูเหมือนว่าใช้ได้กับหนูเท่านั้น)

สิ่งที่ฉันได้ผล:

  • ในระบบ Windows ที่มีไดร์เวอร์คีย์บอร์ดจะถูกมองว่าเป็นคีย์บอร์ดและอุปกรณ์ชี้ตำแหน่ง อุปกรณ์ชี้ตำแหน่งใช้ - นอกเหนือจากไดรเวอร์เมาส์มาตรฐานของคุณ - ไดรเวอร์สำหรับสิ่งที่เรียกว่า Razer Synapse

  • ไดรเวอร์เมาส์ที่เห็นใน Linux ภายใต้evdevและlsusbเช่นกัน

  • เห็นได้ชัดว่ามีอุปกรณ์เดี่ยวภายใต้ OS X แม้ว่าฉันยังไม่ได้ลองlsusbเทียบเท่า

  • แป้นพิมพ์จะเข้าสู่โหมดการเต้นแบ็คไลท์ใน OS X เมื่อมีการเริ่มต้นกับไดรเวอร์ นี่น่าจะบ่งบอกว่ามีบางส่วนของการเริ่มต้นการเริ่มต้นส่งไปยังแป้นพิมพ์เมื่อเปิดใช้งาน

  • ในความเป็นจริงแล้วพวกมันคือกุญแจจู๊ปจู

ขยายคำถามนี้เล็กน้อย:

ฉันสามารถเข้าถึงระบบ Windows ได้ดังนั้นหากฉันจำเป็นต้องใช้เครื่องมือใด ๆ เพื่อช่วยตอบคำถาม ฉันสามารถลองใช้กับระบบที่มีและไม่มียูทิลิตี้การตั้งค่า ผลลัพธ์ที่คาดหวังยังคงทำให้คีย์เหล่านั้นสามารถใช้งานได้บน Linux อย่างไรก็ตาม

ฉันยังตระหนักว่านี่เป็นฮาร์ดแวร์เฉพาะของตระกูล ฉันยินดีที่จะทดสอบสิ่งใดก็ตามที่สมเหตุสมผลบนระบบ Linux หากฉันมีคำแนะนำโดยละเอียด - สิ่งนี้ควรเปิดคำถามให้กับผู้ที่มีทักษะด้าน Linux แต่ไม่สามารถเข้าถึงแป้นพิมพ์นี้ได้

ผลลัพธ์ขั้นต่ำที่ฉันต้องการ:

ฉันต้องคีย์เหล่านี้ตรวจพบและใช้งานได้ในใด ๆแฟชั่นใด ๆ ของหลักกราฟิกปัจจุบันอูบุนตูสายพันธุ์และธรรมชาติต้องทำงานกับแป้นพิมพ์ของฉัน คุกกี้เสมือนจริงและอุปกรณ์ประกอบฉากที่คลั่งไคล้ถ้ามันเป็นสิ่งที่บรรจุอย่างดีและสามารถใช้งานได้โดยผู้ใช้ทั่วไป

ฉันจะต้องมีรหัสเรียบเรียงที่จะทำงานในระบบของฉันหรือแหล่งที่มาที่ฉันสามารถรวบรวม (พร้อมกับคำแนะนำถ้ามันซับซ้อนมากขึ้นกว่า./configure, make, make install) ถ้าซอฟต์แวร์เพิ่มเติมไม่ได้อยู่ในที่เก็บ Ubuntu สำหรับ LTS ปัจจุบันหรือการเปิดตัวเดสก์ท็มาตรฐานในเวลาที่ คำตอบ. ฉันยังต้องการข้อมูลที่เพียงพอในการทำซ้ำและใช้กุญแจในระบบของฉันเอง


โปรดอัปเดตด้วยโซลูชั่นใด ๆ ฉันชอบที่จะประสบความสำเร็จเหมือนกัน!
โจนาธานเดย์

ฉันไม่ได้มีเวลาที่จะทำมันเมื่อเร็ว ๆ นี้ แต่ฉันจะปรับปรุงคำถามนี้กับสิ่งที่ฉันได้ทำไปจนกว่าฉันจะได้รับคำตอบ
Geek

อาจแก้ไขพูดถึงตัวแทน 500 ในแบบอักษรขนาดใหญ่หรือไม่ ไม่เช่นนั้นการประกาศจะไม่สมเหตุสมผล (จาก 50 ค่าสมาชิกที่ลงทะเบียนกับระบบ)
Daniel Beck

สิ่งนี้ยังใช้ได้กับคุณหรือไม่? (ฉันกำลังพูดถึงเฟิร์มแวร์ล่าสุดที่กล่าวถึงด้านล่างโดย Sergey)
Adonis K. Kakoulidis

ฉันไม่ได้ทดสอบฉันกลัวว่าฉันตั้งใจจะลองใช้วิธีแก้ปัญหาของ sergey เพื่อดูว่ามันใช้งานได้หรือไม่ แต่ฉันใช้งาน windows เป็นเวลาสองสามเดือนที่ผ่านมาสำหรับการเรียน ถ้าเป็นเช่นนั้นฉันจะโพสต์ความคิดเห็นต่อเอฟเฟกต์นั้น
Journeyman Geek

คำตอบ:


44

ในความเป็นจริงแล้วปุ่ม M1-M5 เป็นปุ่มปกติ - พวกเขาเพียงแค่ต้องเปิดใช้งานโดยเฉพาะก่อนกดปุ่มจะสร้าง scancode tux_mark_5 พัฒนาโปรแกรม Haskell ขนาดเล็กซึ่งส่งข้อความ SET_REPORT ที่ถูกต้องไปยังคีย์บอร์ด Razer เพื่อเปิดใช้งานปุ่มเหล่านี้และอดีตนกแก้วส่งรหัสเดียวกันให้ Python

ในระบบ Arch Linux พอร์ตหลามได้รับการบรรจุและสามารถใช้ได้จากhttps://aur.archlinux.org/packages.php?ID=60518

ในระบบ Debian หรือ Ubuntu การตั้งค่าพอร์ต Python ของรหัสนั้นค่อนข้างง่าย คุณต้องติดตั้ง PyUSB และ libusb (เป็น root):

    aptitude install python-usb

จากนั้นหยิบblackwidow_enable.pyไฟล์จากhttp://finch.am/projects/blackwidow/และเรียกใช้งาน (เช่นเดียวกับรูท):

    chmod +x blackwidow_enable.py
    ./blackwidow_enable.py

สิ่งนี้จะเปิดใช้งานปุ่มต่างๆจนกว่าจะถอดปลั๊กแป้นพิมพ์หรือรีบูตเครื่อง หากต้องการเรียกสคริปต์นี้ถาวรจากรูปแบบใด ๆ ของสคริปต์เริ่มต้นที่คุณต้องการมากที่สุด สำหรับคำแนะนำเกี่ยวกับวิธีการตั้งค่านี้ใน Debian มีลักษณะที่เป็นเอกสาร Debian

ในการใช้รหัส Haskell ของ tux_mark_5 คุณจะต้องติดตั้ง Haskell และรวบรวมรหัสด้วยตัวคุณเอง คำแนะนำเหล่านี้มีไว้สำหรับระบบที่เหมือนกับ Debian (รวมถึง Ubuntu)

  1. ติดตั้ง GHC, libusb-1.0-0-dev และ cabal (เป็น root):

    aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
    
  2. ดึงรายการแพคเกจ:

    cabal update
    
  3. ติดตั้งการผูก USB สำหรับ Haskell (ไม่จำเป็นต้องรูท):

    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:

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

งานนี้ไปได้ดี คุณจะได้รับ 500 ตัวแทนในหนึ่งหรือสองวันเมื่อระบบอนุญาตให้ฉัน ฉันได้เพิ่มเสรีภาพในการเพิ่ม pkg-config ซึ่งจำเป็นต้องติดตั้งข้อกำหนดเบื้องต้นของแพคเกจ haskell usb ลงในรายการข้อกำหนดเบื้องต้น ซอฟต์แวร์ทำงานได้โดยไม่มีการดัดแปลงใด ๆ กับ blackwidow มาตรฐานขั้นสูงสุดของฉันด้วยรหัสผลิตภัณฑ์ 1532: 010d ตาม lsusb ตรวจพบกุญแจบน evtest และดูเหมือนว่าใช้งานได้ดังนั้นสิ่งนี้จึงเป็นไปตามข้อกำหนดของคำถามอย่างสมบูรณ์
Journeyman Geek

นอกจากนี้ KDE dosen ไม่มีตัวเลือกการเชื่อมโยงที่สำคัญดูเหมือนว่า xbindkeys ทำงานได้เหมือนกัน
Journeyman Geek

ด้วย ID 10e ใช้งานได้กับ blackwidow มาตรฐานของฉัน (ไม่ใช่สุดยอด) ฉันแนะนำให้เพิ่มกฎ udev ดังนั้นมันจึงเริ่มต้นโดยอัตโนมัติโดยไม่มีปัญหาเช่นสร้างไฟล์ 99-enable-razer-keyboard.rules int /etc/udev/rules.d ด้วยSUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="1532", ATTR{idProduct}=="010e", RUN+="/root/EnableRazer"(ในที่นี้คุณอาจต้องแก้ไข เส้นทางและรหัสอีกครั้ง)
flolo

เห็นได้ชัดว่ายูทิลิตี้ที่ฉันเขียนทำงานได้กับ Razer Anansi เช่นกัน นี่คือโพสต์บล็อกของคนที่ดึงสิ่งนี้ออกมา: norgelinux.blogspot.com/2012/02/razer-anasi-on-arch-linux.html
tux_mark_5

1
ฉันมี Razer BlackWidow 2013 (ไม่ใช่สุดยอด) เมื่อฉันรันสคริปต์ blackwidow_enable.py (โดยมีและไม่มีรูท) ฉันจะได้รับข้อความ "Blackwidow ไม่พบ" คุณช่วยฉันแก้ปัญหาได้ไหม ฉันใช้ UbuntuGnome 13.04 ดูเหมือนว่า Product_ID จะแตกต่างกันและหลังจากเปลี่ยนรหัสผลิตภัณฑ์ตอนนี้ฉันได้รับข้อผิดพลาดนี้:Could not select configuration endpoint.
Adonis K. Kakoulidis

22

ดูเหมือนว่า Razer จะบังคับให้ผู้กำหนดค่า Synapse 2 บนคลาวด์กับผู้ใช้ทุกคนในปัจจุบันพร้อมกับอัพเกรดเฟิร์มแวร์เป็นเวอร์ชัน 2 * เมื่อคุณอัปเกรดเฟิร์มแวร์แล้วคุณจะไม่สามารถย้อนกลับได้ (แป้นพิมพ์ถูกปิดกั้นอย่างสมบูรณ์หากคุณพยายามแฟลชด้วยเฟิร์มแวร์รุ่นเก่ากว่า)

'bytes magic' จากโปรแกรม Haskell ในคำตอบของ tux_mark_5จะไม่ทำงานกับเฟิร์มแวร์ล่าสุด แต่ไดรเวอร์ส่งไบต์เหล่านี้ในระหว่างลำดับการเริ่มต้น: '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 ที่มีความลับน้อยกว่าเพื่อทำงาน สังเกตรหัสเพื่อสร้างชุดควบคุม Razer ใน blackwidow.bwcmd () และคำสั่ง LED โลโก้ Razer เป็นโบนัส :)

#!/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 หายไปในระบบของฉันดังนั้นจึงใช้งานไม่ได้: /
Journeyman Geek

โมดูล usb อาจอยู่ในแพ็คเกจ pyusb (หรือ python-usb หรืออะไรที่คล้ายกันขึ้นอยู่กับ distro)
Sergey

2
Sergey ขอบคุณมากมันใช้งานได้แม้กับ Razer BlackWidow 2013 รุ่นใหม่ที่มี PRODUCT_ID = 0x011b ฉันยังไม่ได้พยายามตั้งค่าแมโครใด ๆ แต่ฉันเห็นเหตุการณ์ที่มาจาก / dev / input / by-id / usb-Razer_Razer_BlackWidow_2013-event-kbd และใน xev :)
binary_runner

ขอบคุณนี่เยี่ยมมาก ฉันใช้มันมาหลายปีแล้วโดยไม่มีปัญหาใด ๆ (ในที่สุดก็มีชื่อเสียงที่จะแสดงความคิดเห็น :)) หนึ่งความคิดเห็นใน pyusb: ตั้งแต่ Ubuntu ยังไม่จัดส่ง pyusb สำหรับหลาม 3 ผมต้องติดตั้งด้วยตนเองจากแหล่งที่ใช้sudo python3 setup.py install
luator

8

บางทีนี่อาจทำให้เกิดปัญหาบางอย่าง (จาก manpage ของ showkey):

ในโหมด raw 2.6 kernels หรือโหมด scancode นั้นไม่ได้ดิบมากนัก รหัสสแกนจะถูกแปลเป็นรหัสคีย์ก่อนและเมื่อต้องการให้มีการสแกนรหัสกุญแจจะถูกแปลกลับ มีการเปลี่ยนแปลงหลายอย่างที่เกี่ยวข้องและไม่มีการรับประกันใด ๆ เลยว่าผลลัพธ์สุดท้ายจะตรงกับสิ่งที่ฮาร์ดแวร์แป้นพิมพ์ส่ง ดังนั้นหากคุณต้องการทราบรหัสสแกนที่ส่งมาจากปุ่มต่าง ๆ มันจะดีกว่าถ้าจะใช้เคอร์เนล 2.4 ตั้งแต่ 2.6.9 นอกจากนี้ยังมีตัวเลือกการบูต atkbd.softraw = 0 ที่บอกให้เคอร์เนล 2.6 ส่งคืนรหัสสแกนที่แท้จริง

รหัสการสแกนแบบดิบจะใช้ได้เฉพาะบนแป้นพิมพ์ 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 เพื่อดักจับการป้อนข้อมูลดิบทำงานได้บนเมาส์ทั้งสองแบ็คแบ็คบนอุปกรณ์ event-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

สิ่งที่ฉันสงสัยคือวิธีการส่งข้อมูลนั้นไปยังอุปกรณ์เมาส์และเมาส์เหตุการณ์ ดูเหมือนว่า event-mouse จะรับผิดชอบเนื่องจากถูกผูกไว้กับตัวจัดการเหตุการณ์ของคีย์บอร์ด ฉันหมายถึงตามหลักทฤษฏีทุกอย่างจะต้องมีการเริ่มต้นอุปกรณ์และตั้งค่าแผนที่ scancode-> keycode ที่เหมาะสมพร้อม setkeycode และรับเหตุการณ์เป็นการกดแป้นปกติ
srmaddox

บางทีฉันสามารถเปิด eclipse และเขียนโปรแกรมเพื่อให้ raw เข้า / ออกจากอุปกรณ์ จากนั้นการทดลองและข้อผิดพลาดสามารถเหนือกว่า
srmaddox

jespersaur.com/drupal/book/export/html/21สิ่งนี้น่าสนใจเท่าที่กระบวนการดำเนินการ มันไกลเกินกว่าความสามารถของฉันดังนั้น
Geek

7

โซลูชันของฉันสำหรับRazer BlackWidow 2013 Mechanical Gaming Keyboard (หมายเลขรุ่น: RZ03-0039)และได้รับการทดสอบบน openSUSE 12.3

ฉันใช้ Google Translate ในลิงค์นี้

โดยทั่วไปจะใช้คำตอบ @ Sergeyรุ่นแก้ไขสำหรับคำถามนี้ แต่ด้วยการแก้ไขง่าย ๆ :

  1. ของฉัน PRODUCT_ID = 0x011b

  2. เมื่อวันที่ฉัน openSUSE 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 เป็นส่วนหนึ่งของคลังเก็บ stadard ของ 0penSUSE 12.3 ตามrpm -qiแหล่งที่มาคือsourceforge.net/projects/pyusbและแหล่งแพ็กเกจอยู่ที่ obs: //build.opensuse.org/devel: ภาษา: python
Chen Levy

ฉันใช้งาน Ubuntu และไม่มีรุ่นที่จัดทำแพคเกจสำหรับ python3 ฉันมีปัญหาเล็กน้อยในการรับ sudo, python3, pip และ virtualenv ทั้งหมดในบรรทัด แต่ตอนนี้มันเรียงลำดับแล้วและฉันเห็นรหัสสำหรับปุ่มมาโคร
KayEss

1
@KayEss สำหรับ Ubuntu 14.04 ผมใช้คำแนะนำจาก: github.com/walac/pyusb โดยเฉพาะ: sudo apt-get install python libusb-1.0-0sudoและpip install pyusb --pre
เฉินเลวี

2

มันเป็นการเริ่มต้นและคุ้มค่ากับการลงคะแนน ที่น่าสนใจปุ่มมาโครจะไม่ปรากฏใน Showkeys เลย
Journeyman Geek

บางทีมาโครคีย์นี้ปล่อย scancode ร่วมกับคีย์อื่นเท่านั้น ชอบ scancode สำหรับ macro-1 หรือไม่?
ascobol

1
ดูเหมือนว่าพวกเขาจะทำงานอย่างอิสระเมื่อกำหนดค่าใน windows ฉันอาจต้องพิจารณาวิธีการระดับล่าง ฉันเดาว่าเนื่องจากมีการสนับสนุนหนูที่ผลิตโดย บริษัท เดียวกันกับrazercfgโดยใช้ scancodes ที่ไม่ได้มาตรฐาน หึ ถ้ามันเป็นเรื่องง่ายฉันคิดว่าฉันจะได้พบมัน)
Journeyman Geek

เอกสารดังกล่าวไม่ได้รับการปรับปรุงตั้งแต่ปี 2002 ยังเป็นปัจจุบันอยู่หรือไม่?
Peter Mortensen

1

ดูRazer สำคัญ Mapper สำหรับลินุกซ์

ใช้งานได้กับมาโครของอุปกรณ์ Razer ทุกรุ่นเนื่องจากมีการดัดแปลงโค้ด หากคุณยังไม่มีโซลูชันและอุปกรณ์ของคุณไม่มีอยู่ในรายการฉันยินดีที่จะช่วยคุณกำหนดค่าอุปกรณ์ของคุณและเพิ่มลงในรายการที่สนับสนุนของฉัน


คำตอบนี้ดีกว่าคำตอบที่ยอมรับได้อย่างไร
โตโต้

1
ง่ายกว่าฉันเดา ที่ทำไว้ล่วงหน้า สิ่งที่เหลืออยู่ที่ต้องทำคือเติมไฟล์ปรับแต่ง
Camille Guay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.