2015年11月25日

Acer Chromebook 13 Chrubuntu UPower修正

前言:
因為Ubuntu 14.04沒有MATE for armhf,
加上網路上建議用Ubuntu 15.04加上BlueZ 5來解決Bluetooth Smart的問題,
因此目前正著手將chrubuntu 15.04放上Acer Chromebook 13。

目前狀態還不錯,整體支援性感覺比Ubuntu 14.04還要好得多,
需要修正的比較少,
但這次有個大問題,電池電量無法顯示,
這問題在Ubuntu 14.04有出現,但xfce4上面能夠顯示就將就不管它,
Ubuntu 15.04沒這麼幸運,因此就下去Debug了。

問題原因:
問題的關鍵很容易透過systemctl看得出來,就是UPower Daemon無法啟動,
UPower Daemon執行檔在
/usr/lib/upower/upowerd

可以透過
/usr/lib/upower/upowerd -v

取得執行過程的訊息。

出問題的訊息如下:
問題解法:
經過Trace和gdb追蹤,還有拿桌上型電腦正常運作的upowerd比對後,
得到的root cause如下:
1. native-path錯誤
2. object path錯誤

native-path錯誤:
其實從訊息可以注意到,upowerd不認識bq24735@5-0009這顆電源管理IC,
Google後發現,它在新版Kernel中有針對名稱有Patch,
但我們的使用情境中,Kernel不能變動,且驅動程式已經處理過了,
因此我們要改的就是upowerd這端。

針對native-path的修改如下:
up-native.c



修改up-native.c,檢查名稱,如果開頭沒有「/」,
就加上Acer Chromebook 13的prefix名稱。

這邊的修改用了malloc,但因為這行程式碼grep看起來,用的位置不多,
所以應該是不會有memory leak的問題。

object path錯誤:
針對object path的修改如下:
另一個問題則是object path,這個問題是真正會引發Segfault的問題所在,
參考:
http://upower.freedesktop.org/docs/UPower.html


在upowerd中,DBus的名稱必須是固定如上圖所示,
但在前面的問題截圖中可以注意到,它名稱變成:
/org/freedesktop/UPower/devices/line_power_bq24735@5-0009

這造成upowerd後面程式碼parse時出現問題而Segfault。

針對up-device.c修改如下:
up-device.c



這邊只是簡單的查詢bq24735電源管理IC和sbs電池管理IC,
然後根據這2顆IC的情況修改成相對應的字串。

結果:
修改後執行結果。

upowerd執行如下:


看起來upowerd運作正常。

MATE的電源統計程式:



從電源統計程式看起來,能夠正確取得AC和電池狀態。

UPower檔案下載:
Ubuntu ARM 15.04 UPower deb下載
Ubuntu ARM 15.10 UPower deb下載

Ubuntu ARM 15.04 UPower完整deb打包
Ubuntu ARM 15.10 UPower完整deb打包

Ubuntu ARM 15.04 UPower完整程式碼含修改打包
Ubuntu ARM 15.10 UPower完整程式碼含修改打包

Chrubuntu 15.04修整好後,也會和先前一樣放tar檔提供下載。