<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Bluetooth詳説 - 開発</title>
<link>http://bluetooth.k5-n.com/index.php?topic=Develop</link>
<description>組込み向けオープンソースBluetoothライブラリ開発</description>
<managingEditor>noreply@k5-n.com</managingEditor>
<webMaster>noreply@k5-n.com</webMaster>
<copyright>Copyright 2007 Bluetooth詳説</copyright>
<generator>GeekLog</generator>
<pubDate>Wed, 14 Mar 2007 01:58:14 +0900</pubDate>
<language>ja</language>
<item>
<title>そろそろ再開</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070313233502513</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070313233502513</guid>
<pubDate>Wed, 14 Mar 2007 00:40:02 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070313233502513#comments</comments>
<dc:subject>開発</dc:subject>
<description>またちょっとずつ進めていきます。
今月中にHCIの解説をアップするのが目標です。
USBドライバも少しずつ開発していきます。

とりあえず、USBドライバの方は、
1. インタラプトIN転送の受信（つまりHCIイベント受信）が出来るようにする
2. コントロール転送でHCIコマンドを送信できるようにする
ことが当面の目標です。

&amp;gt;&amp;gt; 続く
一気に解説すると大変なので、今日はインタラプトIN転送に利用する関数を説明します。

インタラプトIN転送の受信には、usb_fill_int_urbという関数を利用します。

この関数の引数は８個もあって、順番に、
1. 初期化するURBへのポインタ
2. usb_device構造体へのポインタ
3. パイプ番号
4. バッファへのポインタ
5. バッファのサイズ
6. 完了時に呼び出すコールバック関数
7. URBコンテキストに設定するvoid*型の値（コールバック関数内で利用できる）
8. インターバル
となっています。

URBはUSB Request Blockの略で、USB通信に必要な情報を集めた構造体です。

パイプ番号は
int pipe = usb_rsvintpipe(dev-&amp;gt;udev, dev-&amp;gt;itr_in_endpointAddr);
というようにエンドポイントアドレスが分かれば取得できますので、あとはバッファサイズとインターバル値をデバイスディスクリプタから取得する必要があります。
前回TODOというコメントを入れていたインタラプトIN転送に必要な情報取得部分は、

/* エンドポイントアドレスと最大パケットサイズ、インターバルを取得*/
dev-&amp;gt;itr_in_interval = ep_desc-&amp;gt;bInterval;
dev-&amp;gt;itr_in_size = le16_to_cpu(ep_desc-&amp;gt;wMaxPacketSize);
dev-&amp;gt;itr_in_endpointAddr = ep_desc-&amp;gt;bEndpointAddress;

こんな感じになるでしょう。

あとはURBの用意とバッファの用意、コールバック関数を用意すればOKです。
URBコンテキストにはbt_usb（独自構造体）オブジェクトへのポインタを渡せば良いでしょう。</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070313233502513</trackback:ping>
</item>
<item>
<title>キャラクタ型USBドライバの実装（openとcloseだけ）</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070206231205997</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070206231205997</guid>
<pubDate>Wed, 21 Feb 2007 23:59:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070206231205997#comments</comments>
<dc:subject>開発</dc:subject>
<description>&lt;p&gt;１週間に１０時間の予定はいったいどこへやら・・・。&lt;br&gt;別件で仕事が入った上に最近疲れが溜ってきたので、今月はお休みにします。&lt;/p&gt;&lt;p&gt;とりあえず２週間程前にキャラクタ型USBドライバの形だけ作ってみたので、それだけアップします。&lt;br&gt;openとcloseだけを実装したドライバです。writeとreadは中身空っぽ。&lt;br&gt;説明も９割がた出来てたんですけど、完成は今日になってしまいました。&lt;/p&gt;&lt;p&gt;&gt;&gt; 続く&lt;/p&gt;
&lt;h3&gt;はじめに&lt;/h3&gt;&lt;p&gt;このページの最後に全ソースコードを掲載します。&lt;br&gt;先に各部を順に解説していきます。&lt;/p&gt;&lt;p&gt;追加したソースコードはカーネルソース中のusb-skeletonドライバの内容を参考にしています。&lt;br&gt;usb-skeletonには複数のプロセスから利用される場合を想定して、リファレンスカウントを使ったりセマフォによる排他制御を利用していますが、それらは削除しました。&lt;/p&gt;&lt;h3&gt;USBデバイスの登録に利用するデータ&lt;/h3&gt;&lt;pre class=&quot;sourcecode&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイス管理に必要な情報を集めた構造体 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb {    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device *udev;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;* bulk_in_buffer;     &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 受信データバッファ &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; bulk_in_size;               &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 受信バッファのサイズ &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    __u8 bulk_in_endpointAddr;          &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; バルクINエンドポイントのアドレス &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    __u8 bulk_out_endpointAddr;         &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; バルクOURエンドポイントのアドレス &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; キャラクタ型ドライバの操作関数登録に使う構造体 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file_operations bt_usb_fops = {    .owner   = THIS_MODULE,    .read    = bt_usb_read,    .write   = bt_usb_write,    .open    = bt_usb_open,    .release = bt_usb_release,};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; usb coreからマイナー番号を取得してデバイスを登録するためのUSBクラスドライバ情報 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_class_driver bt_usb_class = {    .name       = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;bt_usb&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%d&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;&lt;/font&gt;&lt;/span&gt;,    .fops       = &amp;bt_usb_fops,    .minor_base = BT_USB_MINOR_BASE,};&lt;/pre&gt;&lt;p&gt;file_operations構造体は、open/close/write/readの関数を指定するのに利用します。&lt;br&gt;usb_class_driver構造体には上記file_operations構造体へのポインタと、デバイスファイル名、マイナー番号の開始値を指定します。&lt;br&gt;このusb_class_driverはusb_register_dev関数にてUSBコアシステムに登録します。&lt;/p&gt;&lt;p&gt;bt_usb構造体はデバイス管理に利用するデータを集めたユーザー定義の構造体です。&lt;br&gt;usb_set_intfdata関数でインターフェースに関連づけると、後でusb_get_intfdata関数で取得することができます。&lt;br&gt;一応、後で通信に必要になるだろう情報を内部に格納していますが、まだwriteもreadも実装していないので、これらの情報は利用していません。&lt;br&gt;HCIコマンド送信に利用するControl転送や、HCIイベント受信に利用するInterrupt(IN)転送のこともまだ考えていないので、今後内部情報は変更することになるでしょう。&lt;/p&gt;&lt;h3&gt;probe/disconnect&lt;/h3&gt;&lt;p&gt;init/exitは前回と同様です。&lt;br&gt;probeで行っている処理は、&lt;br&gt;&lt;ol&gt;&lt;li&gt;デバイスの管理に必要なデータ（bt_usb構造体）を保存するメモリを確保する&lt;/li&gt;&lt;li&gt;HCIイベント用のInterrupt(IN)エンドポイントとACLデータ用のBulk(IN/OUT)エンドポイントを探して、後ほど利用するための情報を取得する&lt;/li&gt;&lt;li&gt;USBインターフェースにデバイス管理データを関連づける&lt;/li&gt;&lt;li&gt;USBサブシステムにデバイスを登録する&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;p&gt;disconnectでは、probeで確保したメモリを開放します。&lt;/p&gt;&lt;h3&gt;open/close&lt;/h3&gt;&lt;p&gt;キャラクタ型ドライバのopen/close/write/read関数は、openとcloseだけ実装し、write/readはまだ空っぽになっています。&lt;/p&gt;&lt;p&gt;openではファイルのプライベートデータにデバイス管理オブジェクトを保存しています。&lt;br&gt;また受信バッファの確保を行っています。（readを実装していないので使っていませんが）&lt;/p&gt;&lt;p&gt;closeでは受信バッファの開放を行っています。&lt;/p&gt;&lt;h3&gt;動作確認&lt;/h3&gt;&lt;pre class=&quot;sourcecode&quot;&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;fcntl.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; main(){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; fd = open(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;/dev/bt_usb0&quot;&lt;/font&gt;&lt;/span&gt;, O_RDWR);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (fd &lt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;) {        fprintf(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;stderr&lt;/font&gt;&lt;/span&gt;, &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Could not open device.&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;n&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;&lt;/font&gt;&lt;/span&gt;);        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; -&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;1&lt;/font&gt;&lt;/span&gt;;    }    close(fd);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;}&lt;/pre&gt;&lt;p&gt;こんなプログラムを作ってopen/closeを呼び出してみました。&lt;/p&gt;&lt;pre class=&quot;sourcecode&quot;&gt;/home/keigo/work/bluetooth/blacktooth/drivers/bt_usb/bt_usb.c: Bluetooth USB driver ver 0.1usbcore: registered new driver bt_usbusb 4-2: new full speed USB device using uhci_hcd and address 3usb 4-2: configuration #1 chosen from 1 choice/home/keigo/work/bluetooth/blacktooth/drivers/bt_usb/bt_usb.c: USB Bluetooth device now attached to BT_USB-192/home/keigo/work/bluetooth/blacktooth/drivers/bt_usb/bt_usb.c: Could not find necessary endpointsbt_usb: probe of 4-2:1.1 failed with error -12/home/keigo/work/bluetooth/blacktooth/drivers/bt_usb/bt_usb.c: bt_usb_open/home/keigo/work/bluetooth/blacktooth/drivers/bt_usb/bt_usb.c: bt_usb_releaseusb 4-2: USB disconnect, address 3/home/keigo/work/bluetooth/blacktooth/drivers/bt_usb/bt_usb.c: Bluetooth USB driver now disconnected&lt;/pre&gt;&lt;p&gt;ちゃんとopen/releaseが呼ばれています。&lt;/p&gt;&lt;p&gt;また、&quot;Could not find necessary endpoints&quot;というエラー表示が見えます。&lt;br&gt;やはり２つ目のインターフェース（SCO通信用）でもprobeが呼ばれているようです。&lt;/p&gt;&lt;h3&gt;今後の予定&lt;/h3&gt;&lt;p&gt;ACLデータの送受信はL2CAPの実装まで行わないので、先にHCIの実装に必要なHCIコマンド/イベント通信を実装します。&lt;br&gt;つまりControl転送とInterrupt転送処理ですね。&lt;/p&gt;&lt;p&gt;L2CAPの実装前までwrite/read関数はこのまま空っぽにしておきます。&lt;/p&gt;&lt;h3&gt;全ソースコード&lt;/h3&gt;&lt;pre class=&quot;sourcecode&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * HCI USB driver for Bluetooth protocol stack (Blacktooth Project)&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; *&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * Copyright (C) 2007 Lily &amp;lt;bt@k5-n.com&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * This driver was written referring to &amp;quot;drivers/usb/usb-skeleton.c&amp;quot;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * in Linux kernel soruce.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; *&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * This program is free software; you can redistribute it and/or modify&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * it under the terms of the GNU General Public License version 2 as&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * published by the Free Software Foundation;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; *&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; *&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * SOFTWARE IS DISCLAIMED.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;linux/usb.h&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ドライバのバージョン &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define VERSION &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;0.1&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; このドライバがサポートするデバイスのベンダーIDとプロダクトID &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define VENDOR_ID   &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0x0a12&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define PRODUCT_ID  &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0x0001&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスに割り当てるマイナー番号の範囲 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define BT_USB_MINOR_BASE   &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;192&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * 関数宣言&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBドライバ関係の関数 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; bt_usb_probe(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *iface, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device_id *id);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; bt_usb_disconnect(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *iface);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; __init bt_usb_init(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; __exit bt_usb_exit(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; キャラクタ型ドライバ関係の関数 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; bt_usb_open(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; inode *inode, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; bt_usb_release(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; inode *inode, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; bt_usb_read(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *buffer, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; count, loff_t *ppos);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; bt_usb_write(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *user_buffer, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; count, loff_t *ppos);&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * データ定義&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; このドライバを利用する機器のリスト &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device_id bt_id_table[] = {        { USB_DEVICE(VENDOR_ID, PRODUCT_ID) },        { },};MODULE_DEVICE_TABLE (usb, bt_id_table);&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBドライバ構造体 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_driver bt_usb_driver = {    .name       = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;bt_usb&amp;quot;&lt;/font&gt;&lt;/span&gt;,    .probe      = bt_usb_probe,    .disconnect = bt_usb_disconnect,    .id_table   = bt_id_table,};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイス管理に必要な情報を集めた構造体 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb {    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device *udev;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;unsigned&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt;* bulk_in_buffer;     &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 受信データバッファ &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; bulk_in_size;               &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 受信バッファのサイズ &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    __u8 bulk_in_endpointAddr;          &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; バルクINエンドポイントのアドレス &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    __u8 bulk_out_endpointAddr;         &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; バルクOURエンドポイントのアドレス &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; キャラクタ型ドライバの操作関数登録に使う構造体 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file_operations bt_usb_fops = {    .owner   = THIS_MODULE,    .read    = bt_usb_read,    .write   = bt_usb_write,    .open    = bt_usb_open,    .release = bt_usb_release,};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; usb coreからマイナー番号を取得してデバイスを登録するためのUSBクラスドライバ情報 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_class_driver bt_usb_class = {    .name       = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;bt_usb&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%d&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;,    .fops       = &amp;amp;bt_usb_fops,    .minor_base = BT_USB_MINOR_BASE,};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * 関数定義&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスをオープンすると呼ばれる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; bt_usb_open(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; inode *inode, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb *dev;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *iface;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; subminor;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; retval = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;bt_usb_open&amp;quot;&lt;/font&gt;&lt;/span&gt;);    subminor = iminor(inode);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBインターフェースを取得する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    iface = usb_find_interface(&amp;amp;bt_usb_driver, subminor);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!iface) {        err (&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%s&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt; - error, can't find device for minor &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%d&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;,             __FUNCTION__, subminor);        retval = -&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;ENODEV&lt;/font&gt;&lt;/span&gt;;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; exit;    }    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBインターフェースに関連づけられているデバイス管理オブジェクトを取得する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    dev = usb_get_intfdata(iface);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!dev) {        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Could not get bt_usb data.&amp;quot;&lt;/font&gt;&lt;/span&gt;);        retval = -&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;ENODEV&lt;/font&gt;&lt;/span&gt;;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; exit;    }    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ファイルのプライベートデータにデバイス管理オブジェクトを保存しておく &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    file-&amp;gt;private_data = dev;    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 受信バッファを確保する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    dev-&amp;gt;bulk_in_buffer = kmalloc(dev-&amp;gt;bulk_in_size, GFP_KERNEL);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!dev-&amp;gt;bulk_in_buffer) {        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Could not allocate bulk_in_buffer&amp;quot;&lt;/font&gt;&lt;/span&gt;);        retval = -&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;ENOMEM&lt;/font&gt;&lt;/span&gt;;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; exit;    }&lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/font&gt;:    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; retval;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスがクローズされると呼ばれる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; bt_usb_release(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; inode *inode, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb *dev;    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;bt_usb_release&amp;quot;&lt;/font&gt;&lt;/span&gt;);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ファイルのプライベートデータからデバイス管理オブジェクトを取り出す &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    dev = (&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb*)file-&amp;gt;private_data;    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (dev == &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;) {        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; -&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;ENODEV&lt;/font&gt;&lt;/span&gt;;    }    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 受信バッファを開放する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    kfree(dev-&amp;gt;bulk_in_buffer);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 読み出されたときに呼ばれる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; bt_usb_read(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *buffer, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; count, loff_t *ppos){    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;The bt_usb_read function has not been implemented yet.&amp;quot;&lt;/font&gt;&lt;/span&gt;);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 書き込まれたときに呼ばれる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;ssize_t&lt;/b&gt;&lt;/font&gt; bt_usb_write(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; file *file, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;char&lt;/b&gt;&lt;/font&gt; *user_buffer, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;size_t&lt;/b&gt;&lt;/font&gt; count, loff_t *ppos){    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;The bt_usb_write function has not been implemented yet.&amp;quot;&lt;/font&gt;&lt;/span&gt;);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスが接続されるたびに呼び出される &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; bt_usb_probe(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *iface, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device_id *id){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb *dev = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_host_interface *iface_desc;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i;    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; retval = -&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;ENOMEM&lt;/font&gt;&lt;/span&gt;;    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイス管理オブジェクト（bt_usb構造体）にメモリ割当て &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    dev = kzalloc(&lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;sizeof&lt;/b&gt;&lt;/font&gt;(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb), GFP_KERNEL);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (dev == &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;) {        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Could not allocate memory for the bt_usb structure&amp;quot;&lt;/font&gt;&lt;/span&gt;);        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; error;    }    dev-&amp;gt;bulk_in_buffer = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;;    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBデバイス構造体へのポインタを取得 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    dev-&amp;gt;udev = interface_to_usbdev(iface);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ACLデータ通信のために、必要なエンドポイントを探す &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    iface_desc = iface-&amp;gt;cur_altsetting; &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 現在選択されている代替設定 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; (i = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;; i &amp;lt; iface_desc-&amp;gt;desc.bNumEndpoints; ++i) {        &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_endpoint_descriptor *ep_desc = &amp;amp;iface_desc-&amp;gt;endpoint[i].desc;        &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ディスクリプタの属性を調べる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/font&gt; (ep_desc-&amp;gt;bmAttributes &amp;amp; USB_ENDPOINT_XFERTYPE_MASK) {        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt; USB_ENDPOINT_XFER_INT:            &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; Interrupt転送 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;            &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (ep_desc-&amp;gt;bEndpointAddress &amp;amp; USB_DIR_IN) {                &lt;font color=&quot;#0000ff&quot;&gt;// &lt;/font&gt;&lt;span style=&quot;background-color: #ffff00&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt; 必要な情報をdevに保存する&lt;/font&gt;            }            &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;case&lt;/b&gt;&lt;/font&gt; USB_ENDPOINT_XFER_BULK:            &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; Bulk転送 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;            &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (ep_desc-&amp;gt;bEndpointAddress &amp;amp; USB_DIR_IN) { &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; Bulk Input &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;                &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; エンドポイントアドレスとバッファサイズを保存 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;                dev-&amp;gt;bulk_in_size = le16_to_cpu(ep_desc-&amp;gt;wMaxPacketSize);                dev-&amp;gt;bulk_in_endpointAddr = ep_desc-&amp;gt;bEndpointAddress;            } &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt; { &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; Bulk Output &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;                &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; エンドポイントアドレスの保存 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;                dev-&amp;gt;bulk_out_endpointAddr = ep_desc-&amp;gt;bEndpointAddress;            }            &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;default&lt;/b&gt;&lt;/font&gt;:            &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; DO NOTHING &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;            &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;break&lt;/b&gt;&lt;/font&gt;;        }    }    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 必要なエンドポイントが見つかったかどうかチェック &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (!(dev-&amp;gt;bulk_in_endpointAddr &amp;amp;&amp;amp; dev-&amp;gt;bulk_out_endpointAddr)) {        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Could not find necessary endpoints&amp;quot;&lt;/font&gt;&lt;/span&gt;);        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; error;    }    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; このインターフェースにデバイス管理オブジェクトへのポインタを保存する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    usb_set_intfdata(iface, dev);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBサブシステムにデバイスを登録する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    retval = usb_register_dev(iface, &amp;amp;bt_usb_class);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (retval) {        &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 何かがこのドライバを妨害している &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Not able to get a minor for this device.&amp;quot;&lt;/font&gt;&lt;/span&gt;);        usb_set_intfdata(iface, &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;);        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;goto&lt;/b&gt;&lt;/font&gt; error;    }    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ユーザーにデバイスが接続されたノード番号を通知する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;USB Bluetooth device now attached to BT_USB-&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%d&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;, iface-&amp;gt;minor);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;error&lt;/b&gt;&lt;/font&gt;:    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; エラー前に確保したメモリを開放する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (dev != &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;) {        kfree(dev);    }    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; retval;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスが取り外されるたびに呼び出される &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; bt_usb_disconnect(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *iface){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; bt_usb *dev = usb_get_intfdata(iface);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; インターフェースに関連付けらたオブジェクトを解除 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    usb_set_intfdata(iface, &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;NULL&lt;/font&gt;&lt;/span&gt;);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBサブシステムから削除してマイナー番号を戻す &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    usb_deregister_dev(iface, &amp;amp;bt_usb_class);    &lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイス管理オブジェクトを開放 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;    kfree(dev);    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Bluetooth USB driver now disconnected&amp;quot;&lt;/font&gt;&lt;/span&gt;);}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ロードされた時にモジュールを初期化する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; __init bt_usb_init(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; ret;    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Bluetooth USB driver ver &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%s&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;, VERSION);    ret = usb_register(&amp;amp;bt_usb_driver);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (ret &amp;lt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;) {        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;usb_register failed. Error Number = &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%d&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;, ret);    }    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ret;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; モジュールを削除する直前に呼ばれる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; __exit bt_usb_exit(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;){    usb_deregister(&amp;amp;bt_usb_driver);    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Bluetooth USB Driver now deregistered&amp;quot;&lt;/font&gt;&lt;/span&gt;);}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * ドライバ情報の登録&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 初期化関数、終了関数の登録 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;module_init(bt_usb_init);module_exit(bt_usb_exit);MODULE_AUTHOR(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Lily &amp;lt;bt@k5-n.com&amp;gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;);MODULE_DESCRIPTION(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Blacktooth Project Bluetooth USB driver ver &amp;quot;&lt;/font&gt;&lt;/span&gt; VERSION);MODULE_VERSION(VERSION);MODULE_LICENSE(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;GPL&amp;quot;&lt;/font&gt;&lt;/span&gt;);&lt;/pre&gt;</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070206231205997</trackback:ping>
</item>
<item>
<title>ドライバのユーザーI/F</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070126175554286</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070126175554286</guid>
<pubDate>Fri, 26 Jan 2007 18:40:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070126175554286#comments</comments>
<dc:subject>開発</dc:subject>
<description>&lt;p&gt;ここ１週間体調を崩していたので、全く進んでいません。体調回復してきたので再開します。&lt;/p&gt;&lt;p&gt;前回作成したドライバはハードウェアの装着・削除を検出するだけの物でした。&lt;br&gt;ハードウェア側との通信だけしかしていなかったわけです。&lt;br&gt;ドライバはハードウェアとユーザーソフトウェアとの橋渡しの役目を果たしますから、ユーザー側とのI/Fを考えないといけません。&lt;/p&gt;&lt;p&gt;&gt;&gt; 続く&lt;/p&gt;
&lt;p&gt;Bluetooth USBデバイスとの通信では、４種類の通信を扱います。&lt;br&gt;HCIコマンド、HCIイベント、ACLデータ、SCOデータです。&lt;/p&gt;&lt;p&gt;一方、USBにも４種類の通信方法があります。&lt;br&gt;Control, Interrupt, Bulk, Isochronousです。&lt;/p&gt;&lt;p&gt;これらのUSB通信方法の特性と、Bluetooth HCIで扱う通信の特性を考えて、HCI-USB仕様では以下の組合せで使うことが規定されています。&lt;br&gt;（HCI-USB仕様に関しては、後ほど解説記事をアップします）&lt;/p&gt;&lt;dt&gt;HCIコマンド - Control&lt;/dt&gt;&lt;dd&gt;確実に届ける必要があります。&lt;br&gt;大きなデータは扱いませんが、帯域は優先的に確保したい。&lt;/dd&gt;&lt;dt&gt;HCIイベント - Interrupt&lt;dd&gt;確実に届ける必要があります。&lt;br&gt;大きなデータは扱いませんが、応答は早い方が望ましい。&lt;/dd&gt;&lt;dt&gt;ACLデータ - Bulk&lt;/dt&gt;&lt;dd&gt;確実に届ける必要があります。&lt;br&gt;大きなデータを扱うのでスループットが要求されますが、レイテンシは重要視されません。&lt;/dd&gt;&lt;dt&gt;SCOデータ - Isochronous&lt;/dt&gt;&lt;dd&gt;確実に届ける必要はありません。&lt;br&gt;一定時間あたりの転送量を保証する必要があります。&lt;/dd&gt;&lt;p&gt;HeadsetやHandsFreeなどの音声系プロファイルを開発するまでは、SCOデータは扱いません。&lt;br&gt;なので、まずはACLデータだけを扱うことを考えます。&lt;/p&gt;&lt;p&gt;単純にキャラクタデバイス型のドライバとして開発しようかと思います。&lt;br&gt;キャラクタデバイス型のドライバというのは、ファイルのようにopenして、writeやreadで読み書きして、closeで閉じるといった操作を行うタイプのドライバのことです。&lt;br&gt;ACLデータはwrite/readで操作し、HCIコマンドはioctrlで送るようにします。&lt;br&gt;HCIイベントは・・・シグナルを使おうかと思っています。&lt;/p&gt;&lt;p&gt;話は変わりますが、デバイスを装着したときに２回probeやdisconnectが呼ばれた件について、１つの仮説を考えました。&lt;br&gt;Bluetooth USBデバイスにはUSBインターフェースが２つ定義されています。&lt;br&gt;片方がACLデータのみ扱う用、もう一方がSCOデータ用です。&lt;br&gt;USBインターフェースは、例えば「スピーカー内蔵USBメモリ」みたいな、複数の機能を内蔵するデバイスで、それぞれの機能を分割するために用意されているものです。&lt;br&gt;つまり、それぞれのインターフェースごとに別々のドライバで制御できるようになっているわけです。&lt;br&gt;それで各インターフェースごとに呼び出されたのではないかと推測しています。&lt;/p&gt;</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070126175554286</trackback:ping>
</item>
<item>
<title>Linux Bluetooth USBドライバ作成の目的</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070119231029338</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070119231029338</guid>
<pubDate>Fri, 19 Jan 2007 23:46:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070119231029338#comments</comments>
<dc:subject>開発</dc:subject>
<description>&lt;p&gt;&lt;a href=&quot;http://www.amazon.co.jp/gp/product/4873112532?ie=UTF8&amp;tag=gentoodedeskt-22=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=4873112532&quot; target=&quot;_blank&quot;&gt;「Linuxデバイスドライバ 第3版」&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.jp/e/ir?t=gentoodedeskt-22&amp;l=as2=9&amp;a=4873112532&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;の第２版が手元あったのですが、本日第３版を入手しました。&lt;br&gt;Kernel2.6でかなりドライバ仕様が変わったのと、第２版ではUSBドライバに関する記述がほとんどなかったためです。&lt;/p&gt;&lt;p&gt;LinuxにはBlueZの用意するhci_usbドライバが存在します。&lt;br&gt;なぜ車輪の再発明をしようとするのか？&lt;br&gt;これから開発するドライバの目的をはっきりさせておきます。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;HCI-USBの仕様を理解するため&lt;/li&gt;&lt;li&gt;上位レイヤー開発に利用するため&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;最大の目的は「HCI-USBの仕様を理解するため」です。&lt;br&gt;そのためLinuxドライバに関係する記述は最低限にして、HCI-USBの仕組みがわかりやすいコードにしたいのです。&lt;/p&gt;&lt;p&gt;作成したドライバは上位レイヤー開発に利用します。&lt;br&gt;I/Fはできるだけシンプルなものにします。&lt;br&gt;あくまで開発用ですから、自分の環境で利用できれば十分です。&lt;/p&gt;&lt;p&gt;それらの目的に合わせて、次の仮定で作成します。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;接続するBluetoothデバイスは１つだけ&lt;/li&gt;&lt;li&gt;Bluetoothデバイスを利用するプロセスは１つだけ&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;今後、もしこの仮定だと開発に不都合が生じるようなら、改良することにします。&lt;/p&gt;</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070119231029338</trackback:ping>
</item>
<item>
<title>Linux USBドライバ</title>
<link>http://bluetooth.k5-n.com/article.php?story=2007011323305764</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=2007011323305764</guid>
<pubDate>Sun, 14 Jan 2007 15:10:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=2007011323305764#comments</comments>
<dc:subject>開発</dc:subject>
<description>&lt;p&gt;購入したBluetooth USBアダプター &quot;PLANEX BT-Mini2EDR&quot; を制御するUSBドライバをこれから作成していきます。&lt;/p&gt;&lt;p&gt;まずはLinux USBドライバの仕組みを知る必要があるわけですが、作成にあたって下記を参考にします。&lt;/p&gt;&lt;h4&gt;書籍&lt;/h4&gt;&lt;dt&gt;&lt;a href=&quot;http://www.amazon.co.jp/gp/product/4873112532?ie=UTF8&amp;tag=gentoodedeskt-22=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=4873112532&quot; target=&quot;_blank&quot;&gt;Linuxデバイスドライバ 第3版&lt;/a&gt;&lt;img src=&quot;http://www.assoc-amazon.jp/e/ir?t=gentoodedeskt-22&amp;l=as2=9&amp;a=4873112532&quot; width=&quot;1&quot; height=&quot;1&quot; border=&quot;0&quot; alt=&quot;&quot; style=&quot;border:none !important; margin:0px !important;&quot; /&gt;&lt;/dt&gt;&lt;dd&gt;この本の第２版を持っています。&lt;br&gt;Linuxデバイスドライバ全般に関して網羅的に恐ろしく詳細に説明されていますが、残念ながらUSBドライバに関する記述は少ししかありません。&lt;br&gt;（追記）第３版ではKernel2.6に対応しただけでなく、USBドライバに１つの章が割かれて、USBドライバ作成に関する記述が大幅に増えています。&lt;br&gt;値段が高いのが難点ですが、この書籍の情報が最も参考になるでしょう。&lt;br&gt;英語で読む労力を惜しまないならば、&lt;a href=&quot;http://www.oreilly.com/catalog/linuxdrive3/book/index.csp&quot; target=&quot;_blank&quot;&gt;オンラインバージョン&lt;/a&gt;が用意されています。&lt;/dd&gt;&lt;h4&gt;Webページ&lt;/h4&gt;&lt;dt&gt;&lt;a href=&quot;http://www.linuxjournal.com/article/7353&quot; target=&quot;_blank&quot;&gt;Writing a Simple USB Driver&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;簡単なUSBドライバのサンプルが英語で解説されています。&lt;/dd&gt;&lt;dt&gt;&lt;a href=&quot;http://www-online.kek.jp/~nakayosi/USB/usb-scsi/node12.html&quot; target=&quot;_blank&quot;&gt; USB-CAMAC デバイスドライバ&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Kernel2.4でのLinux USBドライバフレームワークの日本語解説があります。&lt;br&gt;画像が表示されなかったりしますので、メンテナンスされていないようです。&lt;/dd&gt;&lt;h4&gt;参考ソースコード&lt;/h4&gt;&lt;p&gt;（例） KERNEL_SRC = /usr/src/linux&lt;/p&gt;&lt;dt&gt;&amp;#36;(KERNEL_SRC) /drivers/usb/usb-skeleton.c&lt;/dt&gt;&lt;dd&gt;Linuxカーネルソースが提供するUSBドライバのスケルトンコードです。&lt;/dd&gt;&lt;dt&gt;&amp;#36;(KERNEL_SRC) /drivers/bluetooth/hci_usb.c, hci_usb.h&lt;br&gt;&amp;#36;(KERNEL_SRC) /include/net/bluetooth/bluetooth.h, hci_core.h&lt;br&gt;&amp;#36;(KERNEL_SRC) /net/bluetooth/hci_core.c&lt;/dt&gt;&lt;dd&gt;BlueZのBluetooth USBドライバと関連コードです。&lt;/dd&gt;&lt;br&gt;&lt;p&gt;それでは、とりあえず何もしない独自スケルトンコードを書いてみます。&lt;/p&gt;&lt;p&gt;&gt;&gt; 続く&lt;/p&gt;
&lt;h3&gt;Vendor IDとProduct ID&lt;/h3&gt;&lt;p&gt;USBデバイスにはVendorI DとProduct IDが割り振られています。&lt;br&gt;USBドライバでは、ドライバがサポートする機器のVendor IDとProduct IDを指定しますので、まずはこの情報を取得します。&lt;/p&gt;&lt;p&gt;&amp;#36; cat /proc/bus/usb/devices&lt;/p&gt;&lt;p&gt;を実行すると、接続されているUSB機器の情報が表示されます。&lt;br&gt;PCに備わっているUSBハブなどの情報も表示されるのですが、その中でBluetooth USBアダプターの情報だけを抜き出したものが以下です。&lt;/p&gt;&lt;p&gt;&lt;pre class=&quot;log&quot;&gt;T:  Bus=04 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#=  3 Spd=12  MxCh= 0D:  Ver= 2.00 Cls=e0(unk. ) Sub=01 Prot=01 MxPS=64 #Cfgs=  1P:  Vendor=0a12 ProdID=0001 Rev=19.58C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=  0mAI:  If#= 0 Alt= 0 #EPs= 3 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=81(I) Atr=03(Int.) MxPS=  16 Ivl=1msE:  Ad=02(O) Atr=02(Bulk) MxPS=  64 Ivl=0msE:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0msI:  If#= 1 Alt= 0 #EPs= 2 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=03(O) Atr=01(Isoc) MxPS=   0 Ivl=1msE:  Ad=83(I) Atr=01(Isoc) MxPS=   0 Ivl=1msI:  If#= 1 Alt= 1 #EPs= 2 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=03(O) Atr=01(Isoc) MxPS=   9 Ivl=1msE:  Ad=83(I) Atr=01(Isoc) MxPS=   9 Ivl=1msI:  If#= 1 Alt= 2 #EPs= 2 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=03(O) Atr=01(Isoc) MxPS=  17 Ivl=1msE:  Ad=83(I) Atr=01(Isoc) MxPS=  17 Ivl=1msI:  If#= 1 Alt= 3 #EPs= 2 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=03(O) Atr=01(Isoc) MxPS=  25 Ivl=1msE:  Ad=83(I) Atr=01(Isoc) MxPS=  25 Ivl=1msI:  If#= 1 Alt= 4 #EPs= 2 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=03(O) Atr=01(Isoc) MxPS=  33 Ivl=1msE:  Ad=83(I) Atr=01(Isoc) MxPS=  33 Ivl=1msI:  If#= 1 Alt= 5 #EPs= 2 Cls=e0(unk. ) Sub=01 Prot=01 Driver=(none)E:  Ad=03(O) Atr=01(Isoc) MxPS=  49 Ivl=1msE:  Ad=83(I) Atr=01(Isoc) MxPS=  49 Ivl=1ms&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;インターフェースとエンドポイントに関する情報なども含まれていますが、情報の中にVendor=0a12 ProdID=0001という記述があります。&lt;br&gt;つまりVendor ID = 0x0a12, Product ID = 0x0001ということです。&lt;/p&gt;&lt;h3&gt;ソースコード&lt;/h3&gt;&lt;p&gt;作成するスケルトンドライバは、デバイスが挿入されたときと取り外されたときにメッセージを吐き出すだけで、何もしません。&lt;p&gt;&lt;p&gt;以下がソースコード全体です。ファイル名はsimple_usb.cです。&lt;/p&gt;&lt;pre class=&quot;sourcecode&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   Simple USB driver for Linux&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   Copyright (C) 2006 Lily &amp;lt;bt@k5-n.com&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   This program is free software; you can redistribute it and/or modify&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   it under the terms of the GNU General Public License version 2 as&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   published by the Free Software Foundation;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;   SOFTWARE IS DISCLAIMED.&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;linux/usb.h&gt;&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * 定数とマクロ&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ドライバのバージョン &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define VERSION &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;0.1&quot;&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; このドライバがサポートするデバイスのベンダーIDとプロダクトID &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define VENDOR_ID   &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0x0a12&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#a020f0&quot;&gt;    &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;span style=&quot;background-color: #ffff00&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt; ドライバがサポートする機器に合わせて変更 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;#define PRODUCT_ID  &lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0x0001&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#a020f0&quot;&gt;   &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;span style=&quot;background-color: #ffff00&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#0000ff&quot;&gt; ドライバがサポートする機器に合わせて変更 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * 関数宣言&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; simple_usb_probe(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *intf, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device_id *id);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; simple_usb_disconnect(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *intf);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; __init simple_usb_init(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; __exit simple_usb_exit(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * データ定義&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; このドライバを利用する機器のリスト &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device_id simple_usb_id_table[] = {        { USB_DEVICE(VENDOR_ID, PRODUCT_ID) },        { },};MODULE_DEVICE_TABLE (usb, simple_usb_id_table);&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; USBドライバ構造体 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_driver simple_usb_driver = {    .name       = &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;simple_usb&quot;&lt;/font&gt;&lt;/span&gt;,    .probe      = simple_usb_probe,    .disconnect = simple_usb_disconnect,    .id_table   = simple_usb_id_table,};&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * 関数定義&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスが接続されるたびに呼び出される &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; simple_usb_probe(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *intf, &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_device_id *id){    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Probed&quot;&lt;/font&gt;&lt;/span&gt;);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; デバイスが取り外されるたびに呼び出される &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; simple_usb_disconnect(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;struct&lt;/b&gt;&lt;/font&gt; usb_interface *intf){    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Disconnected&quot;&lt;/font&gt;&lt;/span&gt;);}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; ロードされた時にモジュールを初期化する &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; __init simple_usb_init(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;){    &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; ret;    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Simple USB Driver ver &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%s&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;&lt;/font&gt;&lt;/span&gt;, VERSION);    ret = usb_register(&amp;simple_usb_driver);    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (ret &lt; &lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;&lt;/span&gt;) {        err(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;usb_register faild. Error Number = &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#6a5acd&quot;&gt;%d&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;&lt;/font&gt;&lt;/span&gt;, ret);    }    &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; ret;}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; モジュールを削除する直前に呼ばれる &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; __exit simple_usb_exit(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;){    usb_deregister(&amp;simple_usb_driver);    info(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Simple USB Driver deregistered&quot;&lt;/font&gt;&lt;/span&gt;);}&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; * ドライバ情報の登録&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; 初期化関数、終了関数の登録 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;module_init(simple_usb_init);module_exit(simple_usb_exit);MODULE_AUTHOR(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Lily &amp;lt;bt@k5-n.com&gt;&quot;&lt;/font&gt;&lt;/span&gt;);MODULE_DESCRIPTION(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;Simple USB driver ver &quot;&lt;/font&gt;&lt;/span&gt; VERSION);MODULE_VERSION(VERSION);MODULE_LICENSE(&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&quot;GPL&quot;&lt;/font&gt;&lt;/span&gt;);&lt;/pre&gt;&lt;p&gt;ドライバがロードされたときに呼び出される関数は、module_initで指定します。&lt;br&gt;このソースの例ではsimple_usb_initという関数を指定しています。&lt;br&gt;ドライバがアンロードされたときに呼び出される関数は、module_exitで指定します。&lt;br&gt;このソースの例ではsimple_usb_exitという関数を指定しています。&lt;/p&gt;&lt;p&gt;USBドライバの情報はusb_driver型の構造体に設定します。&lt;br&gt;ドライバの名前、デバイスが接続されたときに呼び出される関数、デバイスが取り外されたときに呼び出される関数、サポートするデバイスのリストを設定します。&lt;/p&gt;&lt;h3&gt;コンパイル&lt;/h3&gt;&lt;p&gt;「Linuxデバイスドライバ（第２版）」に書いてあるMakefileではコンパイルできませんでした。&lt;br&gt;どうやらKernel2.6では仕様が変わっているようです。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://lwn.net/Articles/21823/&quot; target=&quot;_blank&quot;&gt;Driver porting: compiling external modules&lt;/a&gt;&lt;br&gt;によると、幾つか必要なことが増えているとのこと。&lt;br&gt;今後変更になるかもしれないコンパイル手順を追いかけるより、カーネルソースのコンパイルの仕組を借りてコンパイルした方が良いとして、その場合のMakefileの書き方が載っています。&lt;/p&gt;&lt;p&gt;この方法でMakefileを作成しました。以下がMakefileの内容です。&lt;/p&gt;&lt;pre class=&quot;sourcecode&quot;&gt;&lt;font color=&quot;#a020f0&quot;&gt;ifneq&lt;/font&gt; (&lt;font color=&quot;#008b8b&quot;&gt;&amp;#36;(KERNELRELEASE)&lt;/font&gt;,)obj-m   := simple_usb.o&lt;font color=&quot;#a020f0&quot;&gt;else&lt;/font&gt;&lt;font color=&quot;#008b8b&quot;&gt;KDIR    &lt;/font&gt;:= /lib/modules/&lt;font color=&quot;#008b8b&quot;&gt;&amp;#36;(&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#008b8b&quot;&gt; uname -r)&lt;/font&gt;/build&lt;font color=&quot;#008b8b&quot;&gt;PWD     &lt;/font&gt;:= &lt;font color=&quot;#008b8b&quot;&gt;&amp;#36;(&lt;/font&gt;&lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;shell&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#008b8b&quot;&gt; pwd)&lt;/font&gt;&lt;font color=&quot;#008b8b&quot;&gt;default:&lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#008b8b&quot;&gt;&amp;#36;(MAKE)&lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt; -C &lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#008b8b&quot;&gt;&amp;#36;(KDIR)&lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt; SUBDIRS=&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#008b8b&quot;&gt;&amp;#36;(PWD)&lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt; modules&lt;/font&gt;&lt;/span&gt;&lt;font color=&quot;#a020f0&quot;&gt;endif&lt;/font&gt;&lt;font color=&quot;#008b8b&quot;&gt;clean:&lt;/font&gt;&lt;span style=&quot;background-color: #f2f2f2&quot;&gt;&lt;font color=&quot;#ff00ff&quot;&gt;    rm *.o *.ko *~ core&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;h3&gt;動作確認&lt;/h3&gt;&lt;p&gt;# insmod simple_usb.ko&lt;/p&gt;&lt;p&gt;でモジュールをロードします。この時点で&lt;/p&gt;&lt;p&gt;# dmesg&lt;/p&gt;&lt;p&gt;の結果には以下が追加されます。&lt;/p&gt;&lt;pre class=&quot;log&quot;&gt;/home/lily/work/bluetooth/blacktooth/drivers/simple/simple_usb.c: Simple USB Driver ver 0.1usbcore: registered new driver simple_usb&lt;/pre&gt;&lt;p&gt;次にBluetooth USBアダプターを接続すると、以下がdmesgに追加されます。&lt;/p&gt;&lt;pre class=&quot;log&quot;&gt;usb 3-2: new full speed USB device using uhci_hcd and address 3usb 3-2: configuration #1 chosen from 1 choice/home/lily/work/bluetooth/blacktooth/drivers/simple/simple_usb.c: Probed/home/lily/work/bluetooth/blacktooth/drivers/simple/simple_usb.c: Probed&lt;/pre&gt;&lt;p&gt;さらにBluetooth USBアダプターを取り外すと、以下がdmesgに追加されます。&lt;/p&gt;&lt;pre class=&quot;log&quot;&gt;usb 3-2: USB disconnect, address 3/home/lily/work/bluetooth/blacktooth/drivers/simple/simple_usb.c: Disconnected/home/lily/work/bluetooth/blacktooth/drivers/simple/simple_usb.c: Disconnected&lt;/pre&gt;&lt;p&gt;# rmmod simple_usb&lt;/p&gt;&lt;p&gt;でドライバモジュールを削除すると、以下がdmesgに追加されます。&lt;/p&gt;&lt;pre class=&quot;log&quot;&gt;usbcore: deregistering driver simple_usb/home/lily/work/bluetooth/blacktooth/drivers/simple/simple_usb.c: Simple USB Driver deregistered&lt;/pre&gt;&lt;p&gt;どうやら各関数はちゃんと呼び出されているようです。&lt;br&gt;ただ何故probeとdisconnectが２回呼び出されるかは謎(^^;)です。&lt;br&gt;それは開発しながらおいおい調べていくということで、とりあえず。&lt;/p&gt;</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=2007011323305764</trackback:ping>
</item>
<item>
<title>Bluetooth USBアダプター(Ver2.0+EDR対応)を購入</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070113164639597</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070113164639597</guid>
<pubDate>Sat, 13 Jan 2007 17:00:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070113164639597#comments</comments>
<dc:subject>開発</dc:subject>
<description>&lt;p&gt;開発用にVer2.0+EDR対応のBluetooth USBアダプターを買ってしまいました。&lt;br&gt;というわけで、このプロジェクトのターゲットはVer2.0+EDR対応に！&lt;/p&gt;&lt;p&gt;購入したのは「PLANEX BT-Mini2EDR」という製品です。&lt;br&gt;姉妹品で「PLANEX BT-MiniEDR」というClass 1対応の物もあるのですが、開発に利用するのに電波が100mも飛ぶ必要はないのでClass 2の物にしました。&lt;/p&gt;&lt;p&gt;下の画像の左がClass 2、右がClass 1対応です。Class 1の方がちょっと長いです。&lt;/p&gt;&lt;iframe src=&quot;http://rcm-jp.amazon.co.jp/e/cm?t=gentoodedeskt-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B000JMJQZO&amp;fc1=000000&amp;IS2=1&lt;1=_blank&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&quot; style=&quot;width:120px;height:240px;&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;&lt;iframe src=&quot;http://rcm-jp.amazon.co.jp/e/cm?t=gentoodedeskt-22&amp;o=9&amp;p=8&amp;l=as1&amp;asins=B000JMJQZE&amp;fc1=000000&amp;IS2=1&lt;1=_blank&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr&quot; style=&quot;width:120px;height:240px;&quot; scrolling=&quot;no&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070113164639597</trackback:ping>
</item>
<item>
<title>SIGからの回答</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070111162105371</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070111162105371</guid>
<pubDate>Thu, 11 Jan 2007 16:35:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070111162105371#comments</comments>
<dc:subject>開発</dc:subject>
<description>&lt;p&gt;ダウンロードできない仕様書がある件で、SIGから回答がありました。&lt;br&gt;&lt;a href=&quot;http://www.bluetooth.com/Bluetooth/Learn/Technology/Specifications/&quot;&gt;Bluetooth.com | Specification Documents&lt;/a&gt;&lt;br&gt;でダウンロードできるとのことです。&lt;/p&gt;&lt;p&gt;つまり、SIGに加入していなくても仕様書はダウンロードできるってことですね。&lt;br&gt;そして、個人でAdopterにはなれるかどうかについては、一切コメント無しです。&lt;br&gt;個人でAdopterになれないとすると、個人でBluetooth認証を取ることはできないことになります。&lt;br&gt;まぁ、個人でSIGに１００万円払って認証登録する人はいないという想定は、そうなのかもしれませんが・・・。&lt;br&gt;個人でSIGに加入するメリットは、SIGからの連絡メールが受け取れるだけってことですか。&lt;/p&gt;</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070111162105371</trackback:ping>
</item>
<item>
<title>個人ではAdopterグループに入れない？</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070108202236795</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070108202236795</guid>
<pubDate>Mon, 08 Jan 2007 21:05:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070108202236795#comments</comments>
<dc:subject>開発</dc:subject>
<description>以前はAdopterメンバーの会社に所属する形でしたが、会社を辞めたので個人でSIGメンバーに登録しました。
ところが！！そしたらほとんどの仕様書がダウンロードできなくなっていることに気付きました。

&amp;gt;&amp;gt; 続く
Bluetooth Core仕様書はダウンロードできるのですが、各プロトコルやプロファイル、トランスポート関係の仕様書がダウンロードできません。
HCI-USBの仕様書をダウンロードしようとして気付きました。

SIGのサイトで表示されるエラーには、Adopterグループに参加しないとダウンロードできない旨が表示されます。
またAdopterグループに関しては「全てのユーザーはこのグループに所属します」と記述されています。
にもかかわらず「あなたの権限レベルではAdopterに参加できません」とも表示されています。

FAQを調べてみると、どんな法人格の会社も無料でAdopterに参加できると書いてあります。
個人ではダメなのかもしれません。

それで今日、SIGに以下の内容を英語で書いて質問メールを送りました。

こういうエラーが発生して仕様書をダウンロードできません。
個人でAdopterに参加できますか？どうすれば参加できますか？
Bluetooth仕様の日本語解説と、オープンソースの組込み向けプロトコルスタックを開発したいのですが、Adopterに参加させて頂けませんか？

つたない英語ですが、意味は通じると信じて送っておきました。
これでAdopterに参加できず、仕様書がダウンロードできないとなると、かなりモチベーションダウンです。</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070108202236795</trackback:ping>
</item>
<item>
<title>開発準備ほぼ完了</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070104132621385</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070104132621385</guid>
<pubDate>Thu, 04 Jan 2007 22:30:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070104132621385#comments</comments>
<dc:subject>開発</dc:subject>
<description>一応バージョン管理システムとしてローカルにSubversionを用意しました。

でも、ソースコードを書く段階になったら、SourceForge.jpに登録して、そちらを利用しようと考えています。
バージョン管理はCVSになってしまいますけど。

バグトラッキングシステムとしてはMantisを候補に考えていたのですが、SourceForgeを使うならサービスに含まれているので、用意するのをやめました。

それで、SourceForgeに登録するのにも必要ですし、プロジェクト名を決めようかと思っています。
今のところ候補は&amp;quot;Blacktooth Project&amp;quot;です。
純日本製のオープンソースBluetoothプロトコルスタックということで、何か日本的なものを・・・「青歯王」に対して&amp;quot;歯&amp;quot;つながりで「お歯黒」ってのはどうだろうか？
という発想です。
何か「黒」というのが悪いイメージな気もしますが・・・他に思い付かなければこれで。</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070104132621385</trackback:ping>
</item>
<item>
<title>開発工数と期間の見積り</title>
<link>http://bluetooth.k5-n.com/article.php?story=20070102175640297</link>
<guid isPermaLink="true">http://bluetooth.k5-n.com/article.php?story=20070102175640297</guid>
<pubDate>Tue, 02 Jan 2007 21:40:00 +0900</pubDate>
<comments>http://bluetooth.k5-n.com/article.php?story=20070102175640297#comments</comments>
<dc:subject>開発</dc:subject>
<description>新年あけましておめでとうございます。
１年の計は元旦にあり、というわけで、もう２日ですが開発スケジュールを考えてみました。

Bluetoothに割く時間は、週１０時間くらいと考えています。
２ヶ月に１回は各プロトコルやプロファイルの技術解説記事を１つ書くつもりです。
各モジュールごとに単体テストを書くものとします。

その条件で工数見積りしてみると、GAP, SPPのみのサポートで６人月くらい・・・
え、、開発期間は２年ですか。

&amp;gt;&amp;gt; 続く
６人月もかかるのか？には人によって異論があるかもしれませんが、過労になって以降、開発ペースが遅くなっている今の自分の状況だと、そのくらい（いやそれ以上）かかるかと思います。

単体テストを書かずに開発し、さらに技術解説もなしにすれば、遥かに早い（３人月くらいかな？）と思いますが、これらはどうしてもやりたいのです。

このサイトの一番の目的は「日本語でのBluetooth技術に関する詳細情報提供」にあります。
なので、技術解説は必須です。
（が、御他聞に漏れず、技術者である私はドキュメント作成は嫌いなので、２ヶ月に１つと緩いペースにします）

単体テストは信頼性確保と保守性確保のために是非やりたいのです。
頻繁にリファクタリングしたいですし、テストファーストが最近の開発方法のトレンドでもあり、勉強になるというのも大きな理由です。
テストコードがBluetooth仕様の微細にわたる説明を兼ねてくれるとも思っています。
それに設計思想やテストコードを含めて公開されているオープンソースのBluetoothプロトコルスタックはないと思うので、それがこのプロジェクトのコンピタンスになると考えています。

一応、概算の工数見積りはしましたが、ここで詳細を公表するのは避けます。
現在過労の療養中ということもあり、このプロジェクトで締め切りに追われることはしたくありませんので。
プロジェクト参加者が出てきたり、気が向いたら公表するかもしれません。

開発期間を短くするには、協力してくれるプロジェクト参加者を募集するしかないでしょう。
もう少し体制が整ったら募集をかけることにします。</description>
<trackback:ping>http://bluetooth.k5-n.com/trackback.php?id=20070102175640297</trackback:ping>
</item>
</channel>
</rss>

