2017年1月1日日曜日

Mackbook Pro(Late 2016, macOS Sierra 10.12.2)でOpenOCD

新しく今年発売のMacbook Proを購入したのでBeagleBoneをOpenOCDでデバッグする環境を構築

■必要なソフトのインストール
・Xcode, gcc command line tool
 AppStore経由でXcodeのインストール
 command line toolはXcodeのメニューからインストール

・Homebrew
  http://brew.sh/index_ja.html
  上記サイトを見ながらhomebrewをインストールする

・OpenOCD
  ターミナルから brew install openocd
  で依存関係まで含めてインストールされる

■Kernel Extension設定変更
  BeagleBone搭載のデバッガはTI XDS100v2
  これはMacに接続するとUSBデバイス FT2232(vendor id: 0x403, product id: 0x6010)と認識される

   macOS SierraにはFTDIのドライバが標準で入っているらしく接続すると以下4つのTTYデバイスが/dev に作成される

cu.usbserial-TIWD9YJWA
cu.usbserial-TIWD9YJWB
tty.usbserial-TIWD9YJWA
tty.usbserial-TIWD9YJWB

  ただ、この状態だとOpenOCDが接続できない。
  OpenOCDはlibftdi->libusb経由でUSB interface0のXDS100v2に接続しようとするが既にTIWD9YJWAというTTYデバイスとして使用してしまっているからである。

  そこでmacOS Sierraの標準FTDIドライバがinterface0にドライバを適用しないようにする

/System/Library/Extensions/AppleUSBFTDI.kext/Contents/Info.plist の以下の部分を削除する

                <key>AppleUSBEFTDI-6010-0</key>
                <dict>
                        <key>CFBundleIdentifier</key>
                        <string>com.apple.driver.AppleUSBFTDI</string>
                        <key>IOClass</key>
                        <string>AppleUSBFTDI</string>
                        <key>IOProviderClass</key>
                        <string>IOUSBHostInterface</string>
                        <key>InputBuffers</key>
                        <integer>8</integer>
                        <key>OutputBuffers</key>
                        <integer>16</integer>
                        <key>bConfigurationValue</key>
                        <integer>1</integer>
                        <key>bInterfaceNumber</key>
                        <integer>0</integer>
                        <key>idProduct</key>
                        <integer>24592</integer>
                        <key>idVendor</key>
                        <integer>1027</integer>

                </dict>



削除する前に一応 cp Info.plist Info.plist.org とでもしてバックアップを取っておくと良い

ちなみに/System/以下のファイルはSIPを無効にしないとchmodで書き込み権限を付与しても編集できない。
SIPを無効にするにはcommand+Rを押しながら起動または再起動してリカバリーモードから行う
リカバリーモードで起動したらメニューから[ユティリティ]-[ターミナル]を選択し、ターミナルからcsruti disableとする
Info.plist の編集が終わったら再びリカバリーモードから csrutil enableとして保護機能を有効化するのを忘れずに。

■OpenOCD起動
 AppleUSBFTDIのInfo.plistを編集した後に再起動するか、モジュールのunload, loadをするとinterface0のTIWD9YJWAが作成されなくなる。
 この状態でOpenOCDが接続可能となる

 openocd -f board/ti_beaglebone.cfg

 で接続することができる。さらに

 screen /dev/tty.usbserial-TIWD9YJWB 115200

 とすることでinterface1はシリアルUARTでデバイスと通信が可能である。

2016年10月31日月曜日

ARMクロスコンパイル用clang その3

前々からautoconfではなく、cmakeでのビルドを推奨していたLLVMだが、ついにautoconfのサポートが無くなってしまった。
そこでcmakeでのARMクロスコンパイラのビルド方法を記載しておく。


(1)LLVM(Clang含む)のソースコード一式を適当なフォルダに展開する
 展開の仕方は公式のGetting startedを参照
(2)LLVMのフォルダとは別の場所にビルドフォルダを作成し移動する.
(3)以下のようにcmakeを実行すればMakefileが生成される

cmake <LLVMフォルダパス> -DCMAKE_CROSSCOMPILING=True -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="ARM;AARCH64" -DCMAKE_INSTALL_PREFIX=<ビルドしたバイナリのインストール先パス> -DLLVM_TARGET_ARCH=ARM -DLLVM_DEFAULT_TARGET_TRIPLE=arm-none-eabi

(4)make; make install

2016年8月11日木曜日

ARMクロスコンパイル用clang その2

ARMクロスコンパイル用clangの続き

普段使っているのがWindowsなのでWindows上でもARMクロスコンパイルclangを作成して見る
自作OS向けなのでベアメタルビルドでOK。
ライブラリ無しのコンパイラのみなのでビルドはシンプル。

■準備
msys2 32bit版を導入

(1) https://msys2.github.io/ から msys2-i686-[hhhhmmdd].exe をダウンロードして実行する
(2) メニューからMinGW-w64 Win32 shellを選択してターミナルを出す
(3) ターミナルからシステムアップグレード
     pacman -Syu --noconfirm

(4) ターミナルを1度閉じる
(5) エクスプローラから C:\msys32\mingw32.exe を実行する
  アップグレードするとメニューからのターミナル起動ショートカットがなぜか効かなくなるので直接実行

(6) clangビルドに必要なパッケージをインストール
     pacman -S base-devel mingw-w64-i686-toolchain python --noconfirm

■binutils, clangをビルド
   ビルド用スクリプトbuild-arm-clang.shを用意

(使用方法)
  build-arm-clang.sh [binutilsバージョン] [llvm/clangバージョン]
  何も指定しないとbinutils-2.27, llvm-3.8.1 になる


2016年7月30日土曜日

Nginx + Redmine

■前提
nginx, Redmine(ruby, bundler, unicorn含む)はインストール済みとする

■nginxの設定
/etc/nginx/sites-available のサーバー設定に以下を追加

upstream unicorn {
    server unix:[redmineインストールパス]/tmp/unicorn.sock fail_timeout=0;
}

server {} の中に locationを追加

location /redmine {
    alias [redmineインストールパス]/public;
    try_files $uri/index.html $uri.html $uri @unicorn;
}

location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
}

■Redmineの設定
sub-uri /redmine で動作するように若干変更

[redmineインストールパス]/config/routes.rb の以下の部分を変更

(変更前)
Rails.application.routes.draw do
  root :to => 'welcome#index', :as => 'home'
  ・
 ・
 ・
end

(変更後)
Redmine::Utils::relative_url_root="/redmine"

Rails.application.routes.draw do
scope Redmine::Utils::relative_url_root  do
  root :to => 'welcome#index', :as => 'home'
  ・
 ・
 ・
end
end

■Redmineの起動
cd [redmineインストールパス]
bundle exec unicorn -c config/unicorn.rb -E production -D

これでunicorn経由でRedmineがデーモン状態で立ち上がる

■nginx再起動
service nginx restart