M1-M5 sebenarnya adalah kunci biasa - mereka hanya perlu diaktifkan secara khusus sebelum menekannya akan menghasilkan kode pindai. tux_mark_5 mengembangkan program Haskell kecil yang mengirimkan pesan SET_REPORT yang benar ke keyboard Razer untuk mengaktifkan tombol ini, dan ex-parrot mem-porting kode yang sama ke Python.
Pada sistem Arch Linux, port Python telah dikemas 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.py
file 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 membuatnya permanen, panggil skrip dari gaya skrip startup apa pun yang paling Anda sukai. Untuk petunjuk tentang cara menyiapkan ini di Debian, lihat dokumentasi Debian.
Untuk menggunakan kode Haskell tux_mark_5, Anda harus menginstal Haskell dan mengompilasi kodenya sendiri. Petunjuk ini untuk sistem mirip Debian (termasuk Ubuntu).
-
Instal GHC, libusb-1.0-0-dev dan cabal (sebagai root):
aptitude install ghc libusb-1.0-0-dev cabal-install git pkg-config
-
Ambil daftar paket:
cabal update
-
Instal binding USB untuk Haskell (tidak perlu root):
cabal install usb
-
Unduh utilitas:
git clone git://github.com/tuxmark5/EnableRazer.git
-
Bangun utilitas:
cabal configure cabal build
-
Jalankan utilitas (juga sebagai root):
./dist/build/EnableRazer/EnableRazer
Setelah ini, Anda dapat menyalin biner EnableRazer di mana pun Anda mau dan menjalankannya saat startup.
Segera setelah eksekusi, server X 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 di dalam xbindkeys atau pengaturan sistem KDE untuk tindakan arbitrer.
Karena keyboard Anda mungkin berbeda, Anda mungkin perlu mengubah ID produk di Main.hs baris 64:
withDevice 0x1532 0x<HERE GOES YOUR KEYBOARD's PRODUCT ID> $ \dev -> do
Razer tampaknya memaksakan konfigurasi Synapse 2 berbasis cloud mereka pada semua pengguna saat ini, disertai peningkatan firmware ke versi 2.*. Setelah mengupgrade firmware, Anda tidak dapat kembali (keyboard benar-benar rusak jika Anda mencoba mem-flash-nya dengan firmware lama).
'Byte ajaib' dari program Haskell di jawaban tux_mark_5 tidak akan berfungsi dengan firmware terbaru. Sebaliknya, driver mengirimkan byte ini selama urutan inisialisasi:'0200 0403'. Ini mengaktifkan tombol makro, tetapi keyboard memasuki mode khusus di mana alih-alih protokol HID standar, ia mengirimkan paket 16-byte (mungkin untuk menambah jumlah tombol yang dapat ditekan secara bersamaan). Sistem HID Linux tidak dapat mengatasi hal ini, dan meskipun sebagian besar tombol berfungsi seperti yang diharapkan, tombol makro tetap tidak dikenali:driver HID tidak memasukkan data apa pun ke lapisan input saat ditekan.
Untuk membuat keyboard Anda memasuki mode lawas (di mana tombol makro mengirim kode kunci XF86Launch*, dan tombol FN mengirimkan 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
Ini adalah program yang sangat kasar dan kotor yang saya tulis dengan Python 3 yang kurang esoteris 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()
Mungkin ini bisa menjelaskan masalah ini (dari halaman manual showkey):
Dalam mode mentah kernel 2.6, atau mode scancode, tidak terlalu mentah sama sekali. Kode pindai pertama-tama diterjemahkan ke kode kunci, dan ketika kode pindai diinginkan, kode kunci diterjemahkan kembali. Berbagai transformasi terlibat, dan tidak ada jaminan sama sekali bahwa hasil akhir sesuai dengan apa yang dikirim oleh perangkat keras keyboard. Jadi, jika Anda ingin mengetahui kode pindaian yang dikirim oleh berbagai kunci, lebih baik mem-boot kernel 2.4. Sejak 2.6.9 ada juga opsi boot atkbd.softraw=0 yang memberi tahu kernel 2.6 untuk mengembalikan kode pindai yang sebenarnya.
Kode pindaian mentah hanya tersedia pada keyboard AT dan PS/2, dan bahkan kode tersebut dinonaktifkan kecuali jika parameter kernel atkbd.softraw=0 digunakan. Ketika kode pindai mentah tidak tersedia, kernel menggunakan tabel bawaan tetap untuk menghasilkan kode pindai dari kode kunci. Dengan demikian, setkeycodes(8) dapat memengaruhi keluaran showkey dalam mode dump kode pindai.
Saya akan melihat apakah showkey akan membuang apa pun dengan kunci makro setelah opsi boot ini disetel.
EDIT:Setelah reboot, tidak berhasil, tetapi saya ingin menangkap input mentah dari perangkat USB itu sendiri. Menariknya, saya mencatat hal berikut (saya memiliki Razer Diamondback dan juga BlackWidow):
[[email protected] by-id]# pwd
/dev/input/by-id
[[email protected] 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
[[email protected] 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 menduga mungkin mereka tidak menghasilkan output apa pun sampai diaktifkan oleh driver yang diinstal. Saya tidak tahu banyak tentang USB Linux, jadi saya bahkan tidak tahu apakah ini masuk akal. Mungkin mereka perlu diikat dulu?
Nah, ketiga perangkat janda hitam tersebut tercantum dalam /proc/bus/input/devices
, namun tampaknya tidak disebutkan dalam lsusb
atau /proc/bus/usb/devices
. Saya tidak yakin cara mengakses perangkat ini untuk mencoba mengikatnya atau berinteraksi dengannya dengan cara apa pun.
event4
tampaknya sesuai dengan keyboard sebenarnya, event6 dengan tombol makro, tapi saya masih tidak bisa menangkap input apa pun darinya. Semoga semuanya membantu.
[[email protected] input]# ls
devices handlers
[[email protected] 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
[[email protected] input]# pwd
/proc/bus/input
[[email protected] 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
[[email protected] input]#