2016年9月29日 星期四

synaptics touchpad xorg driver issue

最近看了一個 synaptics touchpad 的 issue ,就是 single touch scrolling failed in right edge,but works in bottom edge.

xorg 在開機的時後,會將所有的 driver load 進來,可以在/var/log/Xorg.0.log 看到,而 /usr/share/X11/xorg.conf.d 下面則放著針對各個 driver 的設定檔 (也可以不放就是 default), 像這次遇到的就是 50-synaptics.conf

然後從 xinput 及 移除 psmouse kernel module 的方式可以知道它的 touch pad 是走 I2C,也就是說 kernel driver 把 x, y 丟上來, xorg driver 去判斷是 edge 還是 function button 之類的。

所以再看 xorg 的 user space Synaptics driver :
 * https://cgit.freedesktop.org/xorg/driver/xf86-input-synaptics/
 * https://launchpad.net/ubuntu/+source/xserver-xorg-input-synaptics/1.8.3-1ubuntu1

透過 code 及觀查 evtest 吐出來的 x, y 可以看到兩個問題 (evtest 在 driver 之上, Xorg 之下):
 1. right edge 沒有 x 坐標丟出來
  - 這應該要看 kernel driver.
 2. user space Synaptics driver 根据的 VID:PID [0002:0007] 是 psmouse 的ID,但最後抓到的是 [06cb:78f6] 看起來像是 Synaptics i2c 的 ID.
  - driver根拒這個決定 edge width,UNKNOWN ID 短於 Synaptics ,再加上 第 1. 點,所以touch 點永遠不被判定為 edge

所以解 1 or 2 就可以解掉這個問題,或者直接在 50-synaptics.conf 上面固定 edge width 當 workaround.

另外,同事有建議試用 xinput 取代Synaptics user space driver, 有空再試吧~

reference :
 * https://wiki.archlinux.org/index.php/Touchpad_Synaptics
 * https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-input-synaptics/+bug/1627674

2016年9月23日 星期五

[Ubuntu Snappy 2] tips for tracing and debugging (keep updating)

因為 snappy 不是用 apt 套件管理所以無法簡單的安裝 debian package ,這樣 debug 有點麻煩,然後其實 OS snap 就是 Ubuntu rootfs 也就是一堆 debian package 的集合,那我想知道其中幾個 package version 怎麼辨? 在 beta channel 中有一個 classic snap package,它透過 chroot 的方式再加上 apt package 讓使用者可以使用 apt commands。

class package 是將 writable partition 中的 OS snap copy 一份到
/var/snap/classic/common/classic 中,然後 bind mount host 一些 partition 進去後,chroot 進去,在裡面 就可以用 dpkg -l 取得所以 OS snap 中的 package 資訊:
https://pastebin.ubuntu.com/23220997/

[Ubuntu Snappy 2] - trace the booting process

最近新的 Ubuntu Core 16 Image release 了,這是就我知道的第一版 base on Snappy 2.x 的 Ubuntu core image (Snappy 2.x 是利用 snapd 管理套件, Snappy 1.x 沒研究), 詳情可見這封 mail :
https://lists.snapcraft.io/archives/snapcraft/2016-September/001166.html

小弟花了一點時間看一下他的 boot process 在此作一下記錄以免大腦記憶体不足被 garbage collection 清掉。

Ubuntu core image divides the storage to 2 partition: "writable" and "system-boot" 給 KVM 和給 raspberry pi 3 的 image 其 boot partition label 看起來不同,反正就是一個 boot ,一個 system.

boot partition:
  • /boot/grub/grubenv decides the kernel and core snap which will be loop mounted by grub.
  • /boot/grub/grub.cfg loop mount kernel snap to specify the position of kernel and initramfs image.

在writable partition 中的 kernel snap 中取得 kernel 及 initramfs ,在 initramfs 中 再 mount OS snap:

mount "${writable_mnt}/system-data/var/lib/snapd/snaps/${snap_core}" "$rootmnt"

這裡我覺得可以在開發時將 OS snap 轉成 ext4 image,然後 mount 成 rw ,這樣比較方便,只是 size 會從 75mb 擴增到 242mb。

然後其 initramfs 應該是來自於這裡:
最後就是進到 systemd 再把 snapd 叫起來。

2016年9月18日 星期日

Ubuntu Phone - install Ubuntu on Meizu Pro5 Android edition

最近看到 #phone-phone mailing list[1] 上面有人分享如何將 Meizu Pro5 Android Edition 刷成 Ubuntu Edition,因為手上沒有以 Android 版本出貨的 Meizu Pro5 所以無法實測其方法,但看來是可行的。

因為 Ubuntu Phone Edition 基本上是買不到了,就一定會有人想嘗試從 Android Edition 刷過去,此篇想用小弟的經驗嘗試分析在刷機的前後可能會遇到的問題,供想刷機的人作參考。

任何自行刷機的行為需自行負擔其風險,本人不保証任何保固上面的問題。

以下列出目前有出貨的手機:

  • BQ Krillin
    • 太舊了,不想討論
  • Meizu MX4 (Arale)
    • MTK solution
    • 刷 Factory images 需要用到MTK提供的 flash-tool
      • 本人經驗,不同的 SoC 對應的 flash-tool 版本可能不同,我之前用的是 v5.1452.00.100
  • BQ M10 (frieza)
    • MTK solution
      • 刷 Factory images 需要用到MTK提供的 flash-tool
        • 本人經驗,不同的 SoC 對應的 flash-tool 版本可能不同,我之前用的是 v5.1520.00.100
  • Meizu Pro5 (Turbo)
    • 2Samsung solution
      • 直接用 fastboot 刷 factory image 即可
factory images 就是每個 partition image file, 然後用工具刷進去,就可以出廠了。以上只有 Pro5 可以用 fastboot 直接刷每一個 partition,最方便而且他是最新的一支 Ubuntu phone 所以拿它來刷還滿合理。

上面的 Krillin, Arale and Turbo 是 device name,也就是在 image server 上面的 device 對應,ubuntu-device-flash 的 --device 要輸入的也就是它們。


目前來說,每支 Ubuntu Edition 的 partition size 都跟 Android Edition 不同,因為 Ubuntu 需要的 system partition(2.5G) 及 cache partition (700MB) 比較大。 為何? 因為在 recovery 中作 update 時,要拿 cache partition 來作 buffer。 那問題就來了~ 原本 Pro5 的 cache partition 只有 500mb,有點危險。 system partition Android Edition, AFAIK 原本就給 2.5G,所以沒有問題。

Cache partition 太小會怎樣? 你在 OTA 的時後, tarballs 會被放在 cache partition,然後 recovery mode 的時後拿來 update (請見 ubuntu-phone-recovery),cache 太小就無法 OTA ,聰明的看官應該已經想到應對的方式了..... 對,手動 update 可以解決這個問題,一樣請見 ubuntu-phone-recovery

BTW.... bootloader 就在 device tarball 裡面呀? 那是不是可以直接刷 bootloader 就好? 嗯.... 刷 bootloader 一不小心就變磚了,而且我也不知道 pro5 Android edition 的 bootloader partition 可不可以刷,所以... 科科

再來就是要把 partitions 一個一個刷進去,可以用 [1] 的方法,也可以用小弟的 repack-factory image tool [2] ,直接從 OTA server 上把 images 拉下來打包成 factory images ,然後用 fastboot 刷進去。

以上再次申明,因小弟沒有 Android Edition,所以只在 Ubuntu Edition 上測試過,如果有勇者嘗試了,再請分享結果吧 :)

[1] https://lists.launchpad.net/ubuntu-phone/msg22248.html
[2] https://github.com/alex-tu-cc/ubuntu_phone_tools