買了 Apple Wireless Keyboard 2011 日本 JIS 版暨第一次送 Linux kernel patch 就失手

DSC_1155

因為在辦公室使用的 Ducky 1087 機械式鍵盤,聲響屢屢受到同事側目(特別在我碼得特別來勁、或遇到解不掉的 bug 時),所以決定忍痛賣掉,這裡說的忍痛不只是心痛,還有左臂長期以來的疼痛。無論如何,我還是需要一個方便工作、好打(或至少不難打)的新鍵盤。

然後我調查了一下,扣掉會吵到、嚇到人的機械式鍵盤,符合「方便工作」、「好打」條件,再加上「不要 100% 大小」、「我負擔得起」的款式,其實沒多少可選,於是我就買了 Apple Wireless Keyboard(2011年版)。

照片上有兩「片」鍵盤,沒錯。家裡的 Mac mini 搭配的 Apple Pro Keyboard 在經年累月的耗損之下,也愈來愈會卡鍵、愈來愈難打了,所以一不做、二不休,一次買兩片,宜蘭、臺北兩處用。因為網拍上有很便宜的日本 JIS 式排列版鍵盤,而我本身對日文打字還是有一定程度的需求,所以 JIS 式排列版鍵盤對我來說算是實用。

Mac mini 搭配 Mac OS X 用 Apple Wireless Keyboard 當然是沒有問題的;但是我平日使用的主力 ThinkPad X230i / Arch Linux / KDE 則不免需要折騰一下。

雖然它看似可以被 Linux 正常驅動,但是很奇怪的就是 ‘fn’ 鍵沒有作用,這代表我無法使用 fn 鍵搭配四方向鍵操作 Home, End, Page Up, Page Down。

我追蹤了一下問題成因,利用 bluetoothctl 掃描硬體資訊,發現 hid-apple 模組並未納入 Apple Wireless Keyboard 2011 的 JIS 版,也就是廠商代號 (vendor ID) 0x05ac (Apple)、產品代號 (product ID) 0x0257 不在其中,所以針對 fn 鍵的程式碼未能正確套用在這款鍵盤,這款鍵盤被 Linux 當成了一般的藍牙鍵盤來驅動。

於是我把缺少的幾行程式補上去、證實可以正常使用 fn 鍵之後,開始了我跌跌撞撞的送 patch 歷程。

一開始我跑到 Linux kernel 的 Bugzilla 系統去回報,卻沒有看清楚這是給 mainline 使用的,在上面回報 3.12.9 的問題,一開始就錯了,而我沒有確實讀過 Documentation/SubmittingPatches 文件,沒有照正確的格式、方法,只是憑著「我找到解法了」的小屁孩樣的熱血、如無頭蒼蠅般亂竄,還被 Alan Cox 大神回以簡短一行提示,實在是很慚愧。

接著我改往 linux-input mailing list 上面送 patch,無奈可能還是因為不得要領,過年這幾天還是見不到我的 patch 被維護者 review 的跡象。

於是我跌跌撞撞地反覆修正我的 patch,最後才發現使用 git format-patch 搭配 git send-email 是最簡單省事的。畢竟 Git 原本就是為了維護 Linux kernel 而生的。

用 Git 從 The Linux Kernel Archives 抓回 mainline (此時是 3.14-rc1)的 source code 後,先 git checkout -b apple-hid 用一個新的分支來修問題。

把問題修好後,commit 異動,此時編輯 commit message 請記得遵循規定格式。第一行會被當成 commit 的標題,請照類似這樣的格式寫:

HID: Add Apple wireless keyboard 2011 JIS model support.

開頭要標明這份 patch 是屬於哪個子系統 (subsystem),譬如我這次送的問題是屬於 HID (Human Interface Device) 子系統,就要確實標明。

跨一行後,敘述此 commit 的主要目的、功用等說明。這會被當成 commit 的內文

Commit 完成後,就可以使用 git format-patch –stdout –signoff master 先以螢幕輸出檢查這份 patch 信件(是的,git format-patch 此指令會輸出一份標準的 Unix mail 格式文件)是否確實遵循規範,如果有錯誤,則可使用 git commit –amend 回去修改 commit message。

確認無誤後,則使用 git format-patch –signoff master 正式輸出 patch 檔,檔案會以「流水號-標題.patch」的格式命名。

接著請先跑過 scripts/checkpatch.pl 檢查剛剛產生的 patch 檔還有沒有嚴重的格式問題,再跑 scripts/get_maintainer.pl 找出此次回報 patch 時,應該送給哪個 maintainer、送到哪個 mailing list。接著可以去 subscribe 該 mailing list 取得發文的權限。

然後就可以用 git send-email –to <mailing-list-email-address> –cc “maintainer-email-address” –smtp-server <smtp-server> –smtp-user <smtp-user> –smtp-pass <smtp-pass> –smtp-encryption <smtp-encryption> <patch-filename> 把 patch 送到 mailing list 並寄送副本給剛剛從 get_maintainer.pl 得知的 maintainer。

我今晚照這個流程跑,maintainer Jiri Kosina 在幾分鐘內就回覆我格式還有點小問題、需要再改,而我修正之後重發,接著剛剛就被接納了。往後,這款鍵盤在 Linux 上就可以爽爽用了,而我也因此機緣學會了送 Linux kernel patch 的方法,非常高興。

CC BY-SA 4.0 This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Leave a Reply

Your email address will not be published. Required fields are marked *