pretty code

2022年3月29日 星期二

Kobo Libra 2 vs Logitech R500

為了測試 Libra 2 這台的藍牙是否真如傳說中的不堪?狠下心來購買了它,一試之下,果然跟傳說中的一樣爛XD

在 debug 過程中,無意間發現了一支程式 /bin/bluetoothctl,查了一下似乎可以用來設定藍牙?好不容易在 unpair 和 pair 的過程中,終於可以成功與我的 Logitech R500 成功連接。


感覺研究研究,搞不好可以找到問題在哪?

另外,使用 logread 讀取 log,可以看到一個錯誤訊息。

Mar 29 23:18:52 bluetoothd[1397]: src/service.c:service_accept() input-hog profile accept failed for EF:06:4D:1A:69:69

雖然藍牙初嘗試不是很順利,但至少我的 KoboPageTurner 可以成功使用,直接使用 Elipsa 觸控封包格式即可,總算不是一事無成。

2022/03/30 更新

比對了一下 Elipsa 和 Libra 2,目前看到有兩個差異,Elipsa 的 kernel 和 Bluetooth management interface 都比 Libra 2 新,感覺是 kernel issue?


Bluetooth management interface 1.9 (1.14).

2022/03/31 更新


雖然不懂藍牙,但這幾天查了一些資料,我覺得問題可能是出現在以下幾個地方:

1. CONFIG_RFKILL kernel 未編譯進去。
2. 一樣是 kernel 哪邊的問題 (uhid)。
3. BT chip 本身的問題 (RTL8723DS vs RTL8821CS)。

看起來似乎不是改改設定就可以解決的事,至少嘗試調整 /etc/bluetooth/main.conf 或是 /etc/bluetooth/input.conf 中的參數,看起來都沒有幫助。

2022/04/01 更新

無意間在網路上看到一份 porting guide,看起來要支援 HOG,kernel 應該要打開一些功能,就不知道 RTL8723DS 本身是否有支援就是?假設不是 BT chip 的問題也不是 Kobo 為了市場區隔的問題,後續只要系統更新,應該就能支援翻頁器了。


另外,大部份的 Linux 使用的 Bluetooth Stack 都是 BlueZ,其 daemon 是 bluetoothd,路徑為 /libexec/bluetooth/bluetoothd,在 Kobo 下如果嘗試要修改設定,可以使用 kill 砍掉它,再重新背景執行 deamon 即可。

晚上使用 bluetoothd -d -n 開啟 debug 訊息,可以看到 Elipsa 對待 R500 的方式。

profiles/gap/gas.c:gap_probe() GAP profile probe (EF:06:4D:1A:69:70)
src/service.c:change_state() 0x183a8c8: device EF:06:4D:1A:69:70 profile gap-profile state changed: unavailable -> disconnected (0)
profiles/input/hog.c:hog_probe() path /org/bluez/hci0/dev_EF_06_4D_1A_69_70
src/device.c:gatt_debug() (chan 0x1837f58) ATT PDU received: 0x1b
src/device.c:gatt_debug() (chan 0x1837f58) ATT PDU received: 0x1b

上面最後兩行是按下 R500 翻頁鍵後 Elipsa 吐出來的訊息,Libra 2 雖然無法使用 R500,按下翻頁鍵後一樣能吐出相同的訊息,真的覺得更新 kernel 應該就可以正常了?

另外,Bluetooth 的 spec 看起來是公開的,目前是 Core_v5.3。

2022/04/03 更新

前幾天買了一支便宜的藍牙滑鼠,原本以為使用 kobo-btpt 專案就可以正常使用,但還是不如預期,留個 log 當記錄。


晚上又認真比對了 Elipsa 和 Libra 2 配對 R500 的行為。

Elipsa:
bluetoothd 沒有錯誤訊息,會長出一個 /dev/input/eventX 的裝置,使用 evtest 可以成功補捉左右鍵的 scan code。

Libra 2:
bluetoothd 有錯誤訊息,無法長出 /dev/input/eventX 裝置,故錯誤訊息其實不是斷線,pair 和 connect 都有成功。

2022/04/04 更新

evtest 的 value 是 16 進位數字,在修正了此錯誤後,終於可以使用我的藍牙滑鼠(E-books E-PCG233)翻頁,真是得來不易呀。雖然這個滑鼠按下一次鍵會發送 2 次 event,但我只是想要研究 Libra 2 的藍牙,故對我來說,這個學習已經完成XD

2022/04/05 更新

昨天順手在 kobo-btpt 裡加了一個 filter,避免過短時間內收到相同的 event,不過在 Libra 2 無法成功,且呼叫 Kobo 藍牙翻頁的函數感覺是非同步?但同樣的 filter 在 Elipsa 就可以正常工作。

晚上又認真的在 Elipsa 上試了一下 R500,使用 evtest 補捉的結果,一樣是按一下鍵會送 2 次 event,既然是一樣的行為,那為什麼 Kobo 只會翻一次頁,我想這裡面可能還有我不知道的事在?

Event: time 1649163457.612279, type 4 (Misc), code 4 (ScanCode), value 70050
Event: time 1649163457.612279 ------- Report Sync ------ x: 400 y: 80 p: 0 ------------
Event: time 1649163457.657992, type 4 (Misc), code 4 (ScanCode), value 70050
Event: time 1649163457.657992 ------- Report Sync ------ x: 400 y: 80 p: 0 ------------

如果要我猜的話,會不會 1 個是按下事件,1 個是放開事件?故 kobo-btpt 應該要有能力去判斷放開事件,可能要從別的 event,因為 type MISC 的 press value 應該都一樣,以上面例子來看都是 0x70050。不過問題來了,evtest 只有顯示出 Report Sync 並未顯示出其他 event ,會不會是 evtest 並沒有能力解析,故才沒有顯示呢?

2022/04/06 更新

太相信 Kobo 內附的 evtest tool 了,明明藍牙滑鼠有其他更適合的 event 可以監聽,詳此篇

最後正確的設定檔如下:

prevPage 1 272 1
nextPage 1 273 1

2022/04/07 更新

昨天晚上本來以為已經妥當了,沒想到用了 EV_KEY  後,行為還是不符預期,一樣會觸發翻頁兩次,再加上剛到的 8BitDo Zero 2 gamepad 在 Libra 2 也是時好時壞,有時候可以長出 device,有時候又不行,如果不是像我一樣 telnet 進去閱讀器的人,一定不知道到底發生了什麼事?

就在正準備睡覺的時候,熊熊想到,之前改了 kobo-btpt source code 來 debug,把原始的 libbtpt.so 改個名字,一樣放在 /usr/local/Kobo/imageformats 裡面,這個資料夾裡的 .so 檔,應該是會被 Kobo 自動載入,故我其實是同時在跑兩支 libbtpt.so 而不自知,難怪之前的 debug 訊息才會覺得如此之怪,移除之後,果然一切恢復正常,搞定收工(還是不應該使用 EV_MSC type,因為會收到兩次事件,之前的問題是組合技,既用了不該用的 type,也執行了兩支 libbtpt.so)。

2022/04/08 更新

找到檢查 Linux Kernel Config 的方法了(/proc/config.gz),看起來 Libra 2 禁用了很多 Elipsa 有打開的項目,就不知道是 Kobo 為了市場區隔,還是只是單純的因為 Libra 2 的藍牙晶片不支援的緣故呢?


2022/04/09 更新

昨天晚上下班後決定要來編譯模組了,目標放在 uhid.ko。

CONFIG_HIDRAW=y (這個也許沒影響?)
CONFIG_UHID=m


使用環境

Windows 10 + Docker Desktop (ghcr.io/pgaskin/nickeltc)
linux-4.1.15.tar.gz
Copy /proc/config.gz of Libra 2 to /linux-source/.config

make ARCH=arm CROSS_COMPILE=/tc/arm-nickel-linux-gnueabihf/bin/arm-nickel-linux-gnueabihf- oldconfig
make ARCH=arm CROSS_COMPILE=/tc/arm-nickel-linux-gnueabihf/bin/arm-nickel-linux-gnueabihf-

中間有遇到找不到 bc 及 lzop 兩個執行檔錯誤,我檢查一下 Windows 10 Docker Desktop,感覺底層還是 Windows 的那個 Linux Subsytem(WSL),故我直接複製 WSL 裡的這兩個執行檔及相關的 so 檔進去我的 docker instance,然後建立 soft link(ln -s liblzo2.so.2.0.0 liblzo2.so.2 ... ),看起來這樣就過了?雖然我前後總共重 build 了 3 次就是!

感謝有 make,只有初始檢查比較久,編譯過的都不用再重新編譯,但我的 8 歲老筆電果然很吃力呀,打文章的同時,整個程序都還沒跑完,我只是先偷跑去 /linux-source/drivers/hid 下,把 build 好的 uhid.ko 複製出來測試XD


阿母,我成功了!我的 Logitech R500 終於可以爽爽用了,要感謝的人太多了,就感謝天吧XD


2023/07/02 更新

6 月份買了一台 Clare 2E,為了取代電池快卦掉的 PW3,試了一下,藍牙跟 Libra 2 有一樣的問題,由於 kernel 版本一樣,直接拿原本的 solution 來用,完全無痛接軌。

另外,我的 KoboPageTurner 專案一樣可以用在 Clare 2E 上,raw data 使用 Elipsa 格式,觸控座標設成跟 Clare 一樣即可。

2 則留言:

Unknown 提到...

大大我跪了,請問有沒有 github 可以讓我朝聖膜拜一下!

tylpk 提到...

請服用XD

https://github.com/tylpk1216/kobo-libra2-uhid-module