Bàn phím phím cứng?


19

Tôi đang cố gắng tìm cách để ánh xạ lại các phím bàn phím một cách mạnh mẽ.
Tôi đã thử sử dụng xmodmap và setxkbmap, nhưng chúng không hoạt động cho một ứng dụng cụ thể. Các lệnh như vậy hoạt động cho các cửa sổ / ứng dụng thông thường khác trên X tho.

Tôi nghĩ rằng ứng dụng có thể đang đọc dữ liệu thô của bàn phím và bỏ qua đầu vào X?

Vậy, làm thế nào để ánh xạ lại các khóa mà không sử dụng xmodmap và setxkbmap? nếu có thể được thực hiện bằng cách sử dụng một số phần mềm.

Tôi cũng đã thử xkeycaps, xkbcomp, nhưng không thử loadkey, vì nó đang chạy trên X.

Tôi thấy ở đây tôi có thể thử setkeycodes, "bởi vì sau khi gán mã khóa nhân, nút sẽ hoạt động trong xorg" , nhưng tôi cũng thấy rằng "bạn không thể sử dụng 'setkeycodes' trên bàn phím USB" , đó là trường hợp của tôi (tôi quan tâm đến trường hợp này ai đó làm cho nó hoạt động trên ps2 vì tôi nghĩ rằng tôi có thể sử dụng một bộ chuyển đổi).

Điều này có vẻ đầy hứa hẹn "Map scancodes to keycodes" , nhưng sau một vài thử nghiệm không có gì thay đổi, đây là:
Tôi tìm thấy mã khóa "36" (phím "j") tại vt1 với showkey
tôi tìm thấy scancode "7e" (bàn phím ".") Tại vt1 vớishowkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

Quan sát: không hoạt động với: KEYBOARD_KEY_7e=j

Một số cách khác để thay thế (bởi @ vinc17) để tìm các khóa:
evtest /dev/input/by-id/... hoặc
input-kbd 3(đặt chỉ mục id được tìm thấy ls -l /dev/input/by-id/*từ ví dụ event3)

PS.: * Nếu bạn quan tâm đến việc tự kiểm tra, chủ đề liên quan cho ứng dụng này là: http://forums.thedarkmod.com/topic/14266-keyboard-su-in-new-version-108/ Các vấn đề tôi có giống nhau: một số khóa (KP_Decimal, DownArrow, UpArrow, RightArrow) bị bỏ qua và được xem xét tất cả có cùng giá trị ở đó "0x00"


Các tập tin cập nhật nên /etc/udev/hwdb.bin, không /lib/udev/hwdb.bin. Nhưng mặc dù tệp này được cập nhật chính xác, nhưng nó cũng không hoạt động với tôi, ngay cả sau khi khởi động lại. Có lẽ thiếu một cái gì đó trong tài liệu. Về điều này: bug.freedesktop.org/show_orms.cgi?id=82311
vinc17

@ vinc17 điều đó thực sự thú vị, ngay sau khi tôi có thể thử lại, tôi nghĩ chúng ta phải tìm tập tin cài đặt đó và cố gắng bắt chước nó, thx!
Sức mạnh Bảo Bình

1
Vấn đề của tôi là do các dòng KEYBOARD_KEY_ bắt đầu với 2 khoảng trắng thay vì một khoảng trống (điều này không được ghi lại và tôi không nhận được thông báo lỗi!). Tôi không biết cho bạn, nhưng với bàn phím USB của tôi, showkey --scancodessẽ không cung cấp cho các scancodes udev mong đợi (các giá trị là khác nhau); các input-kbdtiện ích cung cấp cho các scancodes chính xác.
vinc17

1
Các evtesttiện ích cũng nên cung cấp cho bạn scancodes đúng: sau khi nhập một phím, bạn sẽ nhận được 2 dòng và là người đầu tiên nên kết thúc với một cái gì đó của hình thức code 4 (MSC_SCAN), value xxx, nơi xxxlà scancode. Nhưng trình điều khiển cho bàn phím của tôi bị lỗi và tôi không nhận được MSC_SCANdòng này cho một số phím tôi muốn sắp xếp lại. Đó là lý do tại sao tôi sử dụng input-kbd, trong đó liệt kê tất cả các scancodes cho thiết bị được chọn.
vinc17

1
Tôi đã đăng thông tin chi tiết trong một câu trả lời. Bây giờ, tôi không chắc chắn rằng 36 hoặc 7002c hoạt động như một giá trị. Tôi nghĩ rằng bạn cần mã định danh mã khóa. Xem câu trả lời của tôi.
vinc17

Câu trả lời:


17

Trước tiên, hãy tìm scancode của khóa cần được ánh xạ lại, ví dụ với evtesttiện ích. Một dòng như dòng sau (có MSC_SCANtrong đó) phải là đầu ra:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

tiếp theo là cái thứ hai cho mã khóa hiện tại. Nếu không có MSC_SCANdòng nào là đầu ra, thì đây là do lỗi trình điều khiển kernel, nhưng vẫn có thể tìm thấy scancode với input-kbdtiện ích; evtestnên đã đưa ra mã khóa, để dễ dàng tìm thấy dòng tương ứng trong input-kbdđầu ra (ví dụ: bằng cách sử dụng grep).

Khi đã xác định được các scancodes của các khóa được ánh xạ lại, hãy tạo một tệp như /etc/udev/hwdb.d/98-custom-keyboard.hwdbchứa các bản sửa lỗi. Phần đầu của tập tin /lib/udev/hwdb.d/60-keyboard.hwdbcung cấp một số thông tin. Trong trường hợp của tôi (hoạt động), tôi có:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(Trước udev 220, tôi phải sử dụng keyboard:usb:v05ACp0221*cho dòng đầu tiên.)

Các evdev:chuỗi phải có mặt tại đầu dòng. Lưu ý rằng các chữ cái trong nhà cung cấp và id sản phẩm phải là chữ in hoa. Mỗi KEYBOARD_KEY_cài đặt phải có chính xác một khoảng trắng trước đó (lưu ý: một dòng không có khoảng trắng sẽ đưa ra thông báo lỗi và một dòng có hai khoảng trắng được bỏ qua âm thầm với các phiên bản udev cũ). KEYBOARD_KEY_được theo sau bởi scancode theo hệ thập lục phân (giống như những gì cả hai evtestinput-kbdcho). Các giá trị hợp lệ có thể được lấy từ evtestđầu ra hoặc input-kbdđầu ra, hoặc thậm chí từ /usr/include/linux/input.htệp: ví dụ, KEY_102NDsẽ cung cấp 102nd(bằng cách loại bỏ KEY_và chuyển đổi sang chữ thường), mà tôi đã sử dụng ở trên.

Sau khi tệp được lưu, gõ:

udevadm hwdb --update

để (tái) xây dựng cơ sở dữ liệu /etc/udev/hwdb.bin(bạn có thể kiểm tra dấu thời gian của nó). Sau đó,

udevadm trigger --sysname-match="event*"

sẽ đưa các cài đặt mới vào tài khoản. Bạn có thể kiểm tra với evtest.

Vào năm 2014, udev được phát hành có thông tin không đầy đủ / lỗi /lib/udev/hwdb.d/60-keyboard.hwdb, nhưng bạn có thể xem phiên bản phát triển mới nhất của tệp và / hoặc báo cáo lỗi của tôi và thảo luận về các vấn đề về tài liệu và khoảng cách.

Nếu điều này không làm việc, vấn đề có thể được tìm thấy sau khi tạm thời tăng mức độ log của udevdvới udevadm control(xem udevadm (8) người đàn ông trang để biết chi tiết).

Đối với udevcác phiên bản cũ như 204, phương pháp này vẫn hoạt động.


Khi tôi chạy các lệnh udevadm, tệp được cập nhật là /lib/udev/hwdb.bin, tôi đã xem blessKEYBOARD_KEY_70085xuất hiện ở cuối. Tôi nghĩ rằng ubfox 14.04 được cấu hình (bảo vệ?) Theo cách này. Tôi đã thử udevadm control --log-priority=debug. dựa trên lsusb(045e: 0750) bàn phím của tôi được như thế keyboard:usb:v045ep0750*, nhưng tôi cũng đã thử keyboard:usb:v*p*. Tôi đoán là điều này /etc/udev/hwdb.binnên được cập nhật nhưng thậm chí không tồn tại.
Sức mạnh Bảo Bình

Khi tôi đọc ở đây , có thể giống như tôi đang sử dụng lệnh này udevadm hwdb --usr --update, mặc dù tôi đã không làm vậy.
Sức mạnh Bảo Bình

Sau khi udevadm hwdb --updatechúng tôi đã copy /lib/udev/hwdb.binđến /etc/udev/hwdb.binvà ran strace udevadm trigger --sysname-match="event*"và các tập tin hwdb.bindường như chưa được đọc bởi nó (nếu nó giống như công trình này).
Sức mạnh Bảo Bình

1
@AquariusPower Có, có thể có một lỗi cụ thể của Ubuntu (Tôi đang sử dụng Debian / không ổn định). Để xem liệu cơ sở dữ liệu được đọc khi làm udevadm trigger ..., xem thử nghiệm của tôi ở đây . Lưu ý rằng trước khi chạy udevadm trigger ..., bạn cần đảm bảo rằng thời gian sửa đổi của tệp đã được cập nhật, nếu không thời gian truy cập sẽ không được cập nhật khi tệp được đọc.
vinc17

1
@AquariusPower udevadm --version: 215 (và phiên bản gói udev: 215-7). Nhờ udevadm trigger ..., bạn không cần phải khởi động lại (trừ khi bạn muốn xóa cài đặt, AFAIK). Nhưng bạn có thể muốn thử khởi động lại để xem có ảnh hưởng gì không.
vinc17
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.