突然消失するかもしれないブログ

”とつきえブログ”

Androidのモデム

Androidのテレフォニー系のサービスはrilで実現されているわけですが、hardware/rilの下のソースコードにdoxygenをかけてみました。

そこで見つけたのが、これ。

#define PPP_TTY_PATH   "/dev/omap_csmi_tty1"

気になったのでググるとやっぱりありました。

AndroidのATコマンド – Android Zaurusはてな館

以下をgrepしてみたところ、ATコマンドをsendしているところがいくつかマッチします。AndroidってやっぱりATコマンドをサポートしているんですね。

hardware/ril/reference-ril/reference-ril.c

omap_csmiに関する定義は、bionic(libc)の中に含まれています。

bionic/libc/kernel/common/linux/omap_csmi.h

omap_csmi.hの中身はこちら。

/dev/omap_csmi_tty1に対するioctlに関するもののようです。

役目としては、ベースバンドのパワーコントロールっぽいです。

#define OMAP_CSMI_TTY_ENABLE_ACK _IO(‘c’, 0)
#define OMAP_CSMI_TTY_DISABLE_ACK _IO(‘c’, 1)
#define OMAP_CSMI_TTY_READ_UNACKED _IOR(‘c’, 2, int)
#define OMAP_CSMI_TTY_ACK _IOW(‘c’, 3, int)
#define OMAP_CSMI_TTY_WAKEUP_AND_ACK _IOW(‘c’, 4, int)

このOMAPのCSMIとは、やはりベースバンドと通信するためのOMAPスペシフィックな部品らしいです。

CSMI, which is a piece of OMAP-specific hardware for communicating with the baseband

 

Androidの実機への移植の実際

image

こちらの情報によると、/dev/smd0でandroid modemを制御していいるように見えます。/dev/smd0がソース中で見つからないのは、rildがlibreference-ril.soを実行時する際にオプションとして指定しているから。

でも、Android 1.1 SDK, release1のemulatorで確認したところ、/dev/smd0が見つからないです。T-Mobile G1では/dev/smd0と/dev/smd27というのが見つかります。

image

こちらの情報は、W-SIMをAndroidに実装した場合の構成のようです。

libwsim-ril.soの下にある専用ドライバは、通話時の音声入出力関係でしょうか?(W-SIM – WikipediaによるとW-SIMは音声入出力用のPCMデータをやりとりする専用の端子があるとか)

追記:2009/03/22 22:00

Yongrenさん

まいたうんです。こんにちは。

貴重なコメントどうもありがとうございます。

これは、ATコマンドをサポートしているというよりも、3GPP定義のATコマンドを利用して、Vendor RILを開発できますよ、と言っているだけで、ATコマンドで電話機能をサポートしなければならないということではないです。
独自のインターフェースでサポートしても当然okです。

ご指摘の通りだと思います。

電話機能に関しては、http://www.kandroid.org/android_pdk/telephony.htmlの最初の図のVendor RIL以下が各携帯電話会社が準備しなければならない部分で、公開されているVendor RILのサンプルコードでは、図中のVendor RIL – Baseband間を3GPPの仕様書に準拠したATコマンドでサポートするように作ってあります。

この記事をエントリーしてから自分なりに調べ直してみたところ、emulator環境では、RILからQEMU側に実装されているモデムエミュレーションに仮想シリアル(/dev/tty?)経由でATコマンドを送っているだけのようでした。

もし、ATコマンドだけでAndroidの電話機機能が対応可能というのなら、既に各社固有のアプリケーションプラットフォームを持っている携帯電話会社にとっては、既存のプラットフォームを存続しながら、Androidの電話機能を簡単にサポートできるということになります。

しかし、現在Androidで定義されているすべてのTelephony系コマンドがATコマンドだけで対応可能かどうかは、非常に疑問です。

ATコマンドだけでAndroidの電話機能が対応可能であれば、携帯電話を作るのがかなり楽になると期待していたのですが、そうは問屋が卸さなそうですね。

ところで、音声通話の音声データはATコマンドでやりとりできるものなのでしょうか?

例えば、現在定義されているUplink方向の75個のコマンド(RIL_REQUEST_XXXX)の中で、SIM tool kitをコントロールするためのコマンドが幾つかありますが、確か3GPPのATコマンド中には、SIM tool kitをコントロールするためのコマンドが存在していないと思います。

日本国内向けのAndroid携帯電話では、STK(SIM Tool Kit)の需要がどれだけあるかはわかりませんが、対応出来ないより対応出来た方がいいですよね。願わくはスマートな方法で対応出来ればベターというか。

iPhoneだとSTK認識しそうな感じですね。

iPhone 2.0でSTK認識するけど » アジアの片隅から

広告

Androidのモデム」への2件のフィードバック

  1. Yongren 3月 21, 2009 1:25 am

    これは、ATコマンドをサポートしているというよりも、3GPP定義のATコマンドを利用して、Vendor RILを開発できますよ、と言っているだけで、ATコマンドで電話機能をサポートしなければならないということではないです。
    独自のインターフェースでサポートしても当然okです。

    電話機能に関しては、http://www.kandroid.org/android_pdk/telephony.htmlの最初の図のVendor RIL以下が各携帯電話会社が準備しなければならない部分で、公開されているVendor RILのサンプルコードでは、図中のVendor RIL – Baseband間を3GPPの仕様書に準拠したATコマンドでサポートするように作ってあります。

    もし、ATコマンドだけでAndroidの電話機機能が対応可能というのなら、既に各社固有のアプリケーションプラットフォームを持っている携帯電話会社にとっては、既存のプラットフォームを存続しながら、Androidの電話機能を簡単にサポートできるということになります。

    しかし、現在Androidで定義されているすべてのTelephony系コマンドがATコマンドだけで対応可能かどうかは、非常に疑問です。

    例えば、現在定義されているUplink方向の75個のコマンド(RIL_REQUEST_XXXX)の中で、SIM tool kitをコントロールするためのコマンドが幾つかありますが、確か3GPPのATコマンド中には、SIM tool kitをコントロールするためのコマンドが存在していないと思います。

  2. Yongren 3月 27, 2009 12:58 am

    まいたうんさん、こんにちわ。

    改めて自己紹介させていただきますが、私はイギリスで日系の某大手電気会社の子会社にて携帯電話の仕事をしているものです。
    専門は3GPPの2G/3Gのプロトコルスタックでして、Androidについては、Telephony機能を自社の製品にポーティングする方法について調査しております。

    >ATコマンドだけでAndroidの電話機能が対応可能であれば、
    >携帯電話を作るのがかなり楽になると期待していたのですが、
    >そうは問屋が卸さなそうですね。

    もし今の日本の携帯電話会社がAndroid対応機を出すとしたら、どの会社も無理矢理にでもATコマンドによる方法で開発してくると思います。
    理由は(私が勝手に思っている理由)、
    1.ATコマンドだけでAndroidが実現できるのなら、今各社が既に出荷している電話機のアプリケーション側のプラットフォーム上でAndroidサポートの為の特別の改造無しにAndroid機能をサポートできる。
    2.不景気なので、独自のI/FによってRIL – Baseband間を設計する余裕がない。

    オペレータ直下型の携帯電話市場である日本では、オペレータさんからの基本的要件を実現することが最優先なので、既に実現できている仕組みを捨てて改めてAndroid上で客先要件を開発するなんてこと絶対やりたくないはずなので、ATコマンド方法が最適なAndroidサポート方法だと私は思っております。

    それと、私が前に述べたSIM Tool Kitに関するものは、+CSIM (Generic SIM access)というATコマンドでサポートできるかもしれません。
    ちなみに3GPPでは、SIM Tool Kitはオプション機能として定義されていますので、Android上ではサポートしないという決定でも当然問題ありません。

    >ところで、音声通話の音声データはATコマンドでやりとりできる
    >ものなのでしょうか?

    詳細な仕組みは、すみませんが私も理解しているわけではありませんが、答えはyesです。
    実は私はATコマンドはほとんど素人なのですが、同僚の説明では、3GPPのATコマンドは元々はPCのモデム等のATコマンドをベースにして、携帯電話に接続した外部デバイスに携帯電話機能を提供するための機能であり、今3GPPが携帯電話機能として定義してあるほとんどの機能はATコマンドで操作可能のはずだとのことです。

    ATコマンド自体は文字列ですので、文字列のやり取りで音声データ自身が扱われるわけではないはずですが、ATコマンドの+FCLASS (3GPP勧告書27.007のC.2.1の章参照)の後、音声データのやり取りになる、と私の同僚が言っております。

    ところで、まいたうんさんが既に見つけていたPPP_TTY_PATHですが、これは私が今必死になって調べている、パケットデータの送受信に関わるものだということが、最近分かってきました。
    Vendor RILのサンプルであるreference-ril.cでは、PPP_TTY_PATH(=”/dev/omap_csmi_tty1″)はRIL_REQUEST_SETUP_DEFAULT_PDPコマンドによって、PDP Context Activation(パケット通信開始の為の初期化処理みたいなもの。御存知かも知れませんが、とりあえず。)を正常に終了した後に、上位に通知されております。
    その後上位は、PPP_TTY_PATHをソケット機能を扱うデバイスドライバとしてオープンし、ソケット機能のwrite()/read()によって、RILを仲介せずにパケットデータの送受信を行っていると考えられます。
    また、RIL_REQUEST_SETUP_DEFAULT_PDPコマンドの最初の処理に、fd = open (“/dev/qmi”, O_RDWR); とありますので、これもパケット通信に関係する何かでしょう。

    http://www.kandroid.org/android_pdk/telephony.htmlの最初の図からは、パケットデータもRILを仲介するように読み取れますが、RILではパケットデータ処理を行うための初期化処理・終了処理・エラー処理等のコントロールだけを行い、パケットデータ自身は、ソケット機能を仲介してアプリケーションとBasebandがやり取りを行うということが正解でしょう。

    従いまして、そのソケット機能に関わっているデバイスドライバは、Basebandとやり取りを行うためのI/Fが必要なんですが、今私はそれのソースコードがKERNELかQEMUディレクトリ以下のどこかに転がっていると思って必死になって探しているのですが、発見できておりません。
    冒頭でも述べましたが、私は3GPPの2G/3Gのプロトコルスタックの技術者で、アプリケーション側とかLinuxとかJAVAとかは非常に不得意なので、調査難航しております(T_T)。
    ちなみに、パケットデータ自身も3GPP定義のATコマンドで送受信可能です。

    調査が行き詰っていて、気晴らしに長々と書き込みさせて頂きました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。