KOYAMA Yoshiaki のブログ

プログラミングについての試行錯誤をつらつら書き溜めていきます。

Parallels Desktop 11 for Mac の Ubuntu 15.10 上で Swift をビルド、example のコンパイル、GitHub にある Apple のリポジトリを全てダウンロードする自作スクリプトとコマンド git の補助スクリプト集を紹介。

以前の書き込みから随分経ってしまいました。新年を跨ぎましたが、今年も宜しくお願いします。

Swift.org - Welcome to Swift.org
https://swift.org/

Swiftオープンソースとして公開されてから、2ヶ月程経ちました。コンパイラの仕組みについては、以前から興味があったのでビルドに挑戦してみました。ただし、OS X 側の環境を汚したくないので、Parallels Desktop 11 for Mac の仮想環境で Ubuntu 15.10 をインストールして Swift をビルドしてみました。swift-package-manager を使った example のコンパイルGitHub にある Appleリポジトリを全てダウンロードするスクリプトとコマンド git の補助スクリプト集を紹介したいと思います。


最初に自作スクリプトを下記URL で公開しておきます。詳細は、アーカイブに含まれる ReadMe.rtfd ファイルとブログの後半を参考にしてください。

GitHub にある Appleリポジトリを全てダウンロードする自作スクリプトとコマンド git の補助スクリプト集。
http://kyoshiaki.sakura.ne.jp/osx/Sample/Apple.zip


Parallels Desktop 11 for MacUbuntu 15.10 の仮想環境を作成。

まず、最初に Linux ディストリビューションUbuntu 15.10 をダウンロードする必要があります。

The leading OS for PC, tablet, phone and cloud | Ubuntu
http://www.ubuntu.com/
Download Ubuntu Desktop | Download | Ubuntu
http://www.ubuntu.com/download/desktop

上記 URL から (ここでは、英語版での解説になります。)

Ubuntu 15.10
64-bit

‘ダウンロード’ ボタンをクリックして、ファイル ubuntu-15.10-desktop-amd64.iso をダウンロードしてください。

Parallels Desktop 11 for Mac を起動し、メニュー/ファイル/新規… を選び、イメージファイルとして ubuntu-15.10-desktop-amd64.iso を選択してインストールしてください。

インストールに成功したら、Ubuntu 15.10 を Software Updater で最新の状態にしてください。


Ubuntu 15.10 上で swift コマンドを実行できる環境を作成。

次に Ubuntu 上で swift コマンドを実行できる環境を作成します。詳しい解説は、

Swift.org - Download Swift
https://swift.org/download/
Linux
https://swift.org/download/#linux

を参照してください。上記 URL の

Latest Development Snapshots
Linux	Ubuntu 15.10 Swift 2.2 Snapshot (Signature) January 11, 2016

から Ubuntu 15.10 Swift 2.2 Snapshot のリンクを Ubuntu 15.10 上の Firefox などのウェブブラウザでクリックして、ファイル swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz をダウンロードしてください。さらに (Signature) のリンクをクリックして swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz.sig ファイルもダウンロードしてください。Signature ファイルはダウンロードしたファイルが改変されていないか検証するために使います。

(最新の Snapshot をダウンロードしてください。2016/01/17(Sun) 現在、Ubuntu 15.10 Swift 2.2 Snapshot (Signature) January 11, 2016 が最新です。)

Ubuntu 上で Terminal を起動し、

~ $ sudo apt-get install clang libicu-dev
~ $ 

で必要なパッケージをインストールします。

~ $ wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -

上記コマンドで公開鍵をインポートします。これは、1回だけ実行すれば良いようです。

swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz
SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz.sig 

先ほどダウンロードした上記2つのファイルをデスクトップに移動します。

~/Desktop $ gpg --keyserver hkp://pool.sks-keyservers.net --refresh-keys Swift

上のコマンドを実行した後、

~/Desktop $ gpg --verify swift-<VERSION>-<PLATFORM>.tar.gz.sig

ダウンロードしたアーカイブが改変されていないか上記コマンドで検証します。ここでは、

~/Desktop $ gpg --verify swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz.sig

gpg: assuming signed data in `swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz'
gpg: Signature made Tue 12 Jan 2016 10:02:41 AM JST using RSA key ID xxxxxxxx
gpg: Good signature from "Swift Automatic Signing Key #1 <swift-infrastructure@swift.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
~/Desktop $ 

上記コマンド gpg --verify swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz.sig になります。gpg: Good signature と表示されれば良いようです。ただし、警告が表示されています。どこか間違っているのかもしれません。

~/Desktop $ tar xzf swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz

コマンド tar を使って上記のように swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10.tar.gz を展開します。


swift コマンドのパスを環境変数 PATH に設定します。ホームディレクトリの .profile ファイルは、.bashrc ファイルを読み込んでいます。.bashrc ファイルの最後に

export PATH=$HOME/Desktop/swift-2.2-SNAPSHOT-2016-01-11-a-ubuntu15.10/usr/bin:"${PATH}"

emacsvim、vi などのエディタを使って追加します。Terminal を再起動し、

~ $ swift --version
Swift version 2.2-dev (LLVM 3ebdbb2c7e, Clang f66c5bb67b, Swift 42591f7cba)
Target: x86_64-unknown-linux-gnu
~ $

上記のように swift コマンドで実行できるか確認できます。


swift-package-manager を使った example のコンパイル

Apple · GitHub
https://github.com/apple/
GitHub - apple/example-package-dealer: Example package for use with the Swift Package Manager
https://github.com/apple/example-package-dealer

上記の example の大元は example-package-dealer です。依存関係はパッケージマネージャーが面倒を見てくれます。

~/Desktop $ git clone https://github.com/apple/example-package-dealer.git
Cloning into 'example-package-dealer'...
remote: Counting objects: 18, done.
Unpacking objects: 100% (18/18), done.
remote: Total 18 (delta 0), reused 0 (delta 0), pack-reused 18
Checking connectivity... done.

上記のように git clone コマンドで example-package-dealer リポジトリをダウンロードし、

~/Desktop $ cd example-package-dealer/
~/Desktop/example-package-dealer $ swift build

Cloning https://github.com/apple/example-package-deckofplayingcards.git
Using version 1.0.2 of package example-package-deckofplayingcards
Cloning https://github.com/apple/example-package-fisheryates.git
Using version 1.0.2 of package example-package-fisheryates
Cloning https://github.com/apple/example-package-playingcard.git
Using version 1.0.1 of package example-package-playingcard
Compiling Swift Module 'FisherYates' (1 sources)
Linking Library:  .build/debug/FisherYates.a
Compiling Swift Module 'PlayingCard' (3 sources)
Linking Library:  .build/debug/PlayingCard.a
Compiling Swift Module 'DeckOfPlayingCards' (1 sources)
Linking Library:  .build/debug/DeckOfPlayingCards.a
Compiling Swift Module 'Dealer' (1 sources)
Linking Executable:  .build/debug/Dealer
~/Desktop/example-package-dealer $ 

example-package-dealer ディレクトリに移動した後、 上記のように swift build コマンドを実行します。

実行ファイルは .build/debug に作成されます。

~/Desktop/example-package-dealer $ cd .build/debug
~/Desktop/example-package-dealer/.build/debug $ ./Dealer
♠︎Q
♣︎3
♠︎8
♢4
♣︎Q
♢6
♢J
♡2
♡5
♠︎J
~/Desktop/example-package-dealer/.build/debug $ 

上記が実行結果です。


Ubuntu 15.10 上で swift コマンドをビルドする。

Ubuntu 15.10 上で Terminal を起動し、

~ $ sudo apt-get install git cmake ninja-build clang python uuid-dev libicu-dev icu-devtools libbsd-dev libedit-dev libxml2-dev libsqlite3-dev swig libpython-dev libncurses5-dev pkg-config

を実行してください。

Apple · GitHub
https://github.com/apple/
GitHub - apple/swift: The Swift Programming Language
https://github.com/apple/swift

から Swiftリポジトリを Ubuntu15.10 デスクトップ上の Apple という名前のフォルダに

~ $ cd Desktop/
~/Desktop $ mkdir Apple
~/Desktop $ cd Apple/
~/Desktop/Apple $ git clone https://github.com/apple/swift.git
Cloning into 'swift'...
remote: Counting objects: 324410, done.
remote: Compressing objects: 100% (156/156), done.
remote: Total 324410 (delta 62), reused 0 (delta 0), pack-reused 324254
Receiving objects: 100% (324410/324410), 68.43 MiB | 5.43 MiB/s, done.
Resolving deltas: 100% (265946/265946), done.
Checking connectivity... done.
~/Desktop/Apple $ ls
swift
~/Desktop/Apple $

上記コマンド git clone https://github.com/apple/swift.git を使ってダウンロードします。

Swift のビルドの仕方の詳細は、

~/Desktop/Apple/swift/README.md

に書いてあります。(後で、AppleGitHub 上のリポジトリを全てダウンロードするスクリプトを紹介します。そのスクリプトOS X 上で実行し、Finder 上で Apple/swift/README.md ファイルをダブルクリックすると Xcode で Markdown 形式のファイルを見ることができます。)

追記) 2016/03/09(Wed)
Markdown 記法ファイルの表示、編集には下記 URL の Atom エディタを使うのが一番簡単です。

Atom
https://atom.io/

Markdown の表示は、Markdown ファイルを開き、

ショートカットキー: ctrl-shift-M
コマンド: Markdown Preview:Toggle

で表示できます。

Split Pane だと扱いにくいので
Settings/Packages の Package: markdown-preview をクリックして、設定画面を表示し、Open Preview In Split Pane のチェックを外してください。別 Pane に表示されるようになります。

~/Desktop/Apple $ cd swift
~/Desktop/Apple/swift $ ./utils/update-checkout --clone
--- Cloning 'cmark' ---
--- Cloning 'lldb' ---
--- Cloning 'llvm' ---
--- Cloning 'swift-corelibs-xctest' ---
--- Cloning 'swift-integration-tests' ---
--- Cloning 'swiftpm' ---
--- Cloning 'swift-corelibs-foundation' ---
--- Cloning 'clang' ---
--- Cloning 'llbuild' ---
~/Desktop/Apple/swift $ 

上記コマンド ./utils/update-checkout --clone を使って必要なパッケージをダウンロードします。(swift フォルダではなく、Apple フォルダに保存されので注意してください。)

最後に ./utils/build-scrip スクリプトを実行して swift コマンドをビルドします。引数 -R を指定しない限り debug モードでビルドされます。引数 -R の場合 release モードになります。引数 -t は Ninja による基本的なテストを行います。

詳しい解説は

~/Desktop/Apple/swift $ ./utils/build-script -h

を参照してください。環境変数 SWIFT_SOURCE_ROOT(ソースの位置)、SWIFT_BUILD_ROOT(swift が作成される位置) を設定できます。設定されていない場合、推論されます。

実際に ./utils/build-script -t でビルドすると

~/Desktop/Apple/swift $ ./utils/build-script -t
.
.
libLLVMSupport.a -lrt -ldl -ltinfo -lpthread -lm -Wl,-rpath,"\$ORIGIN/../lib" && :
clang: error: unable to execute command: Killed
clang: error: linker command failed due to signal (use -v to see invocation)
[1121/1984] Linking CXX executable bin/llvm-ar
ninja: build stopped: subcommand failed.
./utils/build-script: command terminated with a non-zero exit status 1, aborting
~/Desktop/Apple/swift $ 

上記エラーによりビルドに失敗します。メモリが足りないと表示されるようです。

図 1) 構成…/ハードウェア/CPU および メモリ

Parallels Desktop 上で、メニュー/処理/構成… を選び 、’ハードウェア’ タブを選択し、上図のように Ubuntu 側のメモリを 8192MB に変更します。

また、メモリを節約する意味で、引数 -j 1 を指定して、ビルドプロセスを1つにします。最終的に

~/Desktop/Apple/swift $  time ./utils/build-script -j 1 -t

上のコマンドを実行します。(time コマンドはビルド時間を計測してくれます。)


私の MacBook Pro の動作環境は

OS X El Capitan バージョン 10.11.3
MacBook Pro (Retina, 15-inch, Late 2013)
プロセッサ 2.3GHz Intel Core i7
メモリ 16GB 1600 MHz DDR3
グラフィクス
Intel Iris Pro 1536 MB
NVIDIA GeForce GT 750M

Parallels Desktop 11 for Mac
バージョン 11.1.2 (32408)
~/Desktop/Apple/swift $  time ./utils/build-script -j 1 -t
-- check-swift-linux-x86_64 finished --
--- Finished tests for swift ---

real	108m35.712s
user	112m17.964s
sys	4m48.860s
~/Desktop/Apple/swift $ 

です。上記のように time コマンドで確認するとビルドに1時間40分ほどかかりました。

ビルドした swift コマンドの位置は、

~/Desktop/Apple/build/Ninja-DebugAssert/swift-linux-x86_64/bin/swift

にあります。


最後にOS X 上で使用する自作スクリプトを紹介したいと思います。


GitHub にある Appleリポジトリを全てダウンロードする自作スクリプトとコマンド git の補助スクリプト集。

GitHub にある Appleリポジトリを全てダウンロードする自作スクリプトとコマンド git の補助スクリプトhttp://kyoshiaki.sakura.ne.jp/osx/Sample/Apple.zip

上記 URL で GitHub にある Appleリポジトリを全てダウンロードする自作スクリプトとコマンド git の補助スクリプト集を公開します。

ダウンロードした Apple.zip をデスクトップに移動し、Finder 上でダブルクリックして展開します。コマンド install.sh を

~/Desktop/Apple $ ./install.sh 
Cloning into 'swift'...
Cloning into 'swift-package-manager'...
.
.
~/Desktop/Apple $ 

上記のように実行すると、GitHub にある Appleリポジトリを全てダウンロードします。すべてのリポジトリを最新の状態にアップデートしたい場合は update.sh を使用します。

~/Desktop/Apple $ ./log.rb
0: example-package-dealer
1: example-package-deckofplayingcards
2: example-package-fisheryates
3: example-package-playingcard
4: swift
5: swift-3-api-guidelines-review
6: swift-clang
7: swift-cmark
8: swift-corelibs-foundation
9: swift-corelibs-libdispatch
10: swift-corelibs-xctest
11: swift-evolution
12: swift-integration-tests
13: swift-llbuild
14: swift-lldb
15: swift-llvm
16: swift-package-manager
?
4

上記のように log.rb を実行するとリポジトリ一覧を表示し、番号を入力することで選択したリポジトリのコミットログを表示することができます。次ページを見るには、スペースキーを押してください。カーソル上下キーでもスクロールできます。終了するには、q キーを押してください。その他のスクリプトは、Apple/Dcuments フォルダの ReadMe.rtfd を参照してください。

IchigoJam に必要な物と起動方法、LPC1114 DIP28 データシート入手方法、USB-シリアルモジュールの入手方法と Mac でのキーボード入力、Xcode で IchigoJamSerialConsole をビルドする方法、IchigoJamSerialConsole と ORSSerialPort のソースを少し解析。

前回予告した IchigoJam について書きたいと思います。

まず最初に、IchigoJam を入手する必要があります。

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/

本家サイト上記URLを開き、少しスクロールすると 'IchigoJam 入手方法’ というタイトル項目が見つかります。
プリント基板キット版、プリント基板完成版、Get Started Set の取り扱い店が表示されています。私はプリント基板完成版 IchigoJam が欲しかったので、共立エレショップのリンクをクリックして購入しました。

【共立エレショップ】>> こどもパソコンIchigoJam 組み立て済完成品: 【開発・計測・ツール】 << 電子部品,半導体,キットの通販
http://eleshop.jp/shop/g/gF3K313/

上記 URL ページ左上の検索フィールドを ichigojam で検索すれば、多数の IchigoJam キットが表示されます。その中でも、

【共立エレショップ】>> IchigoJam電子工作パーツセット 32個のプログラムを保存!EEPROMカセット: 【開発・計測・ツール】 << 電子部品,半導体,キットの通販
http://eleshop.jp/shop/g/gF5U411/

は、お勧めです。私は上のキットが販売されているのを知らず、秋月電子通商でそれぞれ必要な部品を注文しました。

IchigoJam - ショップのふうせん
http://shopfusen.jimdo.com/ichigojam/

でも、購入できます。こちらは値段が高いですが、モジュールになっているので便利です。

【共立エレショップ】eleshop.jp:電子部品,半導体,キットの通販
http://eleshop.jp/shop/default.aspx

私が、共立エレショップで購入したものは

共立電子の店
エレショップ
こどもパソコンIchigoJam 組み立て済完成品
IchigoJam-G _
¥2,000
microUSBケーブル 1m■ジャンク■
IG-13004-DJK _
¥150
ビデオケーブル 1.5m[R指]
VD-015 _
¥282
商品金額合計
¥2,432
送料
¥480
注文金額合計
¥2,912

です。

IchigoJam について、下記 URL の本家サイト、ブログ、IchigoJam 情報サイト

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/
 
 #IchigoJam / 福野泰介の一日一創
http://fukuno.jig.jp/IchigoJam

こどもパソコン IchigoJam 情報サイト - イチゴジャム レシピ
http://15jamrecipe.jimdo.com/

のリンクを辿れば、必要な情報は入手できると思います。私が公開している RSS リーダー iYKRSS、iYKRSSHD も

 #IchigoJam / 福野泰介の一日一創
http://fukuno.jig.jp/IchigoJam
iYKRSS
カテゴリ/ニュース
無料
http://appstore.com/yoshiakikoyama/iykrss

iYKRSSHD
カテゴリ/ニュース
¥120
http://appstore.com/yoshiakikoyama/iykrsshd

福野泰介さんのブログ RSS を読めるように対応しました。

こどもパソコンIchigoJam「たいけんセット」 5ステップでプログラミングスタート! #opendata #shizuoka / 福野泰介の一日一創
http://fukuno.jig.jp/998

上記URLに最初にすべきことが記載されています。


IchigoJam を起動した手順を紹介したいと思います。

必要な物 - イチゴジャム レシピ
http://15jamrecipe.jimdo.com/%E5%BF%85%E8%A6%81%E3%81%AA%E7%89%A9/

必要な物は上記 URL が参考になります。簡単に紹介すると

IchigoJam
microUSBケーブル
USB 電源アダプタ
ビデオケーブル
PS/2キーボード
テレビ

です。

USB 電源アダプタは、iPhoneiPadiPod touch 用の USB 電源アダプタで問題ないようです。ビデオケーブルは、赤、黄、白に色分けされたケーブルです。使用するのは、映像の黄色だけです。共立電子で私が買ったビデオケーブル のように、黄色だけのものもあります。

サンワサプライ PS/2キーボード SKB-L1BK
¥ 684

PS/2 キーボードは、Amazon などで売られています。また、USB キーボードを所有していれば PS/2-USB変換ケーブルを利用することもできます。

テレビですが、アナログ端子(RCA端子、赤、白、黄色の3つの端子) に対応しているものだと問題なく利用できます。私は、SHARP AQUOS 液晶テレビ 19型 ブラック LC-19K90-B を使用しました。

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/

小さい画面が好みの人は、上記本家サイトの

オススメ周辺機器
テレビ

で紹介されている

Amazon.co.jp: 【ノーブランド品】2系統の映像入力 12V車用 ミニオンダッシュ液晶モニター 4.3インチ バック切替可能: 家電・カメラ
http://www.amazon.co.jp/dp/B0079RJ4AE/

車載モニタがお勧めです。



図 1) IchigoJam

上図が接続して電源を切った状態です。

プラスチックナット+連結(6角ジョイント)スペーサー(10mm)セット: 電子工作便利商品 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gP-01864/

ただし、IchigoJam にスペーサーを取り付けてあります。

上図 1) のようにスイッチが2つあります。赤枠のスイッチ(SW1)が電源スイッチです。青枠のスイッチ(SW2、タクトスイッチ[ボタン]) は、BASIC 命令で押したかどうかを判定できます。

赤枠の電源スイッチSW1を入れても、基板の赤色ダイオードが点灯するわけではありません。赤色ダイオードBASIC の命令で操作できます。テレビに

IchigoJam BASIC 1.0.1 by jig.jp
OK

と表示されれば起動に成功です。IchigoJam のバージョンによって表示される文字列は違います。


IchigoJam で使用されているマイコン

IchigoJam組み立てキットで自分だけのパソコンづくり(上級編) #IchigoJam #maker / 福野泰介の一日一創
http://fukuno.jig.jp/671

マイコンLPC1114の外部クリスタルの自動判別方法 #lpc1114 #IchigoJam #maker / 福野泰介の一日一創
http://fukuno.jig.jp/1097

上記回路図より LPC1114 DIP28 です。

データシートは

LPCZone:NXP LPCマイコン情報・・LPCマイコン・ラインナップ
http://www.nxp-lpc.com/lpc_micon/

上記 URL よりダウンロードできます。回路図 Vdd = 3.3V より、LPC1100LV シリーズではなく LPC1100(X)L シリーズです。ハードウェアに関しては詳しくないので、間違っている可能性もあります。

LPCマイコン情報:LPC1100 (X)L Cortex-M0搭載-低消費電力,CSP,DIP,LPC1125,LPC1124,LPC1102,LPC1104,LPC1111,LPC1112,LPC1113,LPC1114,LPC1115, LPC1114FN28
http://www.nxp-lpc.com/lpc_micon/cortex-m0/lpc1100xl/
特徴
詳細はデータシート [ http://jp.nxp.com/documents/data_sheet/LPC111X.pdf ] でご確認ください。

の文字 'データシート' のリンク、または

ドキュメント/技術情報
LPC111x(X)Lデータシート(PDF) [LPC1100] [ http://jp.nxp.com/documents/data_sheet/LPC111X.pdf ]
LPC1115, LPC1114, LPC1113, LPC1112, LPC1111, LPC1110。 LPC1114FN28/102も。

'LPC111x(X)Lデータシート(PDF) ' のリンク

データシート
http://jp.nxp.com/documents/data_sheet/LPC111X.pdf


をクリックすると PDF ファイルがダウンロードできます。目的のLPCマイコン[ LPC1114FN28/102 ] データシートは

11ページ
6. Pinning information
Table 3.	Pin description overview
Part                            Pin description table       Pinning diagram
LPC1114FN28/102    Table 7                             Figure 13
26ページ
Table 7. LPC1100L series: LPC1112/14 pin description table (TSSOP28 and DIP28 packages)
18ページ
Fig 13. LPC1100L series pin configuration DIP28 package

上記ページが参考になります。OS X のアプリ 'プレビュー' で必要なページだけ抜き出して PDF 化すると便利です。メモリーマップは

46ページ
Fig 14. LPC1100 and LPC1100L series memory map

と IchigoJam 独自のメモリマップは

IchigoJamのメモリマップと演算子優先順位 #IchigoJam / 福野泰介の一日一創
http://fukuno.jig.jp/984

で確認できます。

また、統合開発環境(IDE) LPCXpresso のフリー版は

Welcome NXP LPCXpresso Users! | www.LPCware.com
https://www.lpcware.com/lpcxpresso
Download LPCXpresso installers and the getting started guide

LPCXpresso IDE Downloads | www.LPCware.com
https://www.lpcware.com/lpcxpresso/download

からダウンロードできます。


次に OS X Yosemite 10.10.5 上で Mac のキーボードを IchigoJam のキーボードとして使用する方法を紹介したいと思います。

Mac のキーボードを IchigoJam のキーボードとして利用するには、USB-シリアルモジュールを用意する必要があります。また、USB-シリアルモジュールは Mac で IchigoJam のファームウェアを更新するのにも利用できます。

私が試したのは、


図 2) AE-FT234X

超小型USBシリアル変換モジュール AE-FT234X: 半導体 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gM-08461/
AE-FT234X
1パック ¥600(税込)
4pin
デバイス名: /dev/cu.usbserial-DJ002536


図 3) AE-FT231X

FT231X USBシリアル変換モジュール: 半導体 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gK-06894/
AE-FT231X
1パック ¥750(税込)
18pin
デバイス名: /dev/cu.usbserial-DJ004U12

の2つです。どちらも、細ピンヘッダは付属しています。ただし、細ピンヘッダは自分でハンダ付けする必要があります。ハンダ付けで失敗した場合は、はんだ吸取り線を利用してください。 率直に言うと値段も安いし、必要なのは 3 pin だけなので断然 AE-FT234X がお勧めです。

Ichigojam と AE-FT234X を接続するには、ジャンパーワイヤ(オス-メス) が必要です。秋月電子通商でいろいろな種類が売っています。
秋月電子通商の検索フィールドにキーワードを入力して検索するより、Google で直接

ジャンパーワイヤ site:akizukidenshi.com

上の語句で検索する方が、見つけやすいかもしれません。

Mac と接続するには

USBケーブル Aオス-マイクロBオス 1.5m A-microB: パーツ一般 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gC-07607/
1本 ¥120(税込)

が必要です。


図 4) IchigoJam を USB-シリアルモジュールで Mac と接続した状態

上図は、AE-FT234X と IchigoJam を ジャンパーワイヤ(オス-メス) 3本で

AE-FT234X -	IchigoJam
TXD            -   RXD (15)
RXD            -  TXD (16)
GND           -  GND (8・22)

上記のように接続し、Mac とは USBケーブル で繋いだ状態です。AE-FT234X 側 VCC(3.3V)は接続する必要はありません。

MacOS X Yosemite 10.10.5 上では、最初からUSB-シリアルモジュール AE-FT234X、AE-FT231Xの FTDI 社用アップル純正ドライバがインストールされています。


IchigoJam の電源を入れ、

titoi2/IchigoJamSerialConsole · GitHub
https://github.com/titoi2/IchigoJamSerialConsole


図 5) IchigoJamSerialConsole でオープンするデバイス名を選択

IchigoJamSerialConsole (Xcode Version 6.4 (6E35b) による IchigoJamSerialConsole アプリケーションの作成の仕方は、後半に説明してあります。) を起動し、上図のようにデバイス名を選択し、Open ボタンをクリックすると下図のようにデバイスが開きます。


図 6) シリアルポートをオープンした状態

後は、キーボードで入力すると IchigoJam と接続したテレビに文字が表示されるはずです。(注意、IchigoJamSerialConsole アプリケーションが前面にないとキーボードの入力を受け取ることができません。) BASIC でプログラムができる状態になりました。IchigoJamSerialConsole を終了する前に、忘れず Close ボタンをクリックして、シリアルポートを閉じてください。(実際はウインドウを閉じればシリアルポートも閉じられます。)

LOAD ボタンをクリックすると文字コード: Shift JIS、改行コード: CR/LFのテキストファイルに保存した BASC プログラムを IchigoJam に転送できます。RUN + Return キーを入力すると実行できます。

注意) IchigoJamSerialConsole は、改行コード CR (0x0d) を送信しません。CoolTerm などで

Roger Meier's Freeware
CoolTerm
http://freeware.the-meiers.org/

生の BASIC プログラムを送信する場合、BASIC プログラムの改行コードを LF に変換してください。拙作、DUMP.bas.txt

DUMP.bas.txt  ; メモリダンププログラム version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/Sample/IchigoJam.zip

で IchigoJam のプログラムエリア #C00 をダンプすると改行コードが LF (0x0A) になっていることが確認できます。

BASIC プログラムは

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/
説明書・組み立て方

IchigoJam はじめのいっぽ&ミニゲームhttp://ichigojam.net/book/IchigoJam-firstgame.pdf
keynote
http://ichigojam.net/book/IchigoJam-firstgame.key
English-PDF
http://ichigojam.net/book/IchigoJam-firstgame-en.pdf
English-keynote
http://ichigojam.net/book/IchigoJam-firstgame-en.key
PROGRAM - イチゴジャム レシピ
http://15jamrecipe.jimdo.com/program/

に、色々紹介されています。BASIC のバージョンには十分気をつけてください。

BASICリファレンスは、

こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)
http://ichigojam.net/

上記URLページの右側

説明書・組み立て方
BASICリファレンス 1.0.1 / BASICリファレンス 0.9.7 / english version

BASICリファレンス 1.0.1、0.9.7 リンク

IchigoJam BASIC リファレンス 1.0.1
http://ichigojam.net/IchigoJam.html

IchigoJam BASIC リファレンス 0.9.7
http://ichigojam.net/IchigoJam-0.9.7.html

で読むことができます。

私が作ったメモリダンププログラムも下記URL で公開します。

IchigoJam BASIC バージョン 1.0.1 対応 BASIC 自作プログラム
DUMP.bas.txt  ; メモリダンププログラム version 1.0.0
SW2.bas.txt   ; SW2 タクトスイッチ判定プログラム version 1.0.0
http://kyoshiaki.sakura.ne.jp/osx/Sample/IchigoJam.zip

MacOS X Yosemite 10.10.5 上でのフォームウェア更新、外部記憶装置 EEPROM Coolterm の使い方、Coolterm の使用例と Parallels Desktop 10 の Windows 8 上での BUFFALO モニターモード搭載 USB用ビデオキャプチャー PC-SDVD/U2G の使用例などは次回に紹介したいと思います。


PC-G850V、PC-G850VS と Mac の間でシリアル通信ができるアプリケーション

PCG-LinkMac
http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html#pcglink

を公開している身としては、一番興味があったのは IchigoJamSerialConsole

titoi2/IchigoJamSerialConsole · GitHub
https://github.com/titoi2/IchigoJamSerialConsole

です。


最初に、IchigoJamSerialConsole のソースをダウンロードし、Xcode でビルドして IchigoJamSerialConsole アプリケーションを作成する方法を紹介したいと思います。

まず、MacApp Store から Xcode (私の環境は、Xcode Version 6.4 (6E35b) です。) をインストールしてください。インストールが終了したら、'/アプリケーション' フォルダにある Xcode アイコンをダブルクリックして起動してください。

Xcodeの利用許諾(ライセンス同意契約)に Agree ボタンで同意し,パスワードを尋ねられるので入力してください。必要なコンポーネントがインストールされます。

Xcode をインストールするとコマンドラインツールはインストールされます。OS X Yosemite ではコマンドラインツールをインストールするために、ターミナル上でコマンド xcode-select --install を実行する必要はありません。

また、IchigoJamSerialConsole をビルドするには CocoaPods

CocoaPods.org
https://cocoapods.org/

が必要です。'/アプリケーション/ユーティリティ' フォルダの 'ターミナル' を起動し

~ $ sudo gem install cocoapods

と入力し、 Return キーを押して CocoaPods をインストールしてください。パスワードの入力を求められるので、ログイン時のパスワードを入力します。しばらく時間がかかりますが、(反応がない状態が数分続きますが、そのまましばらくお待ちください。)

~ $ sudo gem install cocoapods
Password:
Fetching: cocoapods-core-0.38.1.gem (100%)
.
.
Parsing documentation for cocoapods-0.38.1
Installing ri documentation for cocoapods-0.38.1
3 gems installed
~ $ 

とプロンプト $ 文字が表示されれば終了です。CocoaPods のアップデートも、インストールと同じく再度 sudo gem install cocoapods を実行してください。

CocoaPods は最新の状態にしないと IchigoJamSerialConsole のソースを修正する必要が生じます。私が使用している CocoaPods のバージョンは、ターミナルのコマンド pod で確認すると


図 7) ターミナルで CocoaPods のバージョン確認

~ $ pod --version
0.38.2
~ $

0.38.2 です。


それでは、IchigoJamSerialConsole のソースをダウンロードします。2つの方法があります。厳密には GitHubGitHub on Mac アプリケーションを使う方法もあります。(私は GitHub on Mac を使ったことがないので詳しくは知らないのですが、Chrome で 'Clone in Desktop' ボタンをクリックすると GitHub on Mac が起動し、保存先を尋ねてくるそうです。)

一つ目は GitHub サイト

titoi2/IchigoJamSerialConsole · GitHub
https://github.com/titoi2/IchigoJamSerialConsole

の右中央の Downloaded Zip ボタンをクリックしてダウンロードする方法です。IchigoJamSerialConsole-master.zip という名前のファイルがダウンロードされ、ダブルクリックすると IchigoJamSerialConsole-master という名前のソースが含まれたフォルダが作成されます。好きな場所に IchigoJamSerialConsole-master フォルダを移動してください。

2つ目は、git コマンドを使う方法です。上記サイトの右中央


図 8) GitHubクリップボードアイコン

クリップボードアイコン をクリックします。クリップボードhttps://github.com/titoi2/IchigoJamSerialConsole.git という文字列がコピーされます。後は、ターミナルでインストールしたいフォルダに移動して (例としてデスクトップを指定しています。)、git コマンドを 'git clone ' と入力し、続けて Command+v でクリップボードからターミナルに文字列をペーストしてください。最後に Return キーを押して実行します。


図 9) git コマンドでソースをダウンロード

~ $ cd Desktop
~/Desktop $ git clone https://github.com/titoi2/IchigoJamSerialConsole.git

Cloning into 'IchigoJamSerialConsole'...
remote: Counting objects: 145, done.
remote: Total 145 (delta 0), reused 0 (delta 0), pack-reused 145
Receiving objects: 100% (145/145), 94.62 KiB | 0 bytes/s, done.
Resolving deltas: 100% (67/67), done.
Checking connectivity... done.

~/Desktop $ 

これでデスクトップに IchigoJamSerialConsole という名前のフォルダが作成され、ソースがダウンロードされました。ターミナルで IchigoJamSerialConsole フォルダに移動します。

~/Desktop $ cd IchigoJamSerialConsole/

折角 git を使ったので、簡単な使い方を説明します。

現在ダウンロードしたリモートサーバーのアドレスを表示するには、git remote -v

~/Desktop/IchigoJamSerialConsole $ git remote -v
origin	https://github.com/titoi2/IchigoJamSerialConsole.git (fetch)
origin	https://github.com/titoi2/IchigoJamSerialConsole.git (push)

を使います。この場合、origin というリモートリポジトリの名前でリモートサーバーのアドレスを設定しています。

ブランチの表示には、 git branch -va です。

~/Desktop/IchigoJamSerialConsole $ git branch -va
* master                57820b4 ログクリアボタン追加
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 57820b4 ログクリアボタン追加
~/Desktop/IchigoJamSerialConsole $ 

上記より、現在のブランチは master です。

リモートリポジトリ origin の履歴を取得するには、 git fetch origin

~/Desktop/IchigoJamSerialConsole $ git fetch origin
~/Desktop/IchigoJamSerialConsole $ 

です。最新の履歴を表示するには、git branch -va

~/Desktop/IchigoJamSerialConsole $ git branch -va
* master                57820b4 ログクリアボタン追加
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 57820b4 ログクリアボタン追加
~/Desktop/IchigoJamSerialConsole $

で確認できます。

ステータスを確認するには、git status を使います。

~/Desktop/IchigoJamSerialConsole $ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
~/Desktop/IchigoJamSerialConsole $ 

git log を使うとコミットを確認できます。

~/Desktop/IchigoJamSerialConsole $ git log
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Author: xxxxxxxxxxx
Date:   xxx xxx x xx:xx:xx xxx +xxxx 
 :q


スペースキーを押すと次のページを開きます。終了は q キーを押してください。

git pull で自分のローカルリポジトリをリモートリポジトリの内容で更新します。

~/Desktop/IchigoJamSerialConsole $ git pull
Already up-to-date.
~/Desktop/IchigoJamSerialConsole $

git についてはあまり詳しくはありません。ソースを最新の状態にしたい場合は git pull を実行すれば良いようです。差分だけがダウンロードされ、最新状態になります。


次に CocoaPods を使って必要なライブラリをダウンロードする必要があります。

IchigoJamSerialConsole-master.zip ファイルをダウンロードし展開したフォルダ IchigoJamSerialConsole-master に 'ターミナル' 上で移動します。git コマンドでダウンロードした場合は、IchigoJamSerialConsole フォルダに移動してください。(今回の例では 'デスクトップ/IchigoJamSerialConsole' フォルダに移動しています。)

IchigoJamSerialConsole フォルダで説明します。(IchigoJamSerialConsole-master フォルダでも同じです。)

pod install コマンドを実行します。

~/Desktop/IchigoJamSerialConsole $ pod install
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Installing ORSSerialPort (1.8.1)
Generating Pods project
Integrating client project
Sending stats
~/Desktop/IchigoJamSerialConsole $

シリアルポートライブラリ ORSSerialPort がインストールされます。

open . コマンドで IchigoJamSerialConsole フォルダを Finder で開きます。

~/Desktop/IchigoJamSerialConsole $ open .

IchigoJamSerialConsole フォルダの IchigoJamSerialConsole.xcworkspace ファイルをダブルクリックして Xcode で開きます。(IchigoJamSerialConsole.xcodeproj ファイルではないので注意してください。)


図 10) IchigoJamSerialConsole.xcworkspace を Xcode で開いた状態


図 11) メニュー表示

図 10) のようにツールバーの IchigoJamSerialConsole 文字をクリックしてポップアップメニューを開き、図 11) 'Edit Scheme ...' を選択します。


図 12) Edit Scheme ...

上図のように、左ペインから Run をクリックし、Info タブを選択します。


図 13) Build Configurarion 選択

Build Configurarion: release

Build Configurarion のメニューから release を選択します。リリースを選択するとビルドしたアプリケーションに余計な情報が含まれていません。

右下の Close ボタンをクリックしてウインドウを閉じます。


図 14) Project Navigator

上図のように Project Navigator (一番左のペイン) の IchigoJamSerialConsole 文字列をクリック、その横のエリア


図 15) PROJECT と Deployment Target 選択

PROJECT
IchigoJamSerialConsole

図 15) 'PROJECT' 下の文字 IchigoJamSerialConsole をクリック、さらに横の Info タブを選択

▼ Deployment Target
      OS X Development Target 10.10


図 15) の OS X Development Target のメニューから、対応する最下位の OS を選択します。この場合だと OS X Yosemite 10.10 以上に対応しています。好きなバージョンを選択してください。あくまでも宣言しているだけであって、ソースが対応している必要があります。


図 16) TARGETS 選択

TARGETS
IchigoJamSerialConsole

図 16) 左から2番めのペイン 'TARGETS' 下の文字 IchigoJamSerialConsole をクリック、その横の General タブをクリック


図 17) Deployment

▼ Deployment Info
      Development Target 10.10

図 17) のように先ほど選択した Deployment Target と同じか確認して下さい。違う場合は設定してください。

▼ Identity
     Bundle Identifier: jp.aboutsoft.IchigoJamSerialConsole

      Signing ◯ Mac App Store
                   ◯ Developer ID
                   ● None
                  
     Team: None

図 17) Identity の項目で今回は必要ありませんが、アプリケーションの識別子 jp.aboutsoft.IchigoJamSerialConsole を設定できたり、Mac App Store 以外で公開する場合の署名 Developer ID などを選択できます。Developer ID をクリックすると Team: None メニューから有効なメンバーを選択できます。

Apple Developer
https://developer.apple.com/

詳しくは、上記URLの Apple Developer Center/Member Center/Certificates, Identifiers & Profiles/Mac Apps/App Distrubution Guide を参照してください。

これで設定は終了です。


図 18) ビルド


図 19) 停止

図 18) 左上ツールバーの ▶ ボタンをクリックしてビルドすると IchigoJamSerialConsole アプリケーションの作成に成功しますが、警告が表示されます。図 19) のように ▶ ボタンの横の■ ボタンをクリックしてアプリケーショを終了してください。


図 20) Issue Navigator

図 20) ツールバーの下にある Navigator (一番左のペイン) 上部の 8 つのアイコンが並んでいる中から、左から4番目の警告アイコン (Issue Navigator) が選択されているか確認して下さい。

図 20) のように一番左側ペイン Issue Navigator に IJCSerialManager.swift ファイルの5つの警告が表示されます。警告をクリックすると


図 21) Fix-it ダイアログ

Issue: ********************
Fix-it Replace "! ******************

図 21) のようなダイアログが開きます。青色で反転した Fix-it と書かれたエリアをダブルクリックするとソースが自動で修正されます。! マークを削除しているだけです。すべての警告をクリックして上のように修正してください。すべての警告がなくなります。

念のため、

メニュー/Product/Clean

を選択し、ビルドされているアプリケーションを削除します。


図 22) ビルド


図 23) 停止

再度、図 22) 左上ツールバーの ▶ ボタンをクリックしてビルドします。IchigoJamSerialConsole アプリケーションが起動しますが、図 23) のように ▶ ボタンの横の■ ボタンをクリックしてアプリケーショを終了してください。


図 24) Project Navigator

図 24) のようにツールバーの下にある Navigator (一番左のペイン) 上部の 8 つのアイコンが並んでいる中から、一番左のフォルダアイコンをクリックしてください。プロジェクト・ナビゲーターが開きます。一番トップの IchigoJamSerialConsole から ▶ をクリックして階層を下って行くと


図 25) IchigoJamSerialConsole アプリケーション

▼IchigoJamSerialConsole
        ▼Products
                IchigoJamSerialConsole.app

図 25) のように Products の下にアプリケーションアイコンと IchigoJamSerialConsole.app 文字列が見つかるはずです。これが目的の IchigoJamSerialConsole アプリケーションです。赤い文字列の場合、ビルドに失敗しています。


図 26) Finder に IchigoJamSerialConsole アプリケーションを表示

図 26) のように IchigoJamSerialConsole.app 文字列をマウスで右クリック (CTRL + 左クリック) し、'メニュー/Show in Finder' を選択してください。

IchigoJamSerialConsole アプリケーションが Finder に表示されます。好きな場所にコピーしてください。

これで IchigoJamSerialConsole アプリケーションのビルドに成功しました。


ここからは個人的に関心があった簡単なソース解析です。

自作の PC-G850V、PC-G850VS と Mac の間でシリアル通信ができるアプリケーション

PCG-LinkMac
http://kyoshiaki.sakura.ne.jp/osx/pcg850v.html#pcglink

の場合、シリアルポートを読み書きするプログラムは自作していたのですが、IchigoJamSerialConsole では便利なシリアルポートライブラリ ORSSerialPort を使用していました。こんな便利なライブラリがあったのですね。

ORSSerialPort ライブラリ、IchigoJamSerialConsole のソースを全て理解するのは無理なので、関心があるところだけ読み解きたいと思います。

キー入力は NSResponder クラスを継承した NSView のサブクラス MainView の func keyDown(theEvent: NSEvent)、func keyUp(theEvent: NSEvent) から

// MainView.swift
  override func keyDown(theEvent: NSEvent) {
     delegate.onKeyDown(theEvent)
  override func keyUp(theEvent: NSEvent) {
     delegate.onKeyUp(theEvent)

上のソース (ソースは省略してあるので、先頭に表示してあるファイル名とメソッド名を頼りに Xcode で確認して下さい。) のように delegate の onKeyDown(theEvent)、onKeyUp(theEvent) を呼び出しています。

// ViewController.swift
   override func viewDidLoad() {
        mainView.delegate = self

MainView の delegate は ViewController です。

// ViewController.swift
   func onKeyDown(theEvent: NSEvent) {
      keyDownProc(theEvent)

ViewController の onKeyDown(theEvent: NSEvent) から keyDownProc(theEvent) を呼び出しています。

// ViewController.swift
   func keyDownProc(theEvent: NSEvent) {
   	serialManager.sendByte(c8)

ViewController の keyDownProc(theEvent: NSEvent) で PS/2 のキーコードに変換し、serialManager.sendByte(c8) を呼び出し、シリアルポートに1バイト出力しています。

serialManager は IJCSerialManager.swift の IJCSerialManager クラスをインスタンス化したものです。

// IJCSerialManager.swift 
    func sendByte(param:UInt8) {
    	sp.sendData(data)

sp は ORSSerialPort クラスです。sendData(data) で実際にシリアルポートに書き込んでいます;

// FileLoadViewController.swift
     func loadData2Ichigojam(data:NSData) {
            serialManager.sendByte(d)
            NSThread.sleepForTimeInterval(0.02)


また、テキストをシリアルポートに書き込むメソッド loadData2Ichigojam(data:NSData)の場合、1バイト送るごとに NSThread.sleepForTimeInterval(0.02) で遅延しています。

IJCSerialManager.swift 
    func open(path:String) {

func open(path:String) メソッドを見るとシリアルポートを通信速度 115200 で開いていることが判ります。

ORSSerialPort ライブラリから呼び出されるプロコトル、シリアルポードを開く処理などは、すべて IJCSerialManager.swift でおこなっています。ORSSerialPort ライブラリのプロコトルから呼び出されるメソッドを IJCSerialManager.swift に実装し、そのメソッドから IJCSerialManager.swift 宣言したプロコトル IJCSerialManagerDelegate を使って ViewController.swift に流しています。

私にとって ORSSerialPort ライブラリはあまりにも複雑すぎて完全には理解できないのですが、シリアルポードは基本的に BSD ライブラリの

#include <fcntl.h>
int open(const char *path, int oflag, ...);
ssize_t write(int fildes, const void *buf, size_t nbyte);     

上記システムコール関数 open() でデバイスを開き、write() 関数で書き込むだけです。詳しくは、ターミナルで

~ $ man 2 open
~ $ man 2 write
~ $ 

上記 man コマンドで確認して下さい。次ページを表示するにはスペースキーを押し、終了は q キーを押してください。
man の内容をテキストファイルに出力するには、以下のコマンド

~ $ man 2 open | col -bfx > open.txt
~ $ open open.txt
~ $ 

を実行してください。

デバイスの通信速度などの設定は

#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/ioctl.h>

struct termios termios_p;
int tcgetattr(int fildes, struct termios *termios_p);
int tcsetattr(int fildes, int optional_actions, const struct termios *termios_p);	
speed_t cfgetispeed(const struct termios *termios_p);
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetospeed(struct termios *termios_p, speed_t speed);
int cfsetspeed(struct termios *termios_p, speed_t speed);

上記関数で設定できます。ターミナルで

~ $ man 3 tcgetattr

で確認してください。拙作 PCG-LinkMac や ORSSerialPort ライブラリでも基本は同じです。


ただし、ソースを解析していて驚いたのは入手できるシリアルポートを調べるのに IOKit を使っているところです。私は安直に /dev を開いて調べていました。

ちょと抜き出してみました。(ソースは省略してあるので、詳細は必ず IchigoJamSerialConsole.xcworkspace ファイルを Xcode で開き、ツールバー下にあるフォルダアイコンをクリックし、一番左側ペイン Project Navigator で

PodsPods
          ORSSerialPort.m
          ORSSerialPortManager.m
 


ORSSerialPort.m、ORSSerialPortManager.m を確認して下さい。)

// ORSSerialPort.m

#import <IOKit/serial/IOSerialKeys.h>
#import <IOKit/serial/ioss.h>

@property (readonly) io_object_t IOKitDevice;

+ (NSString *)stringPropertyOf:(io_object_t)aDevice forIOSerialKey:(NSString *)key;
{
	CFStringRef string = (CFStringRef)IORegistryEntryCreateCFProperty(aDevice, (__bridge CFStringRef)key, kCFAllocatorDefault, 0);
	return (__bridge_transfer NSString *)string;
}

+ (NSString *)bsdCalloutPathFromDevice:(io_object_t)aDevice;
{
	return [self stringPropertyOf:aDevice forIOSerialKey:(NSString*)CFSTR(kIOCalloutDeviceKey)];
}
//  ORSSerialPortManager.m
// 220行目
 - (void)retrieveAvailablePortsAndRegisterForChangeNotifications;
{
	self.portPublishedNotificationIterator = portIterator;
	IOObjectRelease(portIterator);
	
	NSMutableArray *ports = [NSMutableArray array];
	io_object_t eachPort;
	while ((eachPort = IOIteratorNext(self.portPublishedNotificationIterator)))
	{
		ORSSerialPort *port = [ORSSerialPort serialPortWithDevice:eachPort];
		
		// シリアルポートの場合、配列 ports に追加
		if (port) [ports addObject:port];
		IOObjectRelease(eachPort);
	}	
	// 入手できるシリアルポートに代入
	self.availablePorts = ports;

#define kIOCalloutDeviceKey		"IOCalloutDevice"  // /dev/cu.usbserial-FTG6R5XK
#define kIODialinDeviceKey		"IODialinDevice"    // /dev/tty.usbserial-FTG6R5XK

上のソースがその箇所です。個人的に動作を調べるために作成したサンプルを

シリアルポートデバイスのパス名を Xcode 下のデバッガコンソールに表示するプログラム
http://kyoshiaki.sakura.ne.jp/osx/Sample/SerialPort.zip

上記URLで公開します。

USB シリアル変換ケーブルを接続して上記URLで公開しているプロジェクトをビルドすると、シリアルポートを Xcode 左下のデバッガコンソールに表示します。ソースは以下のとおりです。

/*
 IOKit からデバイス名を取り出す
 */
-(void)bsdPathFromDevice {
    
    CFMutableDictionaryRef matchingDict = NULL;
    
    // kIOSerialBSDServiceValue にマッチした IOService の CFMutableDictionaryRef を作成
    matchingDict = IOServiceMatching(kIOSerialBSDServiceValue);
    CFRetain(matchingDict); // Need to use it twice
    
    // matchingDict に キー:CFSTR(kIOSerialBSDTypeKey) 値:CFSTR(kIOSerialBSDAllTypes) を追加
    CFDictionaryAddValue(matchingDict, CFSTR(kIOSerialBSDTypeKey), CFSTR(kIOSerialBSDAllTypes));
    
    // portIterator に matchingDict で指定した IOService object をセット
    io_iterator_t portIterator = 0;
    kern_return_t err = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &portIterator);
    CFRelease(matchingDict);
    
    if (err) return;
    
    // portIterator からシリアルポート eachPort を取り出す
    io_object_t eachPort = 0;
    while ((eachPort = IOIteratorNext(portIterator)))
    {
        // デバイス名を取得
        NSString *calloutPath = [ViewController bsdCalloutPathFromDevice:eachPort];  // /dev/cu.xxxxx
        NSString *dialinPath = [ViewController bsdDialinPathFromDevice:eachPort];    // /dev/tty.xxxx
        
        NSLog(@"%@\n", calloutPath);
        NSLog(@"%@\n", dialinPath);
        
        IOObjectRelease(eachPort);
    }
    IOObjectRelease(portIterator);
    
}

/*
 シリアルポートのデバイス名を取り出す関数
 */
+ (NSString *)stringPropertyOf:(io_object_t)aDevice forIOSerialKey:(NSString *)key
{
    
    // ここが IOKit からシリアルポートのデバイス名を取り出している箇所
    CFStringRef string = (CFStringRef)IORegistryEntryCreateCFProperty(aDevice,
                                                                      (__bridge CFStringRef)key,
                                                                      kCFAllocatorDefault,
                                                                      0);
    return (__bridge_transfer NSString *)string;
}

/*
 kIOCalloutDeviceKey: @"/dev/cu.xxxxx" を返す
 */
+ (NSString *)bsdCalloutPathFromDevice:(io_object_t)aDevice
{
    return [self stringPropertyOf:aDevice forIOSerialKey:(NSString*)CFSTR(kIOCalloutDeviceKey)];
}

/*
 kIODialinDeviceKey: @"dev/tty.xxxxx" を返す
 */
+ (NSString *)bsdDialinPathFromDevice:(io_object_t)aDevice
{
    return [self stringPropertyOf:aDevice forIOSerialKey:(NSString*)CFSTR(kIODialinDeviceKey)];
}

後、ORSSerialPort ライブラリでシリアルポートからの読み込みの部分をどう実装しているかと思ったのですが

//  ORSSerialPort.m
// 236行目
- (void)open;
{
// 288行目
	// ここで非同期のシリアルポートを読むスレッド作成
	dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
		
		int localPortFD = self.fileDescriptor;
		struct timeval timeout;
		int result=0;
		
		while (self.isOpen)
		{
			fd_set localReadFDSet;
			FD_ZERO(&localReadFDSet);
			FD_SET(localPortFD, &localReadFDSet);
			
			timeout.tv_sec = 0;
			timeout.tv_usec = 100000; // Check to see if port closed every 100ms
			
			dispatch_semaphore_wait(self.selectSemaphore, DISPATCH_TIME_FOREVER);
			// デバイスに変化があったか
			result = select(localPortFD+1, &localReadFDSet, NULL, NULL, &timeout);
			dispatch_semaphore_signal(self.selectSemaphore);
			if (!self.isOpen) break; // Port closed while select call was waiting
			if (result < 0)
			{
				[self notifyDelegateOfPosixError];
				continue;
			}
			
			// データの読み込みがあったデバイスが目的のデバイスでない
			if (result == 0 || !FD_ISSET(localPortFD, &localReadFDSet)) continue;
			
			// Data is available
			char buf[1024];
			// デバイスからデータの読み込み
			long lengthRead = read(localPortFD, buf, sizeof(buf));
			if (lengthRead>0)
			{
				NSData *readData = [NSData dataWithBytes:buf length:lengthRead];
				// 読み込んだデータを receiveData: メソッドで呼び出す
				if (readData != nil) [self receiveData:readData];
			}
		}
	});


open メソッドを呼び出すと、データを読み込む別スレッドが dispatch_async 関数で作成されます。self.isOpen が NO になるとスレッドは終了します。[self receiveData:readData]; で読み込んだデータを下記のように

// 539行目
 - (void)receiveData:(NSData *)data;
{
	// serialPort:didReceiveData: メソッドは、プロコトル ORSSerialPortDelegate  に準拠
	// デリゲートに serialPort:didReceiveData: が実装されているか確認
	if ([self.delegate respondsToSelector:@selector(serialPort:didReceiveData:)])
	{
		//
		dispatch_async(dispatch_get_main_queue(), ^{
			[self.delegate serialPort:self didReceiveData:data];
		});
	}
	
	dispatch_async(self.requestHandlingQueue, ^{
		[self.receiveBuffer appendData:data];
		// データを受け取っていない場合、もう一度送る
		// よく理解できなかった
		[self checkResponseToPendingRequestAndContinueIfValid];
	});
}

プロコトル ORSSerialPortDelegate に準拠したデリゲートに送信しています。

私も IOKit を使用したシリアルポートの入手方法を探していましたが、以前は見つけることができませんでした。今回、ORSSerialPort ライブラリのソースで理解できたので再度調べたら、私が所有していた


OS X and iOS Kernel Programming

OS X and iOS Kernel Programming

OS X and iOS Kernel Programming
Chapter 11
Serial Port Drivers
Location 6089
Accessing a Serial Port from User Space

Mac OS X and iOS Internals: To the Apple's Core

Mac OS X and iOS Internals: To the Apple's Core

Mac OS X Internals:A System Approach
Chapter 10
Extending the Kernel
10.2 The I/O Kit
10.5 Communicating with the Kernel

で見つけることが出来ました。ここでは説明しませんでしたが ORSSerialPort.m の - (void)open 関数では、シリアルポートが存在するか、シリアルポートの CTS、DSR の状態チェックをする別のスレッドを作成しています。本当に ORSSerialPort ライブラリは綺麗にまとまっていますね。