Hung-Ming Chen's Blog

星期日, 12月 14, 2014

QTCreator ARM Remote Debugging

1. 編譯 GDB for Qt Creator
下載 Qt Creator source code
  • git clone --recursive https://git.gitorious.org/qt-creator/qt-creator.git
若需要搭配特定版本 Qt Creator, 可以從SourceForget下載壓縮包, 或是 git checkout 切換至特定版本.
直接進入 qt-creator/dist/gdb 目錄, 已經預先定義好 Makefile.linux, Makefile.mingw (windows)與 Makefile.osx 三種 OS 下的 Makefile, 以下皆以 linux 環境做說明.

編譯前先編輯 Makefile.linux, 可以看到支援三種不同的 target codes:
  • targets=x86_64-unknown-linux-gnu i686-unknown-linux-gnu arm-none-linux-gnueabi
我試過 Arch Linux/Ubuntu 上的 gdb 可以直接使用, 所以留下 arm 版本即可 
targets=arm-none-linux-gnueabi
接下來是編譯
  • make -f Makefile.linux
過程中會自動下載 gdb 與 python 的 source code
編譯完成後也會自動打包 qtcreator-gdb-7.8-linux-x86_64.tar.gz
這邊的 linix-x86_64 是 host 的執行環境. 壓縮包解開後的內容為
  • python/
  • gdb-arm-none-linux-gnueabi
將以上檔案搬到適當位置即可

最後是 datadir, gdb-arm-none-linuxeabi 預設的路徑是 /usr/local/share/gdb, 然而 host 環境的檔案卻是在 /usr/share/gdb, 我的作法則是建立 symbolic link
# sudo ln -s /usr/share/gdb /usr/local/share/gdb
如果沒有設定則會導致本地端 gdb 啟動失敗

2. 設定 Qt Creator
如果要進行 arm 平台的 qt remote debugging, host 環境當然就要有對應的 cross compiler 與 arm 版本的 Qt library 與工具. 我使用的是 buildroot 搭配 code sourcery toolchain 產生 root filesystem 與 Qt library, 其中要特別注意的是, 為了佈署執行檔, arm 端還需要支援 ssh server 與 sftp server, 最簡單的作法是 buildroot 中直接加入 openssh

Qt Creator 中的設定包括 compiler, gdb, kit 與 remote device
Options -> Devices
設定 arm 端的 IP address, ssh user name, password/key; Free ports 是給 gdbserver 可以使用的範圍. 設定完成後可以用右方的 'Test' 確認連線設定是否正確

Options -> Build & Run
Compilers -> Add -> GCC, 設定 cross compiler g++ 路徑

Qt Versions, 設定 qmake 路徑

Debuggers, 指向前段自行編譯的 gdb for Qt Creator
Kits
選擇 device , compiler, debugger, 與 Qt version

最後是 arm 端使用的 gdbserver 有兩點要注意, 首先需要支援 '--once' 這個參數, 如果 toolchain 有提供可以直接使用, 或是到回到 qt-creator/dist/gdb 中, 自行手動編譯 gdbserver; 第二點是 Qt Creator 並不會幫你佈署 gdbserver, 要直接放在 arm 的 root filesystem 中, 一般安裝路徑是 /usr/bin/gdbserver, 或者是 ssh 登入後 $PATH 找得到的位置即可


星期五, 12月 12, 2014

SPA3000 設定筆記

NAT穿透
    Line 1-> NAT Keep Alive Enable: yes

台灣來電顯示及電話規格
    Regional
        Distinctive Ring Patterns
            Ring1 Cadence: 60(1/2)
        Ring and Call Waiting Tone Spec
            Ring Voltage: 70
            Ring Waveform: Sinusoid
        Miscellaneous
            Caller ID Method: DTMF(Denmark)
    PSTN Line
        FXO Timer Values (sec)
            PSTN Answer Delay: 2 (2秒延遲, 來電顯示解析完成後才呼叫sip)
        PSTN Disconnect Detection
            Disconnect Tone: 480@-30,620@-30;1(.5/.5/1+2)
        International Control
            FXO Port Impedance: 320+1050||230nF
            SPA To PSTN Gain: 2
            PSTN To SPA Gain: 6

PSTN-to-VoIP
    PSTN Line
        Network Settings
            Network Jitter Level: low
            Jitter Buffer Adjustment: disable
        Proxy and Registration
            Register: no
            Make Call Without Reg: yes
            Ans Call Without Reg: yes
        Dial Plans
            Dial Plan 2: (S0<:userid your.sip.server="">)
        PSTN-To-VoIP Gateway Setup
            PSTN-To-VoIP Gateway Enable: yes
            PSTN Caller Auth Method: none
            PSTN Ring Thru Line 1: yes
            PSTN CID Number Prefix: <空白>
            PSTN CID For VoIP CID: yes
            Off Hook While Calling VoIP: no
            PSTN Caller Default DP: 2 (Dial Plan 2)
            Line 1 Signal Hook Flash To PSTN: Disabled
    Line 1
        Network Settings
            Network Jitter Level: low
            Jitter Buffer Adjustment: disable
        Proxy and Registration (註1)
            Proxy: sip.linphone.org (或其他已有註冊帳號之sip server)
            Register: yes
            Make Call Without Reg: no
            Ans Call Without Reg: no
        Subscriber Information
            Display Name: user name
            User ID: userid (sip server註冊帳號)
            Use Auth ID: no
        VoIP Fallback To PSTN
            Auto PSTN Fallback: yes (註1)
    註1: 向sip server註冊失敗時 (例如斷電或網路不通), Line1可以直接PSTN撥號
        因為我手機使用同一sip server的userid,所以連不上sip時一定也叫不到, 故 Make Call Without Reg設為no
   
   
熱線與外線
    Line 1
        Dial Plan
            DialPlan: (<888:userid sip.server="">|<#0:>S0<: gw0="">|xxxxxxxx.)
            話筒拿起撥888可直接呼叫 sip user
            話筒拿起先撥 #0, 聽到 Tone 後用 PSTN 撥外線