Note: Use an xHCI debug port for Kernel debugging on Windows/Linux

xHCI 在Intel 平台已經是標準內建的功能,Intel 早期在EHCI 就有加入一個Debug Port 功能,但是基於 EHCI 的Host<->Client半雙工模式設計,它必須透過外部一個USB Device 去做Host/Target的資料交換,又EHCI Controller 上只有 Port 0 可以提供這個功能,變成硬體設計與使用設定上都相對複雜,所以只有相對少數的工程師會去使用這個功能,通常是開發Windows Kernel Driver 的才會需要。

而Intel 在發展XHCI 時,因為USB3 已經是TX/RX分離,所以這次規格變成可以直接兩個Host Port 對接, 一條USB 3 的Debug Cable 實際上就是把 USB 2.0 的 D+/D- 跟Power(VBUS) 斷掉, 然後把USB 3的SS TX/SS RX 交換而已
enter image description here

所以現在開發UEFI/Windows/Linux Kernel mode driver 都支援透過xHCI 的這個內建功能去做,不過有些外接的xHCI Host Controller 並沒有實作這個 DbC (Debug Capability Class)

Microsoft 關於Kernel Debug 的設定
Intel 關於Linux 的Kernel mode 設定 — 這已經併入Vanilla Kernel stream 的文件目錄了,可以看到Linux 下就是把它當tty用

廣告

Note: Porting Boot2Qt to Customer board

因為最近公司沒有特別指定讓我作啥 但是有些來自PM/Sales 的訊息是有Qt5 的需求, 做了一年的Yocto project 終於對Embedded Linux 算是也有大略認識, 然後自己先從NXP/Freescale i.MX6 跟 Intel Apollo lake 的Yocto BSP 玩起, 先把Qt5 在上述廠商提供的YoctoBSP 測試一遍, 掌握了一些要注意的基本事項後 基本上就是Graphics/Input subsystems
在X Windows 上還測過 MatchBox 換成 LXDE 之後應該會試著把LxQt 與 Meta

其他的Graphics backend 像是 Wayland/XWayland/FB 也都基本測一下

然後開始看寫Qt Application 的SDK 確注意到 Qt有個 QT Device creation 的商業版本, 本來看到是商業版本不太想管了, 但是卻看到 網站上的一篇 Building Your Own Embedded Linux Image 發現它是一個OpenEmbedded recipes  而且預先支援的的版子就有我手上同一系列的版本 就好奇研究一下, 基本上跟porting 一個Yocto bsp 到自訂的版子上沒啥差別, 因為基本上Qt5 要有的就是那個Graphics backend 基本上只要有OpenGL ES 2 含以後版本的支援, 應該不是難事

下面是我fork 官網的boot2qt 去加上我公司自己的一塊版本 imx6dltinto 的測試版本, 基本上我只改了kernel/bootloader 指向我放在同一個帳號上的 repositories 其他照舊, kernel/bootloader 用的是NXP/Freescale 最後release 的 4.1.15_v2.0.1 patch

https://github.com/KunYi-UTI/meta-boot2qt/commits/krogoth

基本上參考Qt網站上的那篇文章 把 boot2qt 從安裝 Device Creation 改成 底下

git clone https://github.com/KunYi-UTI/meta-boot2qt boot2qt
cd boot2qt
b2qt-init-build-env help

其他步驟相同

update: 做過一些的展示 on IMX6 and RK3288/RK3399

這個slideshow需要JavaScript。

Note: Freescale 3.14.28-1.0.1 release kernel & u-boot

一開始的工作應該是改這兩個kernel & u-boot東西 還要看一下怎樣做才正確

Bitbake 的 Recipes

  • ./yocto_3.14.28-1.0.1/sources/meta-fsl-bsp-release/imx/meta-fsl-arm/recipes-bsp/u-boot/u-boot-imx_2014.04.bb
  • ./yocto_3.14.28-1.0.1/sources/meta-fsl-bsp-release/imx/meta-fsl-arm/recipes-kernel/linux/linux-imx_3.14.28.bb

透過 Recipes 會把Source code 解壓縮或是透過git clone/pull 的方式弄到下面對應的build folder 裡面去,主要看 Recipes 的寫法

  • ./yocto_3.14.28-1.01/build/tmp/work/imx6dlsabresd-poky-linux-gnueabi/u-boot-imx/2014.04-r0/git
  • ./yocto_3.14.28-1.01/build/tmp/work/imx6dlsabresd-poky-linux-gnueabi/linux-imx/3.14.28-r0/git

 

Tips: Yocto project how to speed up build time

這篇是從 Embedded Linux Projects Using Yocto Project Cookbook 上看來的, 今年爽了半年沒上班,週一終於認命回辦公室上班了。老闆指派的任務就是看一下i.mx6 系列的 linux 環境,而且已經有新同事接手,我可以慢慢來:P

在書上第四頁,就有提到如果Build time 對你而言很重要,可以透過下列方式提升(不過我想這點對大家都很重要才是,畢竟誰也不想要花太多時間等待,尤其是老闆、PM與客戶們更是如此)

  1. 第一步指定Build 目錄使用獨立的檔案系統分割區,甚至是獨立速度夠快的磁碟機
  2. 接著這在這個分割區上使用ext4形式的檔案系統,但是關掉日誌功能,了解斷電等因素會造成資料遺失的風險
  3. 掛上這個檔案系統的時,使用下面的參數,關掉存取檔案的時間戳記,關掉寫入防護措施,延遲寫入時間
    noatime, barrier=0, commit=6000  # to edit /etc/fstab
  4. 不要使用網路磁碟機

要注意的是因為2, 3的步驟會造成ext4 檔案系統的不穩定與失去可靠度,不過因為build folder 是很簡單可以重新產生的暫時性資料所以不需要擔心這件事情

ref. https://notesfromheck.wordpress.com/2012/09/01/mount-options-for-a-faster-ext4/

Ubuntu Dropbox 自動更新有問題

這一兩天 我的Dropbox client 一直出現更新但沒成功過, 也不會秀 error message

剛手動重新安裝才發現問題點所在 (目前版本是 2.6.18 )

因為我用的的是 Ubuntu 12.10 x64 所以下載 dropbox-lnx.x86_64-2.6.18.tar.gz 這個版本

下載完放到Home 下面, 然後執行 tar xvf dropbox-lnx.x86_64-2.6.18.tar.gz 他會解開到 ~/.dropbox-dist 目錄下

然後按照說明 執行 dropboxd 會出現一個錯誤

importing ‘/home/{your account}/pylinux/__pycache__/_cffi__xa0c4f46bx1d95b4de.so’: No module named _cffi__xa0c4f46bx1d95b4de

根據這個訊息可以找到一個 bugreport 參照裏面的解法, 發現應該是本來舊的程式移除不完全
在我的機器上要執行下列步驟

sudo rm -rf /var/lib/dropbox/.dropbox-dist ; 這步我不確定機器上到底有沒有這個folder
rm -rf ~/.dropbox-dist
tar xvf dropbox-lnx.x86_64-2.6.18.tar.gz ; 一樣是在 HOME 下執行, 會重新產生 ~/dropbox-dist
dropbox start -i

Note: To disable Middle button of Mouse on Ubuntu

因為在Ubuntu 上面GTK Default 支援一個很討厭的Feature 就是用 Mouse 中間當Paste 鍵, 但是常常在Scrolling 時, 會誤觸 產生不必要的困擾
所以就找了找 Disable 這個 Feature 的方法
有說要改 GTK libarary code 對我來說實在太麻煩了
後來找到用 xinput set-button-map 的簡單方法
先用 xinput list 找出需要設定的滑鼠, 如下
kunyi@kunyi-ThinkPad-X220:~$ xinput list
⎡ Virtual core pointer                    id=2[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              id=4[slave  pointer  (2)]
⎜   ↳ Microsoft Microsoft® Nano Transceiver v2.0id=10[slave  pointer  (2)]
⎜   ↳ Microsoft Microsoft® Nano Transceiver v2.0id=11[slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                   id=16[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              id=14[slave  pointer  (2)]
⎣ Virtual core keyboard                   id=3[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             id=5[slave  keyboard (3)]
    ↳ Power Button                            id=6[slave  keyboard (3)]
    ↳ Video Bus                               id=7[slave  keyboard (3)]
    ↳ Sleep Button                            id=8[slave  keyboard (3)]
    ↳ Microsoft Microsoft® Nano Transceiver v2.0id=9[slave  keyboard (3)]
    ↳ Integrated Camera                       id=12[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            id=13[slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                  id=15[slave  keyboard (3)]
上面是 pointer 是指標裝置 我用的是 Microsoft Microsoft® Nano Transceiver v2.0
可以看到 id=10 & id=11, 但是這個因為是 USB Device 所以id 並不會一定每次開機都是 10 & 11 會隨著我的 USB bus 有所變化
但是總不能每天改 script吧!
所幸 有pipe & grep & xargs 幫我解決這個問題, 透過下面的指令串就可以自動把id 抓出來, 然後執行 xinput set-button-map
應該有更簡單的寫法不過我試不出來 >_<
 xinput list | grep -Po ‘Microsoft.*pointer’ | grep -Po ‘id=\K[0-9]+’ | xargs -n 1 -I @ xinput set-button-map @ 1 0 3