<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2163145321427576610</id><updated>2011-09-28T02:00:06.467+09:00</updated><category term='arduino'/><category term='ruby'/><category term='部品調達'/><category term='お知らせ'/><category term='Eagle'/><category term='UQ'/><category term='作ってみた'/><category term='ALIX'/><category term='wimax'/><category term='24時間ワンセグ野郎'/><category term='PSoC'/><category term='ipad'/><category term='小ネタ'/><category term='道具'/><category term='OSX'/><category term='gainer'/><category term='USB'/><category term='Emobile'/><category term='iphone'/><category term='ruby on rails'/><category term='twitter'/><category term='Processing'/><category term='AVR'/><category term='googlemap'/><category term='練習'/><category term='DoCoMo'/><category term='ブレッドボード'/><category term='NetBSD'/><category term='OpenBSD'/><title type='text'>hwhack</title><subtitle type='html'>hack, hack, hack, write and hack.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default?start-index=101&amp;max-results=100'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>103</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-309541787228783934</id><published>2010-04-24T14:04:00.006+09:00</published><updated>2010-04-24T14:33:43.051+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>林檎最中を立てよう</title><content type='html'>&lt;div&gt;新年および新年度あけましておめでとうございます。MTM以来なのでそろそろ化石になるかとおもったhwhack ですが春のコネタとともに復活です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/S9J9LRHFOiI/AAAAAAAABZs/IRUzlh15NUE/s320/CIMG0440.JPG" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5463566930478971426" /&gt;&lt;div&gt;最近話題の林檎最中ことiPad にはBTのキーボードが繋がります。最近のimacについてくるキーボードがつながるので文字を打ち込む場合には便利なのですが、こういう体制の場合には画面は立ってて欲しいものです。dock兼スタンドはちょい高いのと縦置きしか想定されていません。そこで、「ティンときた」ということで転がっていたLEGOを使って台を作りました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;作り方の解説は必要ないかとおもいます。パーツは「緑のバケツ」を探ればトップの丸みのあるパーツ以外は２セットそろいます。&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/S9J-CfNJA4I/AAAAAAAABaE/4lolpLfK6Fw/s320/CIMG0421.JPG" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5463567879155286914" /&gt;&lt;div&gt;使ってみると非常に快適で、自宅、オフィスと２つ作ってしまいました。角があたるのを嫌ってトップには丸みのあるパーツを使いましたが、ふつうのブロックでもよいかもしれませんが、そのときは高さの調整が必要かもしれません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;気を良くしたのでついでに余っているパーツを使ってiphone用のスタンドも作ってみました。これもなかなか快適です。こちらはもうひとつ小さい板を使ったスタンドで、ipadは重心が板の上にこないので倒れてしまいます。もう一こま狭くして角度を立てるとなんとか使えますので持ち歩きにはいいかもしれません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/S9KCGiHj4bI/AAAAAAAABaM/Vgv0isI9SUI/s320/CIMG0429.JPG" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5463572346703176114" /&gt;&lt;/div&gt;&lt;img src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/S9KCHK72TwI/AAAAAAAABaU/rewn2NQQJAc/s320/CIMG0425.JPG" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5463572357659905794" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-309541787228783934?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/309541787228783934/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=309541787228783934' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/309541787228783934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/309541787228783934'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2010/04/blog-post.html' title='林檎最中を立てよう'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/S9J9LRHFOiI/AAAAAAAABZs/IRUzlh15NUE/s72-c/CIMG0440.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2058411771595354037</id><published>2009-11-23T00:13:00.004+09:00</published><updated>2009-11-23T00:25:38.125+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='お知らせ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>ＭＴＭ０４　珈琲あります。飲みにきてね。</title><content type='html'>&lt;div&gt;みなさまご無沙汰しております。&lt;/div&gt;&lt;div&gt;hwhack では春に引き続き、今回もMake Tokyo Meetingに参加．．．の予定だったのですが、２名いる著者が両方とも出張とバッティングしたため、今回は代理の方に参加をお願いしています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回の出し物は都内の某研究所で毎日稼働している Twitter対応型コーヒーメーカー「&lt;a href="http://twitter.com/misuzu_aoyama/"&gt;青山みすず&lt;/a&gt;」です。このコーヒーメーカーは珈琲を沸かした量とついだ回数を計測することで、あとどれくらい珈琲が残っているかを計れるようになってます。仕掛けなどの秘密は大岡山の会場で。入れ立て珈琲大サービスでお待ちしています！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PS. 特派員からの報告によれば、ＭＴＭではTwitter対応コーヒーメーカー三つ巴の戦いが繰り広げられている模様です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2058411771595354037?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2058411771595354037/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2058411771595354037' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2058411771595354037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2058411771595354037'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/11/blog-post.html' title='ＭＴＭ０４　珈琲あります。飲みにきてね。'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7482505946283041206</id><published>2009-07-02T14:50:00.003+09:00</published><updated>2009-07-03T14:25:51.860+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><title type='text'>E-mobile H12HW</title><content type='html'>E-mobileの電話型端末&lt;a href="http://emobile.jp/products/hw/h12hw/"&gt;H12HW&lt;/a&gt;を試す機会が会ったのでOpenBSDでのデータ通信を試してみた。H12HWは型番が示すようにHUAWEI社の製品で3.6MbpsのHSDPAに対応している。&lt;div&gt;&lt;div&gt;結果を共有。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;準備&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以下のようにsys/dev/usb/usbdevsにProduct ID 0x1008を追加して、usbdevs.hとusbdevs_data.hを再生成しておく。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;product HUAWEI Mobile 0x1008 HUAWEI Mobile &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;あとはsys/dev/usb/umsm.cのデバイス情報の構造体であるstruct umsm_type umsm_devs[]に&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;{{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_Mobile}, DEV_HUAWEI},&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;を追加してkernelをリコンパイルする。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;結果&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;普通にumsm(4)のデバイスとして認識されて、pppdでppp接続も確立できた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;いまはopenbsdの次のリリースに向けた作業が進んでいるので、それが落ち着いた頃にopenbsdにはコミットしておく予定。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7482505946283041206?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7482505946283041206/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7482505946283041206' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7482505946283041206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7482505946283041206'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/07/e-mobile-h12hw.html' title='E-mobile H12HW'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3725697690218364683</id><published>2009-06-22T20:48:00.003+09:00</published><updated>2009-06-22T20:50:56.798+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ブレッドボード'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>自作arduinoのための breadboard hack</title><content type='html'>&lt;div&gt;lilypadのブートローダをつかえば、ブレッドボードでarduinoを組み立てるのは非常に簡単である。これをさらにonechip arduinoにしてしまうとブレッドボード上のパーツも非常に少なくなるので、小さなブレッドボード上にもかなりの回路をのせることが可能になるだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;しかしここで問題になるのは、ブレッドボード上においた AVRのチップのピンと、Arduinoのピンの対応がすぐにわからなくなることだ。何度もやって覚えてしまえればいいのだろうが、間違っていてはあまり意味もないことからこんなhackをやってみた。&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/Sj9v0B0bTZI/AAAAAAAABTo/hGwnzArHFJc/s320/R0013987.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5350117821971647890" /&gt;&lt;/div&gt;&lt;div&gt;ブレッドボードの裏にネットでみつけた ATmega と Arduinoのピン配列の対応表をそのまま貼付けておくだけである。対応図はいろんなところにあるので探してほしいが、たとえば&lt;a href="http://www.arduino.cc/en/Hacking/PinMapping168"&gt;こういうの&lt;/a&gt;である。 &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Make: blog本体では&lt;a href="http://jp.makezine.com/blog/2009/06/todbots_atmel-arduino_pin-outs_stic.html"&gt;こんなの&lt;/a&gt;が出ていた。この場合チップ単体で使うのならいいのだが、1chip arduinoをつくって部品をチップ上に盛ってしまった場合には下の文字が読めない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これは undocumented 情報としてMake Tokyo Meeting 03 で初お披露目したのだが、なかなかウケたのでエントリーにもしておくことにする。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3725697690218364683?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3725697690218364683/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3725697690218364683' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3725697690218364683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3725697690218364683'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/06/arduino-breadboard-hack.html' title='自作arduinoのための breadboard hack'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZFlW0NdMJdk/Sj9v0B0bTZI/AAAAAAAABTo/hGwnzArHFJc/s72-c/R0013987.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1260520970768314281</id><published>2009-06-22T17:00:00.011+09:00</published><updated>2009-06-22T19:57:26.191+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>UNIX系OS用UQ wimaxドライバの作成(1)</title><content type='html'>MTM３が終わってから、今度は２週間ちょっとの出張がはいってしまってなかなかblogを書く時間をとれなかったが、いつまでも「MTM3参加中」のエントリがトップなのも寂しいので、最近のwimax関係のアップデートを書いてみる。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UQ Wimax解析の状況&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GCT720X系のチップセットを使っているインターフェイス(UD01SSとかUD01OK)の解析はほぼ完了した。要素としては大きく分けると、&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;データ通信系（Ethernetフレームを交換する部分）&lt;/li&gt;&lt;li&gt;認証系（EAPパケットを処理して通信に必要な鍵を生成する部分）&lt;/li&gt;&lt;li&gt;ネットワークエントリ系（認証系に加えてwimaxネットワークに参加する部分）&lt;/li&gt;&lt;li&gt;データストア系（加入者識別子、パスワード、デバイスのX509証明書の処理）&lt;/li&gt;&lt;li&gt;管理系（通信状態把握、パラメータ設定）&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;くらいに分類される。通信に必要なのは最初のデータ通信系の機能だけだが、そこに至るために残りの部分を攻略しなければならかった。「データストア系」はネットワークに接続するために必須の部分であるのに関わらずまったく仕様が公開されていないため、比較的時間を費やしてしまった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;動作検証コード&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;解析結果はすべてOpenBSD上で検証コードを作成して、実際の動作を確認した。&lt;/div&gt;&lt;div&gt;未知のデバイスのドライバをカーネルドライバとしていきなり実装するのは開発効率が悪すぎる。今回は、ずいぶん前に「&lt;a href="http://hwhack.blogspot.com/2008/01/ugenbsdusb.html"&gt;ugenでラピッドプロトタイピング(*BSDでUSB）&lt;/a&gt;」で書いたようにugen(4)を利用してユーザーランドで実装してみた。さらに、ethernetインターフェイスへのアクセスにもtuntap仮想インターフェイス(tun(4))を用いてユーザランドドライバとして実現した。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/Sj9f3DvyKcI/AAAAAAAANZQ/qugo4q03ReQ/s1600-h/wimax-driver.gnp"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 266px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/Sj9f3DvyKcI/AAAAAAAANZQ/qugo4q03ReQ/s320/wimax-driver.gnp" alt="" id="BLOGGER_PHOTO_ID_5350100281842608578" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;ugen(4)を用いてUSBバスをユーザランドドライバに見せたうえで、データフレームをtun(4)でカーネルに挿入するアプリケーションをかけば、実質上ユーザーランドだけでデバイスドライバを書くことができる。&lt;/div&gt;&lt;div&gt;この「ユーザランド」ドライバの構造（概略）を右図に示す。簡略化のために一個のプロセスで全部入りでつくったが、検証用には十分だろう。&lt;br /&gt;機能としては、Wimaxのネットワークをスキャンして、UQ Wimax決めうちで接続処理を行う。デバイスから必要な情報を引きずり出して、認証機構がEAP-TTLS/MSCHAPv2でWimax-PKMv2を処理してログイン＆鍵対の生成を行っている。&lt;br /&gt;うまくつながれば、あとはugen(4)とtun(4)をブリッジしてEthernetインターフェイスとして動いてくれる。普通にDHCPでアドレスをもらって通信できるところまでは動作確認済みだ。&lt;br /&gt;あ、あと、Ethernetブリッジしているのにtapじゃないのは、OpenBSDではtapがtun(4)に統合されているから。tunをLayer2モードで駆動している。&lt;br /&gt;&lt;br /&gt;ユーザランドドライバの副次的な効果として「移植性の高さ」がある。たぶん、ほとんど変更しなくてもbsd系のOSでは動くだろうし、ugen(4)をlibusbかなにかに置き換えればOSXやlinuxでも動いちゃうんじゃないかなと予想している。だれかやってみないかな。&lt;br /&gt;ソースは公開する予定だけど、作業の優先順位は要望によって変わります。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;今後の予定&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ちょっと落ち着いてきたので、解析結果のまとめをつらつらとblogに書きながら、（途中になっている）kernelドライバの作成をやってみようとおもっている。&lt;br /&gt;変なNDAに縛られちゃう前に、知っていることは公知にしておくといいよね？&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1260520970768314281?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1260520970768314281/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1260520970768314281' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1260520970768314281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1260520970768314281'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/06/unixosuq-wimax1.html' title='UNIX系OS用UQ wimaxドライバの作成(1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/Sj9f3DvyKcI/AAAAAAAANZQ/qugo4q03ReQ/s72-c/wimax-driver.gnp' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5641729317729963142</id><published>2009-05-23T23:20:00.005+09:00</published><updated>2009-05-23T23:30:06.926+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='お知らせ'/><title type='text'>Make Tokyo Meeting 03 参加中</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;表題のとおり 今日からはじまった&lt;a href="http://jp.makezine.com/blog/2009/05/mtm03.html"&gt;Make Tokyo Meeting 03&lt;/a&gt; に本blogはhwhack.blogspot.com というまんまの名前で参加しています。本日も多数の訪問者ありがとうございました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;blogでは語れないあんなことやこんなこと、中の人の素顔、途中経過がわからなくなったプロジェクトの進捗など知りたいことがあればぜひおこし下さい。&lt;/div&gt;&lt;div&gt;One Chip Arduinoや USB BlinkM などわかりやすい展示品も取り揃えてあります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;体育館はいってすぐ、blog同様のとってもカオスなブースでお待ちしています。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5641729317729963142?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5641729317729963142/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5641729317729963142' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5641729317729963142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5641729317729963142'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/make-tokyo-meeting-03.html' title='Make Tokyo Meeting 03 参加中'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7478804691704657645</id><published>2009-05-14T21:33:00.006+09:00</published><updated>2009-05-15T00:50:36.408+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><title type='text'>UQ Wi-Fi Gatewayのバッテリ駆動</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SgwUwptzOzI/AAAAAAAAMjo/cAhCPwhf5Zs/s1600-h/P1000360.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 250px; height: 187px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SgwUwptzOzI/AAAAAAAAMjo/cAhCPwhf5Zs/s320/P1000360.JPG" alt="" id="BLOGGER_PHOTO_ID_5335662484591426354" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="font-style: italic;"&gt;（念のために書いておきますが本記述は無保証です。バッテリ系はいろいろと危険があるのでよい子・良い大人の方々はまねをしないでくださいね）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;UQ WimaxのWi-FI GatewayのWifiアクセスポイント側（&lt;a href="http://www.uqwimax.jp/service/product/UG01OK.html"&gt;UG01OK&lt;/a&gt;)のバッテリを入れる場所を眺めていたら、手元にあった&lt;a href="https://www.iijmio.jp/ad/mbap.jsp"&gt;クティオ&lt;/a&gt;のバッテリがぴったりはいるような気がしてきたので試しにいれてみた。なんかぴったりはいります。ふたも閉まります。ふむ。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SgwmFIZVvJI/AAAAAAAAMjw/XYpd9kr5yyg/s1600-h/P1000362.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 200px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SgwmFIZVvJI/AAAAAAAAMjw/XYpd9kr5yyg/s200/P1000362.JPG" alt="" id="BLOGGER_PHOTO_ID_5335681528122162322" border="0" /&gt;&lt;/a&gt;おそるおそる電源をいれてみると、うごくっぽい。&lt;br /&gt;電源LEDもつきます。ＡＣアダプタをつなげると「battery」LEDも点灯。充電もしてくれるっぽい。&lt;br /&gt;&lt;br /&gt;すぐに切ったのでどのくらい使えるかは調べていませんが、3.7V 1900mAHしかないのであんまり持たないと思います。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7478804691704657645?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7478804691704657645/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7478804691704657645' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7478804691704657645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7478804691704657645'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/uq-wi-fi-gateway.html' title='UQ Wi-Fi Gatewayのバッテリ駆動'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/SgwUwptzOzI/AAAAAAAAMjo/cAhCPwhf5Zs/s72-c/P1000360.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7608088428234733921</id><published>2009-05-14T16:25:00.003+09:00</published><updated>2009-05-14T20:03:47.707+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>OpenBSDでSoftbank C01SWを使う</title><content type='html'>週末に海外の見知らぬ人から「（俺の）sierra wirelessのHSDPAモデムがopenbsdで使えないんだけど」というメールが届いた。ちょうど他の作業で煮詰まっていたので息抜きに何通かメールをやりとりして、OpenBSDのumsm(4)で動くパッチを作ってみた。先方曰く「ちゃんと動いた！」と報告してくれたが、手元に無いデバイスなので不安は残る。ふと思い立ってgoogleするとSoftBankモバイルの&lt;a href="http://mb.softbank.jp/mb/data_com/product/usb/c01sw/"&gt;C01SW&lt;/a&gt;はSierra wirelessのOEM製品らしい。周りを少し見渡すと持っている人が見つかったので、実際にためしてみた。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Tru-install&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;C01SWはsierra wirelessの「Tru-install」という機能を搭載している。これは、他の3Gモデムでもよくある「普段はUSBマスストレージのデバイスとしてみえて、そこにデバイスドライバがはいってる。そのデバイスドライバをつかってモデムモードに切り替える」という機能だ。windows以外ではあんまり便利ではないし、自分でモードを切り替えてあげないといけない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Tru-installのモード変更方法&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;もうこの手の話は何回もしているので、簡潔にモード変更方法を書いておく。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;USB requestType = Write/Vendor/Device&lt;/li&gt;&lt;li&gt;USB request = 0x0b&lt;/li&gt;&lt;li&gt;USB request wValue, wIndex, wLength = 0x1, 0, 0&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;というコントロールリクエストをデバイスに送ると、デバイスがUSBバスから切り離されて再度認識されたときにはモデムデバイス＋マスストレージデバイスの複合デバイスに変化している。上記に対応する関数を抜粋すると、こんな感じ。&lt;/div&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#define TRUINSTALL_CHANGEMODE_REQUEST 0x0b&lt;br /&gt;usbd_status&lt;br /&gt;umsm_truinstall_changemode(usbd_device_handle dev)&lt;br /&gt;{&lt;br /&gt;        usb_device_request_t req;&lt;br /&gt;        usbd_status err;&lt;br /&gt;        req.bmRequestType = UT_WRITE_VENDOR_DEVICE;&lt;br /&gt;        req.bRequest = TRUINSTALL_CHANGEMODE_REQUEST;&lt;br /&gt;        USETW(req.wValue, 0x1);&lt;br /&gt;        USETW(req.wIndex, 0);&lt;br /&gt;        USETW(req.wLength, 0);&lt;br /&gt;&lt;br /&gt;        err = usbd_do_request(dev, &amp;amp;req, 0);&lt;br /&gt;        if (err)&lt;br /&gt;                return (EIO);&lt;br /&gt;        return (0);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;umsm.cに対する変更の全体は&lt;a href="http://www.openbsd.org/cgi-bin/cvsweb/src/sys/dev/usb/umsm.c.diff?r1=1.45;r2=1.46;f=h"&gt;CVS&lt;/a&gt;で参照できる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あと、OpenBSDではsys/dev/usb/usbdevsにこのデバイス用のProduct IDを追加しなければならなった。これは追ってコミットしておく。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;C01SW概略&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;アタッチしてみてちょっと驚いたのはインターフェイスが７本出現したことだ。一般に3Gモデムは複数（２−３本）のインターフェイスを用意しているが７本出てきたのは初めてだった。&lt;/div&gt;&lt;div&gt;USBディスクリプタを見ると4-7本目のインターフェイスはインタラプトエンドポイントを含んでいるのでこれらのどれかが通信用のポートのはずだ。上から試してみたところ、４本目が通信用のポートだった。５−７本目のポートはエコーバックされないがATコマンドに反応しているので何らかの管理ポートだと推測される（詳細は見ていない）。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;C01SWで通信する&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;OpenBSDのkernel ppp実装のpppdを使って通信を試みたところ、さっくりとつながった。&lt;/div&gt;&lt;div&gt;設定は昔「&lt;a href="http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw.html"&gt;NetBSDでEmobile D02HWを使う(設定編)&lt;/a&gt;」で書いた物とほとんど同じで、&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;ifconfig ppp0 create でpppインターフェイスを作る&lt;/li&gt;&lt;li&gt;/etc/ppp/peers/に対応する設定ファイル（たとえばsoftbank )を作ってttyU3を通信ポートに設定する&lt;/li&gt;&lt;li&gt;ソフトバンク用のユーザIDとパスワードを/etc/ppp/chap-secretに書いておく&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;だけだった。pppd call softbankだけでpppがつながって通信できた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7608088428234733921?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7608088428234733921/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7608088428234733921' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7608088428234733921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7608088428234733921'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/openbsdsoftbank-c01sw.html' title='OpenBSDでSoftbank C01SWを使う'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1985066737382275646</id><published>2009-05-12T13:35:00.003+09:00</published><updated>2009-05-12T13:56:54.518+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><title type='text'>E-mobile D12HWとD22HW</title><content type='html'>E-mobileの最近のモデムを触ってみる機会があったのですこし調べてみた。結果を共有。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;触ったのは&lt;a href="http://emobile.jp/products/hw/d12hw/"&gt;D12HW&lt;/a&gt;と&lt;a href="http://emobile.jp/products/hw/d22hw/"&gt;D22HW&lt;/a&gt;で両方ともHUAWEIのOEM製品だ。D22HWはHSUPAでアップリンクが最大1.4Mbpsまで使えるというのが特徴らしい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;OpenBSDで試してみる&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;HUAWEIの多くのモデムは同じUSBベンダIDとプロダクトIDを共有しているが、今回もその例に漏れず同じIDを利用していた。OpenBSDで試してみたところ、両者とも標準的なHUAWEIプロトコルでUSBマスストレージモードからモデムモードに遷移するようだ。umsm(4)としてデバイスは認識される。pppd経由でネットワーク接続もできたようなので何の工夫もせずに普通につかえる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;メモ：D12HW&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;D12HWに関してはUSBのディスクリプタの文字列が壊れている部分がある。利用する分には問題はないがUSBディスクリプタの文字列を信用してデバイス認識時に画面に出力してしまうとなんだかよくわからない文字列が表示されてしまうかもしれない。&lt;/div&gt;&lt;div&gt;しょうがないのでOpenBSDではディスクリプタ中の文字列を信用せずにusbdevsの中の文字列を利用するようにUSB_QUIRKS: UQ_NO_STRINGSを設定しておいた。本来はD12HWだけでこのquirksが使われるようにすべきだがみんな同じベンダIDとプロダクトIDを持っているのでほとんど全部のHUAWEIモデムにこのquriksが適用されてしまっている。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1985066737382275646?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1985066737382275646/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1985066737382275646' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1985066737382275646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1985066737382275646'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/e-mobile-d12hwd22hw.html' title='E-mobile D12HWとD22HW'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3874201537007981764</id><published>2009-05-10T13:48:00.010+09:00</published><updated>2009-05-11T02:52:03.893+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>UQ WimaxのUD01SS解析 (4)</title><content type='html'>&lt;a href="http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss-3.html"&gt;前回&lt;/a&gt;の続き。&lt;br /&gt;&lt;br /&gt;一行まとめ「UD01SSの内部コンソールを取得する」話。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/SgbPbEZ-ChI/AAAAAAAAMig/6I3KB6n_-34/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 170px; height: 400px;" src="http://3.bp.blogspot.com/_nwrLM141xU8/SgbPbEZ-ChI/AAAAAAAAMig/6I3KB6n_-34/s400/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" alt="" id="BLOGGER_PHOTO_ID_5334178872613014034" border="0" /&gt;&lt;/a&gt;OKIネットワークスが出している&lt;a href="http://hwhack.blogspot.com/2009/05/uq-wimaxud01okwi-fi-gateway.html"&gt;UD01OKの解析&lt;/a&gt;をしてみたところ、同じGCTセミコンダクタのGDM72XXを使っている製品なら、ほぼUD01SSと同様な構成になっているのではないかと予測を立てることができた。たぶんGCTセミコンダクタが提供するファームウェアおよびデバイスドライバのSDKがLinuxをベースとしたものになっているのだろう。ということで、今後もGDM72XXを使う製品が出るのなら今回の一連の解析も役に立つだろう、ということでよりディープなところもまとめてみたいと思う。&lt;br /&gt;&lt;br /&gt;このエントリではUQのUD01SS（やUD01OKなどのGDM72XXベースのWimaxインターフェイス）内で動いている「Wimaxアプリケーション」の操作コンソールについて説明する。&lt;br /&gt;&lt;br /&gt;UD01SSの内部ではLinuxが動いている、というのは&lt;a href="http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss.html"&gt;（１）&lt;/a&gt;で 書いた。汎用OSであるLinuxをファームウェアとして利用している以上、カーネル内部だけではなくユーザランドでも何らかのアプリケーションが動いて いるのは当然だ。解析を進めている途中で、そのアプリケーションと対話的に通信していろいろな情報を取得できるようになった。右にWimaxアプリケーションのコマンド一覧（helpコマンドの出力）を載せる（長いので画面キャプチャ形式）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSの内部アプリケーション：/usr/wimax&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SgbSWJY8dfI/AAAAAAAAMio/ArVSRxe937w/s1600-h/ud01ss-param.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 198px; height: 320px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SgbSWJY8dfI/AAAAAAAAMio/ArVSRxe937w/s320/ud01ss-param.png" alt="" id="BLOGGER_PHOTO_ID_5334182086586430962" border="0" /&gt;&lt;/a&gt;UD01SSのユーザランドとしてWimax関連で動いているのは/usr/wimaxコマンドである。このコマンドがGDM72XXのいろいろな要素（内部の別プロセッサとかで動いているプロセスとか）と通信しながら、ホストインターフェイスを提供している。&lt;br /&gt;ホストPC側にWimaxインターフェイスとしての機能をUSBバスを経由して見せているのもこのアプリケーションで、ホスト側からのコマンドはこのアプリケーションが処理している。さらに管理用の対話的コンソールも提供されている。対話的コンソールが受理するコマンド一覧を上の図に示した。使い方はまだわからないことも多いがUD01SS内部で処理しているWimax関連の機能の内部状態を見ることができるので大変便利だ。&lt;br /&gt;右図の画面ダンプはparamコマンドの出力例（mac addressは隠してある）だ。paramコマンドはデバイスの設定パラメータをダンプしてくれる。Wimaxの物理層まで興味があれば役に立つこともあるかもしれない。&lt;br /&gt;ヘルプ画面にあるshellコマンドは興味深い。/bin/shを立ち上げて(fork &amp;amp; exec)内部のlinuxに対するshellアクセスを提供してくれるはずだが、子プロセスとしてのshellはUSBバスに対する通信機構を持っていないのでこの方法でのアクセスでは使えない。大変残念だがUSB経由（wimaxアプリケーションを経由）のshell取得は原理上無理があるようだ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wimaxアプリケーションのコンソールでできること&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;できることは大体以下の通り。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;対話的にコマンドを発行してレスポンスを受け取る。たとえば「version」「param」「dump」コマンドはいろいろな内部状態を出力する。&lt;/li&gt;&lt;li&gt;対話的にコマンドを発行して動作モードを変える。（詳細は不明）&lt;/li&gt;&lt;li&gt;メモリ状態などを読み込む（詳細は不明）。発行してもハングアップしてしまう場合が多い。&lt;/li&gt;&lt;li&gt;「log on wimax」コマンドを発行すると、非同期メッセージを受け取れるようになる。たとえば、内部の状態遷移に付随して発生する様々なメッセージを受信できる。さらに「sc」「nds」コマンドでデバグメッセージを出力させることで、もっといろいろなことを教えてくれるようになる。&lt;/li&gt;&lt;/ul&gt;最後の機能は非常に強力だ。単純なUSBバス解析だとバイナリ列の{コマンド,レスポンス}の組を統計的に解析していって意味を抽出する作業が必要になるが、コマンドに対して人間が読める形のレスポンスや状態遷移のタイミングを取得できればシステマチックな解析が可能になる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;取得できる出力の例&lt;/span&gt;&lt;br /&gt;2009/4月のファームウェアアップデート後のUD01SSのVersion&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;DM&gt; version&lt;br /&gt;version 0.3.8.0 (00030800)&lt;br /&gt;DM&gt; dump ver&lt;br /&gt;FW : Rev=1.6.6.4, 2009/04/03 18:18:00 (build: 2009/04/06 16:58:33)&lt;br /&gt;RF : srf72xx-081025(72050227,0), Default&lt;br /&gt;CFG: PHY=0x602, SPEC=204, CPU=3, SD_AFC, UPT, DNT, ARQ2, IPC, FREQ2.5G, SAMSUNG&lt;br /&gt;MAP: 2009-03-24-1613-WAVE2&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;ほかにも接続状況なども取得できるが、それらは今後対応した操作を説明するときに説明しようと思う。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;アクセス方法（概略）&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wimaxアプリケーションのコンソールに対するアクセス方法の概略を載せておく。詳細はGDM72XX系のコマンド体系をまとめるときに補足する。&lt;br /&gt;&lt;br /&gt;GDM72XXのコマンドは、大体&lt;br /&gt;&lt;ul&gt;&lt;li&gt;２バイトのヘッダ(Command/Response Type)&lt;/li&gt;&lt;li&gt;２バイトのペイロード長（データ部分だけ。ヘッダ部分は含まない）&lt;/li&gt;&lt;li&gt;データ&lt;/li&gt;&lt;/ul&gt;のTLV形式で定義されている。（USBなのでビッグエンディアン）&lt;br /&gt;コンソールに対するデータ送信は、Type:0x030cで、送信したい文字列に"\n\0"文字をつけてデータとして送信する。&lt;br /&gt;受信は非同期メッセージを扱う場合はちょっと複雑だが、普段はType:0x830dのデータの9バイト目から文字列として扱えばよい。継続行がある場合は文字列の最後が非NULL文字になるので、文字列の最後がNULL文字になるまで繰り返し読み込めば複数行のレスポンスも取得できる。&lt;br /&gt;&lt;br /&gt;いまはとりあえずopenbsdのugenで書いたユーザランドアプリケーションで実験をしている。プログラムの長さで３－４KBくらい。もしUD01SSとかで遊びたい人がいたら適当に声をかけてほしい(一人だと飽きそう）。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;次回&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;次回のエントリでは、GDM72XXのコマンド体系について説明しようとおもう。認証部分はそのあとになる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3874201537007981764?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3874201537007981764/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3874201537007981764' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3874201537007981764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3874201537007981764'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss-4.html' title='UQ WimaxのUD01SS解析 (4)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nwrLM141xU8/SgbPbEZ-ChI/AAAAAAAAMig/6I3KB6n_-34/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-252286950496477685</id><published>2009-05-09T15:38:00.006+09:00</published><updated>2009-05-09T17:50:33.612+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='ブレッドボード'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>ブレッドボード/arduino用のお手軽ケーブル加工</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;yuoがまたUSBデバイスの解析という大ネタを連載しているので、その合間にcueのほうは電子工作関連のコネタをひとつ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;パーツをブレッドボードやarduinoに刺すときに、しっかりとした足がついているLEDなどはよいが、センサーなどのようにケーブルを介して接続する必要がある場合には、そのケーブルをどうやってブレッドボードに刺すかを考える必要がある。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;よくやる手としてはケーブルをピンヘッダにハンダ付けをするというのだが、これでは量産が効かないし、出来上がりが不揃いになってしまう。四角いピンのピンヘッダはブレッドボードへの刺さりがキツいし、丸ピンのヘッダはピンが細すぎてブレッドボードにはいいが、arduinoなどのピンソケットにはすこし緩い。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そこでちょうどいい太さで先端がピンに&lt;/div&gt;&lt;div&gt;なった圧着端子を探していた。なかなかちょうどよいものがなかったのだが、yuoとアキバを探し歩いた結果、VGAコネクタなどに使うシュリンクDSUB用のピンがちょうどいいのじゃないかという結論に達したので紹介しておく。&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SgUl_INLXkI/AAAAAAAABSY/XdKOMzN1kJI/s320/R0014664.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5333711100154961474" /&gt;&lt;div&gt;千石通商で売られているシュリンクDSUB用のコンタクトピンは5本単位で売られている。CUEは田舎に住んでいて交通費を考えると必要数だけ毎回買うの&lt;br /&gt;&lt;/div&gt;&lt;div&gt;も無駄なので100本パックを買っている。このとき 「シュリンク(細い方）」DSUBの「オス」を入手する必要がある。写真とおなじものを手にいれれば間違いないだろう。&lt;/div&gt;&lt;div&gt;千石通商の1Fにほかの端子とともにおいてあるはずだ。残念ながら通販ではシュリンクではないDSUB用のピンしか扱っていないようだ。ちなみにRS232Cなどに使う普通のDSUB用のピンは太すぎてブレッドボードに刺さらない。&lt;/div&gt;&lt;br /&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SgUl_m-raTI/AAAAAAAABSg/qGbhiDb4-Iw/s320/R0014666.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5333711108415646002" /&gt;&lt;div&gt;これを１本づつ切り取ってケーブルに圧着するだけである。小信号用の圧着端子と同じで、エンジニア社の精密圧着ペンチで加工すればよい。ケーブルはAWG26より細いものがよいだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SgUl_grqKbI/AAAAAAAABSo/70v4hBkkGhg/s320/R0014667.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5333711106725259698" /&gt;&lt;/div&gt;&lt;div&gt;そして圧着部の保護と絶縁のために熱収縮チューブでくるんで完成である。上手に圧着できれば、サンハヤトの高級なほうの柔らかいジャンパーケーブルのような出来映えになるはずだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;arduinoとブレッドボードがカジュアル電子工作の主戦場になってきた今日この頃、このピンの価値は計り知れないと思う。ちなみに、arduino(FIO)に刺すとこんなかんじになる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このピンの問題は、ちょうどいい100milピッチのハウジングがないところではあるが、１本単位でバラバラでもよい用途では非常に便利にかつ美しくケーブルを作ることが出来るのでおすすめである。&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SgUl_-Pz91I/AAAAAAAABSw/AXwHPb1nVZM/s320/R0014670.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5333711114661525330" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-252286950496477685?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/252286950496477685/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=252286950496477685' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/252286950496477685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/252286950496477685'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/arduino.html' title='ブレッドボード/arduino用のお手軽ケーブル加工'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/SgUl_INLXkI/AAAAAAAABSY/XdKOMzN1kJI/s72-c/R0014664.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4879270961649180553</id><published>2009-05-09T02:29:00.004+09:00</published><updated>2009-05-09T03:50:15.720+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><title type='text'>UQ WimaxのUD01OK(Wi-Fi Gateway)解析</title><content type='html'>&lt;a href="http://www.uqwimax.jp/"&gt;UQ Wimax&lt;/a&gt;が先日からモニターを開始した&lt;a href="http://www.uqwimax.jp/service/product/UG01OK.html"&gt;UQ Wi－Fi Gateway&lt;/a&gt;のWimax通信モジュールであるUD01OKを触る機会があったのでちょっと解析してみた。（モニタ募集は例によって外れた）&lt;br /&gt;&lt;a href="http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss.html"&gt;UQ WimaxのUD01SS解析 (1)&lt;/a&gt;も参照するといいかも。&lt;br /&gt;&lt;br /&gt;このエントリの一行まとめ「UD01OKとUD01SSは98%くらい互換デバイス」。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01OKの概略&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;UQのモニタ（と少数の購入ユーザ）に対するWimaxの試験運用が始まってしばらくたつが、よく聞こえてくる感想が「屋外はいいけど、屋内じゃ通じない」「窓際ならいけるが、ちょっと遠ざかるとだめ」といった遮蔽物に対する弱さだ。というわけでこのWi-Fi Gatewayは「Wimaxがつながる窓際まではWimaxで、それ以降は802.11無線LANでつなげてやろう」という製品だ(ほかにも、複数クライアントで同時に利用とかもあるけど、まあどうでもいい）。&lt;a href="http://www.oki-networks.com/"&gt;株式会社OKIネットワークス&lt;/a&gt;が製造販売している。&lt;br /&gt;Wi-Fi GatewayはUSB接続にWimax通信モジュールと、それをつなげる無線LANアクセスポイントで構成されていて、Wimax通信モジュール自体はWindowsPCに直接接続して利用することもできるようになっている。この通信モジュールがUD01OKだ。&lt;br /&gt;&lt;br /&gt;UD01OKも、最近よくあるUSBの通信モジュールと同様に「ゼロインストール」機能が搭載されていて、最初はUSBマスストレージデバイス（CDROM)にみえてその中に必要なドライバが含まれている。Windowsで利用する際にはそのドライバとユーティリティアプリケーションが必要になる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01OKのハードウェア仕様&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;USBのデバイスディスクリプタをダンプしてみたところ、UD01SSと同様にGCTセミコンダクタが開発した１チップのWimax SoCであるGDM7205を使っていた。また、Windowsドライバをインストールしてディレクトリを見たところ、ドライバもおおむねUD01SSと同じだった（UD01SSほど無防備かつフリーダムではなくて、ちゃんときれいに整理されていたが）。両社ともGCTから提供されたSDKを用いてドライバを書いていると推測される。&lt;br /&gt;&lt;br /&gt;USBマスストレージデバイスからWimaxインターフェイスに動作モードを切り替えるコマンドも同じものが使えた。ざっと見ただけだが、その他USB上での操作コマンド群もUD01SSと同一だと思われる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01OKとUD01SSのドライバは競合&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ハードウェア構成がほぼ同一で、ドライバも同等のSDKによって構成されているためか、UD01SSをサポートするためのWindowsサービスとUD01OK用のサービスは競合してしまう。両方同時に使う人はほぼ皆無だと思うがUD01SSをインストールしてあったPCにUD01OKのドライバがインストールできずに一時間ほど悩んでしまった。&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;相違点・共通点&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;USBのベンダIDとプロダクトIDが異なることくらいでハードウェアとファームウェア構成は大体同じ&lt;/li&gt;&lt;li&gt;ユーザIDとパスワードを入れているNVRAMの中の情報がちょっと違う&lt;/li&gt;&lt;li&gt;NVRAMの中身のひねり方は共通&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ドライバの見栄え的な出来や完成度はUD01OKのほうがよさそう&lt;/li&gt;&lt;li&gt;無線デバイスとしての感度もUD01OKがよさそう&lt;/li&gt;&lt;li&gt;大きさはUD01OKがUD01SSより体積比で２倍くらい&lt;/li&gt;&lt;li&gt;ファームウェアは両方ともLinux(&lt;span class="status-body"&gt;&lt;span class="entry-content"&gt;version 2.6.12-uc0)&lt;/span&gt;&lt;/span&gt;　&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;まとめ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;というわけで、UD01OKに関してもUD01SSの解析結果を参照するとよいはず。&lt;br /&gt;&lt;br /&gt;あと、GCTのチップセット使っているWimaxモジュールは大体みんな一緒かもしれない、と予想できるので解析結果が無駄にならなさそうでほっとした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4879270961649180553?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4879270961649180553/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4879270961649180553' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4879270961649180553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4879270961649180553'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/uq-wimaxud01okwi-fi-gateway.html' title='UQ WimaxのUD01OK(Wi-Fi Gateway)解析'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2614498605289817054</id><published>2009-05-05T16:22:00.006+09:00</published><updated>2009-06-29T15:52:56.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>UQ WimaxのUD01SS解析 (3)</title><content type='html'>(2009/5/7 認証フローの図を追加）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss-2.html"&gt;前回&lt;/a&gt;の続き。&lt;br /&gt;UQのUSB型mobile wimaxインターフェイスであるUD01SSの解析メモ（３）。&lt;br /&gt;今回は「どうやってWimaxネットワークに接続するか？」を説明。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;「Linuxとか*BSDでUQ Wimaxを使うのはちょっと敷居が高いので、どう越えるか？」&lt;/li&gt;&lt;/ul&gt;のバックグラウンドになるかな。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mobile Wimaxの概略&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mobile Wimaxは下の仕様がIEEE802.16eおよびIEEE802.16-2004として規定され、運用などのルールがWimax Forumによって規定されている中・広域の無線アクセス技術である。802.11シリーズの無線LANと同様にIPベースの通信を前提としたアーキテクチャを持っており、高いコストパフォーマンスと相互運用性といった特徴を持っている。&lt;br /&gt;&lt;br /&gt;ユーザからみると、「PCに挿せば動く家の外でも使える無線LAN」として動くことが期待されているわけだが、802.11よりも「セキュリティ」や「認証」といった点で気を使わなければならない点も多い。UQ wimax　(Wimax forum Wave2)ではそのあたりをどのようにクリアしているのかをちょっとだけ説明しておく。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Mobile Wimaxネットワークへのログイン&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;カギとなるのは「認証」である。UQのネットワーク（もしくはUQからMVNOしたキャリアのネットワーク）を利用するためには以下の２つの認証を越えなければならない。&lt;ol&gt;&lt;li&gt;デバイス認証（およびネットワーク認証）&lt;/li&gt;&lt;li&gt;ユーザ認証&lt;/li&gt;&lt;/ol&gt;前者はそのデバイスがWimaxフォーラムの認証を通っているデバイスなのかを検証し、接続してもよいデバイスかを判断するために利用される。それぞれのMobile WimaxデバイスはX.509の証明書を持っている。証明書はデバイスのMACアドレスをWimaxフォーラムの認証局（CA）でサインしたもので、MACアドレスの詐称を防いでいる。これはWimaxフォーラムで規定されており、EAP-TLSを用いてX.509証明書を相互に交換することで相互認証を行う。&lt;br /&gt;&lt;br /&gt;後者は課金のために必要な認証。契約者のIDと認証情報を使って、ネットワークにログインするために必要になる。Wimaxフォーラムでは前者のデバイス認証の結果でネットワークへのログイン処理を行うことも許容しているが、UQではMVNOの一部でAAA(認証）サーバ自体も外部にある設定を仮定しているので、ユーザ認証として独立した認証が必要になる。UQではEAP-TTLSを用いた暗号通信路の上にMS-CHAPv2を使ったuser/passwd認証を行っている。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UQの専用アプリケーションの役割&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;UQではネットワークに接続する際に専用のユーティリティソフトウェアが必要となるが、このソフトウェアの役割の一つは後者の「ユーザ認証」手続きだ。EAP-TTLS/MS-CHAPv2自体は標準化されたプロトコルなので、UQ全体で一つのアプリケーションで済むんじゃないか？みたいな話を聞いたこともあるが、実はそれは難しい。なぜかというと、各デバイス毎に「ユーザ情報（ID/Pass）」やWimaxの基地局からのEAPトランザクションを扱う方法が異なっているからだ。デバイス依存の差異を吸収する仕組みが存在しない現在では各ベンダ毎が自分のデバイスを扱うユーティリティを提供するしかない、という判断なんだろうと理解している。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSの認証関連機能&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/SgKcETRx_wI/AAAAAAAAMgk/9nzVlUxxQuQ/s1600-h/ud01ss-auth.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 357px;" src="http://3.bp.blogspot.com/_nwrLM141xU8/SgKcETRx_wI/AAAAAAAAMgk/9nzVlUxxQuQ/s400/ud01ss-auth.png" alt="" id="BLOGGER_PHOTO_ID_5332996506468351746" border="0" /&gt;&lt;/a&gt;UD01SSでは、Wimaxデバイス認証を外部アプリケーションの助けを借りずに行える。つまりデバイス単体でEAP-TLSの確立および証明書の交換、検証、承認が可能で、外からコマンドを送るだけで自動的に進めてくれる。&lt;br /&gt;&lt;br /&gt;ユーザ認証部分はちょっと複雑だ。&lt;br /&gt;UQでは利用者にIDやパスワードを管理させずに「Wimaxインターフェイスをさすだけで使える」運用方法を採用している。そのため、UQネットワーク にログインするためのユーザIDおよびパスワードはデバイス内部のNVRAM領域に保存され、ユーザには見えないように隠ぺいされている。これが複雑さの原因だ。&lt;br /&gt;ユーザ認証機構はWimaxデバイスの外部の「ユーティリティアプリケーション」に存在している。そのためUD01SSではユーザ認証のためのEAPトランザクションをUSBバスを通してホストPCにリレーすることでWimaxの認証サーバ（AAAサーバ）とホスト側の「ユーティリティアプリケーション」間の通信を確立させる。ホスト側のユーティリティアプリケーションはリレーされたEAPトランザクションを解釈してEAP-TTLSトンネルを確立したあとに、「ユーザIDとパスワード」を用いて認証を進める。デバイス証明書やユーザIDなどの情報はデバイス毎に異なるため、UD01SSではNVRAM領域に記録してあるらしい。ユーティリティアプリケーションはNVRAMからデータを読み取って処理を進めている。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;認証がうまくいった後&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EAPでの認証が成功すると、Wimaxネットワークはそのデバイスが網につながることを許可してくれる。&lt;br /&gt;EAPトンネルはこの時点で破棄してもかまわない。WimaxのPKMの残りの部分はUD01SSの内部で処理されてユーザ側にはその成功・失敗しか通知されない（この辺はまだちゃんと実際に試したわけではないのでぬけがあるかも）。&lt;br /&gt;(2009/5/13補足)：ユーティリティアプリケーションのEAPセッションからUD01SS内部のPKMの処理に引き継ぐためにMSK（マスターセッションキー）をデバイス側に引き渡す必要がある。&lt;br /&gt;&lt;br /&gt;あとはUD01SSは比較的簡単なEthernetインターフェイスに見える。EthernetフレームがUSBバス上に見えるようになるので、DHCPを行ってIPアドレスを取得して通信を進めることになる。Wimax特有の部分は全部UD01SS側でやってくれるので、ホスト側でやることはほとんどない。この辺はデバイスドライバを書いてみようと思うときには非常に都合がよいところだ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;なんか嬉しくない話&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;が、いい話ばかりではなかった。&lt;br /&gt;UD01SSでは証明書やユーザIDなどはNVRAM領域に記録されている。が、読んでもすぐにはわからない形式でひねってあり、USBバス上でもその状態でデータが交換されるため、専用のユーティリティアプリケーションでなければ内容を確認することはできない。&lt;br /&gt;つまり&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;NVRAM領域の読み方がわからなければ、正規に提供されているOS以外でのUQ　Wimaxネットワークの(マットウな方法での）利用は絶望的&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;である。それはあんまり嬉しくない。&lt;br /&gt;というわけで、そいつをどうやってやっつけようか？という話になるのだが、しばらくがんばってみたところなんとなく復元する方法を作り出すことに成功した。&lt;br /&gt;&lt;br /&gt;次回は、その辺の解析の話につながる部分を書いてみる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2614498605289817054?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2614498605289817054/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2614498605289817054' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2614498605289817054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2614498605289817054'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss-3.html' title='UQ WimaxのUD01SS解析 (3)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nwrLM141xU8/SgKcETRx_wI/AAAAAAAAMgk/9nzVlUxxQuQ/s72-c/ud01ss-auth.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5791794805406987423</id><published>2009-05-05T12:27:00.003+09:00</published><updated>2009-05-05T13:02:57.779+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>UQ WimaxのUD01SS解析 (2)</title><content type='html'>&lt;a href="http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss.html"&gt;前回&lt;/a&gt;の続き。&lt;br /&gt;UQのUSB型mobile wimaxインターフェイスであるUD01SSの解析メモ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSのファームウェア(Linux)を覗く&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;UD01SSは前回も書いたようにLinux(正確にはuclinux)をファームウェアとして利用している。普通に使っていると「なんか認識まで時間がかかるなあ」と思うが、これも裏でlinuxがブートして頑張っていると思うとちょっとは許せてしまうかもしれない。&lt;br /&gt;&lt;br /&gt;今回のエントリでは、FirmwareUpdateとして配布されているUD01SSの内部のファイルシステムを覗いてみる方法を紹介する。&lt;br /&gt;&lt;br /&gt;Windowsの場合はProgram Files\UQ\UD01SS\FirmwareUpdate\というディレクトリの下にzImageとramdisk.jffs2が配置されている（OSXの場合はまた別の場所。適当に探してほしい）。zImageが圧縮されたlinuxカーネル本体で、ramdisk.jffs2がUD01SSのフラッシュメモリに書き込まれているルートファイルシステム以下のユーザランドファイルシステムだ。kernelの解析はまたにしておいて、わかりやすいramdisk.jffs2を見てみることにする。&lt;br /&gt;&lt;br /&gt;jffs2はlinux（とくに組み込み系）で利用されているファイルシステム形式でフラッシメモリに対する書き込みイメージとして利用される。これを普通のPCで動いているLinuxでマウントして見るためには、以下のような手続きが必要だ。ここでは手元のlinuxはi386系で動いていることを仮定しておく。&lt;br /&gt;&lt;br /&gt;問題はUD01SSがARMでファイルシステムのそれに合わせて構成されていることだ。エンディアンを変換してあげないとi386のPCではマウントできない。jffs2のイメージの操作にはmtd-toolsというユーティリティを使えばよい。適当に手順を書くと、&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;linuxホストにramdisk.jffs2を持ってくる&lt;/li&gt;&lt;br /&gt;&lt;li&gt;apt-get instlal mtd-toolsなどでmtd-toolsをインストールする&lt;/li&gt;&lt;br /&gt;&lt;li&gt;インストールしたツールでエンディアンをリトルエンディアンに変換する。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;jffs2dump -v -b -e ramdisk-le.jffs2 ramdisk.jffs2&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;必要なカーネルモジュールをロードする。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo modprobe jffs2&lt;/li&gt;&lt;li&gt;sudo modprobe mtdblock&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;ループバックファイルシステムとしてマウントする。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo losetup /dev/loop0 ramdisk-le.jffs2&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sudo modprobe block2mtd block2mtd=/dev/loop0,16384&lt;/li&gt;&lt;br /&gt;&lt;li&gt;sudo mount -t jffs2 -o ro /dev/mtdblock0 /mnt&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;これで/mntの下にUD01SSのファイルシステムが見えるようになる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSのファイルシステム概略&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;細かいことまで見たい人はぜひ自分で覗いてみてほしいが、ざっくりとしたところをメモとして書いておく。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ユーザーはrootだけ（パスワードはちゃんと付いている）&lt;/li&gt;&lt;li&gt;ユーザランドバイナリはbusybox化されている。shもある。&lt;/li&gt;&lt;li&gt;メインアプリケーションは/usr/wimaxコマンドらしい。たぶんこれがもう一つのOSで動いているタスク群と通信している。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSのカーネルイメージ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;本当はzImageもばらしたほうがいいが、だいぶめんどさいのでgzipで圧縮された場所を引っ張り出してstringsしたくらいで満足してしまった。だれか挑戦した人がいたら詳細を教えてくれるとうれしいかも。&lt;br /&gt;&lt;br /&gt;次回のエントリではWimaxインターフェイスとしての基本動作を書いてみる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5791794805406987423?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5791794805406987423/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5791794805406987423' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5791794805406987423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5791794805406987423'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss-2.html' title='UQ WimaxのUD01SS解析 (2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4992656637902795519</id><published>2009-05-04T22:19:00.006+09:00</published><updated>2009-05-05T13:03:28.178+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wimax'/><category scheme='http://www.blogger.com/atom/ns#' term='UQ'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>UQ WimaxのUD01SS解析 (1)</title><content type='html'>すこし前だが&lt;a href="http://www.uqwimax.jp/"&gt;UQ wimax&lt;/a&gt;が関東圏で商業サービス開始を目前に利用モニターを募集していた。あいにく機材を含めた無料モニターには当たらなかったが、ちょっと興味があったので自前でwimaxインターフェイスを購入してしばらく遊んでみた。購入したのは&lt;a href="http://www.uqwimax.jp/service/product/UD01SS.html"&gt;UD01SS&lt;/a&gt;というUSBドングル型のインターフェイス。というわけで、その結果を備忘録としてまとめておこうと思う。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSの概略&lt;/span&gt;&lt;br /&gt;UD01SSは韓国のMODACOM社の製品（日本ではシンセイコーポレーションがOEMで販売）で、韓国ではWibro用として販売されているもの（たぶん&lt;a href="http://www.modacom.co.kr/en/product/004.htm"&gt;MW-U2500&lt;/a&gt;と一緒なんではないかと推測）だ。WimaxフォーラムのWave2に適応しているのでUQが提供するネットワークと互換性がある。中身はGCTセミコンダクタが開発した１チップのWimax SoCであるGDM7205が使われている。GDM7205はCPUとWimax Mac, PHYが集積されており１チップで必要な機能を全部提供できる、とのこと。&lt;br /&gt;&lt;br /&gt;と、これくらいがWebで調べてみてわかることなんだが、あまり面白くない。わざわざ購入してまで調べてみようと思ったのはもう少し面白い特徴があったからだ。UD01SSで面白いと思ったのは、&lt;ul&gt;&lt;li&gt;GDM7205はARM926EJと補助CPU(アーキテクチャ不明）が搭載されている&lt;/li&gt;&lt;li&gt;UD01SSの内部OSはLinuxと補助CPUで動くリアルタイムOS（詳細不明）で動いている&lt;/li&gt;&lt;li&gt;ソフトウェアでUSBクライアントとして動いているのでUSBデバイスとしての構造は比較的簡単&lt;/li&gt;&lt;/ul&gt;といったあたりだ。とくに、「中身がLinuxで動いているUSBドングルタイプのARMのボード」が１２８００円っていうだけでなんかほしくなってしまったのでつい買ってしまった、というのが本音かもしれない。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSの動作モード&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;最近よくあるUSBのHSDPAモデムなどと同様に、UD01SSもデバイスドライバが存在しないOSでは自身をUSBマスストレージデバイス（CDROM）に見せかけるようになっている。専用のデバイスドライバがインストールされたあとには特別なコマンドを発行してデバイスのモードをWimaxインターフェイスに切り替える。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/Sf7yTmDD5fI/AAAAAAAAMgc/yV5VRzqJjH8/s1600-h/ud01ss-modechg.PNG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 141px;" src="http://2.bp.blogspot.com/_nwrLM141xU8/Sf7yTmDD5fI/AAAAAAAAMgc/yV5VRzqJjH8/s320/ud01ss-modechg.PNG" alt="" id="BLOGGER_PHOTO_ID_5331965427298067954" border="0" /&gt;&lt;/a&gt;最初はUSBのVendor ID:0x1076, Product ID:0x7f40のデバイスとして見えているが、モードが変換されると、Vendor ID:0x1eb8, Product ID:0x1240に化ける。&lt;br /&gt;モード変更コマンドは、右の図のようなUSBパケットを生成して送り込めばよい。デバイスがリセットされて新しいVID/PIDをもったデバイスとして再度バスに出現する。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UD01SSのLinuxファイルシステム&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;内部がLinuxということは別に隠されているわけではない（宣伝しているわけでもないようだけど）。UD01SSのアプリケーションがインストールされると、Windowsの場合はProgram Files\UQ\UD01SS\FirmwareUpdateというディレクトリが作成される。その中身は&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ramdisk.jffs2&lt;/li&gt;&lt;li&gt;zImage&lt;/li&gt;&lt;/ul&gt;になっていて中身のカーネルとファイルシステムを覗くことができる。&lt;br /&gt;&lt;br /&gt;次のエントリーでこれらを覗いてみる方法を書いてみる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4992656637902795519?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4992656637902795519/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4992656637902795519' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4992656637902795519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4992656637902795519'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/05/uq-wimaxud01ss.html' title='UQ WimaxのUD01SS解析 (1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nwrLM141xU8/Sf7yTmDD5fI/AAAAAAAAMgc/yV5VRzqJjH8/s72-c/ud01ss-modechg.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3993502820719368581</id><published>2009-04-26T22:49:00.007+09:00</published><updated>2009-05-12T13:34:34.788+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>E-mobile D21LCをOpenBSDで使う</title><content type='html'>少し前の話だがE-mobileの&lt;a href="http://emobile.jp/products/lc/d21lc/"&gt;D21LC&lt;/a&gt;をしばらく借りることができたので、少し解析してOpenBSDで使えるようにしてみた。その時の話をメモとして残しておくことにする。&lt;br /&gt;&lt;br /&gt;D21LCは中国のLongcheer社製のHSDPAモデムだ。E-mobileでは最初はHuawei社のモデムを使っていたが、しばらく前から２社の製品を投入している。D21LCも他のE-mobileのモデムと同様に「ゼロインストール」機能が搭載されている。ゼロインストールとはドライバが入っていないOS（つまり初回挿入時）にはモデムをUSBマスストレージデバイスとして認識させて必要なドライバをモデムから直接インストールさせる仕組みである。ドライバが動き始めると、そのドライバがモデムのモードを変更してモデムとして動作するようになる。Windowsなどからは大変便利な機能であるが、ほかのOSで使うためにはちょっとおせっかいだ。&lt;br /&gt;&lt;br /&gt;Huawei社のモデムは&lt;span style="font-size:100%;"&gt;&lt;a href="http://hwhack.blogspot.com/2008/01/d02hw.html"&gt;メモ：D02HW解析&lt;/a&gt;&lt;/span&gt;で昔書いたように特別なUSBコマンドを発行すると、USBマスストレージモードからモデムモードに動作モードが切り替わった。D21LCの場合はどうだろうか？&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;D21LC：モデムモードへの切り替え&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/SfRqFTmuRcI/AAAAAAAAMfU/Ir6YFRUYTnQ/s1600-h/d21lc-1.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 95px;" src="http://2.bp.blogspot.com/_nwrLM141xU8/SfRqFTmuRcI/AAAAAAAAMfU/Ir6YFRUYTnQ/s320/d21lc-1.PNG" alt="" id="BLOGGER_PHOTO_ID_5329000898480719298" border="0" /&gt;&lt;/a&gt;USBアナライザでUSBトランザクションをモニタしてみると、あるタイミングでデバイスがリセットされるタイミングがあった。これがモデムモードへの切り替えコマンドだろうと推測してもう少し中身を眺めてみる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/SfRqbIHTlEI/AAAAAAAAMfc/ltqKH81B7Ek/s1600-h/d21lc-2.PNG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 221px;" src="http://2.bp.blogspot.com/_nwrLM141xU8/SfRqbIHTlEI/AAAAAAAAMfc/ltqKH81B7Ek/s320/d21lc-2.PNG" alt="" id="BLOGGER_PHOTO_ID_5329001273353278530" border="0" /&gt;&lt;/a&gt;D21LCのモード変更コマンドはUSBマスストレージデバイスに対するコマンドとして実装されていた。（コマンドパケットの先頭の0x55 0x53 0x42 0x43:USBCが規定のマジックナンバー）といっても、USBマスストレージデバイスの仕様には定義されていない独自コマンドを発行している。&lt;br /&gt;さらにモデムの動作を眺めてみたが、それ以降は普通の３Gモデムと同様の動作をしているようだ。&lt;br /&gt;というわけで、このシーケンスを発行するようにデバイスドライバを拡張してやれば、ほかのOSでもモデムとして利用できるはずだ。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;シリアルポート&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;D21LCではシリアルポートが３本生成される。モデムポートは3本目（openbsdの場合はttyU2)だった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OpenBSDのデバイスドライバの拡張&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;実はすでにOpenBSDのumsm(4)： 3Gモデム用デバイスドライバでは、このようなUSBマスストレージ型のモード変更デバイスを扱うための機能をすでに実装してある（　umsm_umass_changemode()　@umsm.c)。　似たようなデバイスを扱うために実装しておいたものだが、今回はこの関数を少し拡張して利用することにした。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SfRtUxdbjeI/AAAAAAAAMfk/u2sK2fEzBm4/s1600-h/d21lc-3.PNG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 268px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SfRtUxdbjeI/AAAAAAAAMfk/u2sK2fEzBm4/s320/d21lc-3.PNG" alt="" id="BLOGGER_PHOTO_ID_5329004462727728610" border="0" /&gt;&lt;/a&gt;すでにOpenBSDのCVSへマージされている（&lt;a href="http://www.openbsd.org/cgi-bin/cvsweb/src/sys/dev/usb/umsm.c.diff?r1=1.44;r2=1.45;f=h"&gt;差分&lt;/a&gt;）を参照すればわかるが、上でキャプチャしたコマンドをタイミングよく発行するだけだ。&lt;br /&gt;コマンド発行部分の差分を以下に載せておく。いままで２種類の同様なコマンドがあったので、３種類目として拡張しておいた。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;おまけ：D21LC雑感&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;実際に使ったのは短い期間だったが、D21LCを使って気がついたのは、「デバイスがサポートしていないコマンドを受理するとフリーズすることがある」ということだ。正式に使えるコマンドセットが公開されているわけでもないのでバグというのは言いすぎだが、ちょっとした動作確認でハングアップしてしまうことが多くて困ることが多かった。最初はデバイスドライバ側が悪いのかと思ったが、Windowsでも同じ操作で同じ状態に陥ることが確認されたのでデバイス側に問題があるんだと思っている。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3993502820719368581?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3993502820719368581/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3993502820719368581' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3993502820719368581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3993502820719368581'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/04/e-mobile-d21lcopenbsd.html' title='E-mobile D21LCをOpenBSDで使う'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nwrLM141xU8/SfRqFTmuRcI/AAAAAAAAMfU/Ir6YFRUYTnQ/s72-c/d21lc-1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7229563073556188104</id><published>2009-03-13T01:00:00.005+09:00</published><updated>2009-03-13T01:54:09.346+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><title type='text'>arduino-13 と atmega88</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;秋月電子ではatmega88というチップを格安で売っている。このAtmega88は 168のメモリ容量が半分になったもので、海外ではあまり値段もかわらないことから arduinoの中でこれを使っているものはないようだ。しかし、日本ではチップが安いことから、&lt;a href="http://bird.dip.jp/mt/archives/2008/04/19/1649.htlm"&gt;これを使うためのハック&lt;/a&gt;がいくつかなされてきていたが、arduino-13が2月にリリースされたのでもう一度ハックをしなおす必要がある。そこでarduino-12 行ったのと同様の変更をしようとおもったら、案外簡単に対応できるように内部がかわっていたのでそれについて書いておこう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まず、最初に私の手元で使っているライターはSTK500なのでそちらを使えるようにするところからはじめてみた。programmers.txt に以下の３行を追加すると、stk500を利用できるようになる。&lt;/div&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;##############################################################&lt;br /&gt;stk500.name=STK500&lt;br /&gt;stk500.communication=serial&lt;br /&gt;stk500.protocol=stk500v2&lt;br /&gt;##############################################################&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;そして、atmega88対応の本番は以下のとおりである。まず、ブートローダを用意する。これは自分で作ると大変なので &lt;a href="http://www.geocities.jp/arduino_diecimila/index.html"&gt;kosakaさんが公開しているもの&lt;/a&gt;を利用した。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このブートローダをarduinoのフォルダの中の hardware/bootloaders のフォルダの中に、 lilypad88 というフォルダをつくり LilyPadBOOT_88.hex という名前で保存する。&lt;/div&gt;&lt;div&gt;これでブートローダの準備はできあがった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次に実際のコンパイルのパラメータになる boards.txt の変更が必要だ。lilypad をベースにAtmega 88対応したものなので、lilypad88 という名前で登録することとした。boards.txt への追加部分は以下のとおりになる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;arduino-12 までは cores の中のコードにあった ifdef を書き直す必要があったが、coresのコードが大幅に書き換えられたようで、現状では以下の部分だけで問題なくバイナリを作ることが出来るようだ。あまり話題になっていないが、coresを書き換えずにこれだけの手間で新しいチップがサポートできるようになっているのは、 arduino-13のもっとも変わった部分かもしれない。&lt;/div&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;##############################################################&lt;br /&gt;lilypad88.name=LilyPad Arduino w/ ATmega88&lt;br /&gt;lilypad88.upload.protocol=stk500&lt;br /&gt;lilypad88.upload.maximum_size=7168&lt;br /&gt;lilypad88.upload.speed=19200&lt;br /&gt;&lt;br /&gt;lilypad88.bootloader.low_fuses=0xe2&lt;br /&gt;lilypad88.bootloader.high_fuses=0xdd&lt;br /&gt;lilypad88.bootloader.extended_fuses=0x00&lt;br /&gt;lilypad88.bootloader.path=lilypad88&lt;br /&gt;lilypad88.bootloader.file=LilyPadBOOT_88.hex&lt;br /&gt;lilypad88.bootloader.unlock_bits=0x3F&lt;br /&gt;lilypad88.bootloader.lock_bits=0x0F&lt;br /&gt;&lt;br /&gt;lilypad88.build.mcu=atmega88&lt;br /&gt;lilypad88.build.f_cpu=8000000L&lt;br /&gt;lilypad88.build.core=arduino&lt;br /&gt;##############################################################&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;これで、arduino-13  でも問題なく Atmega88が使えるようになったはずだ。&lt;/div&gt;&lt;div&gt;ちなみに最近の秋月電子でのAtmega88は Atmega88P というピコパワー対応のものにかわっている。こちらでの動作が同様に行えるかはまだ未確認なので、また報告しようとおもう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7229563073556188104?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7229563073556188104/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7229563073556188104' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7229563073556188104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7229563073556188104'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/03/arduino-13-atmega88.html' title='arduino-13 と atmega88'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4056856770291809028</id><published>2009-02-20T20:27:00.005+09:00</published><updated>2009-02-20T20:37:32.698+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>BLINKM ICSPアダプタ</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ6UAvKxopI/AAAAAAAAMDE/aQ3vvlHsMJE/s1600-h/R0011972.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SZ6UAvKxopI/AAAAAAAAMDE/aQ3vvlHsMJE/s200/R0011972.JPG" alt="" id="BLOGGER_PHOTO_ID_5304840151471596178" border="0" /&gt;&lt;/a&gt;&lt;a href="http://hwhack.blogspot.com/2009/02/usb-blinkm.html"&gt;USB-BLINKM&lt;/a&gt;の実験をしている最中に、BLINKMのAVR Tiny45を書き換える作業が面倒になったので簡単なICSP用のアダプタを作ってみた。機能は最低限で、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AVR USBISP mkIIの6pinのコネクタ&lt;/li&gt;&lt;li&gt;BLINKM（ICSP用の補助ピンを2本増やしたもの）&lt;/li&gt;&lt;li&gt;外部電源５V&lt;/li&gt;&lt;/ul&gt;をつなげるだけだ。最初はブレッドボードに挿して個別に配線していたのだが、これを作っただけでずいぶん作業が楽になった。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ6UA8nAyWI/AAAAAAAAMDM/un44f7w3UBU/s1600-h/R0011991.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SZ6UA8nAyWI/AAAAAAAAMDM/un44f7w3UBU/s200/R0011991.JPG" alt="" id="BLOGGER_PHOTO_ID_5304840155079690594" border="0" /&gt;&lt;/a&gt;部品の配置図と配線図のメモを残しておく。これも秋月の16穴基板を2枚つかって作ったので、8x4穴に収まるようになっている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4056856770291809028?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4056856770291809028/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4056856770291809028' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4056856770291809028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4056856770291809028'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/02/blinkm-icsp.html' title='BLINKM ICSPアダプタ'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/SZ6UAvKxopI/AAAAAAAAMDE/aQ3vvlHsMJE/s72-c/R0011972.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5504788066227037748</id><published>2009-02-20T17:22:00.014+09:00</published><updated>2009-02-20T19:47:34.063+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='AVR'/><title type='text'>USB-BLINKM</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ5qudbyh0I/AAAAAAAAMCI/riZmbyDEMMc/s1600-h/R0011987.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 160px; height: 120px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SZ5qudbyh0I/AAAAAAAAMCI/riZmbyDEMMc/s320/R0011987.JPG" alt="" id="BLOGGER_PHOTO_ID_5304794757496735554" border="0" /&gt;&lt;/a&gt;&lt;a href="http://thingm.com/products/blinkm.html"&gt;BLINKM&lt;/a&gt;はthingmが作成・販売しているインテリジェントフルカラーLEDだ。1cm角くらいの基板に、明るいRGB LEDとAVR Tiny45が載っていて、I2Cインターフェイスで外部に接続できる。I2Cはデイジーチェーンできるので、たくさんLEDを使うときには大変便利だ。Arduinoなどから簡単に扱えるので様々なメディア作品で利用されている。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/SZ5roeaMUaI/AAAAAAAAMCY/v5Dn_pe-yNo/s1600-h/R0011989.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 200px;" src="http://2.bp.blogspot.com/_nwrLM141xU8/SZ5roeaMUaI/AAAAAAAAMCY/v5Dn_pe-yNo/s200/R0011989.JPG" alt="" id="BLOGGER_PHOTO_ID_5304795754190885282" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SZ5roGUk_qI/AAAAAAAAMCQ/g0Hr3O0AFTs/s1600-h/R0011990.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SZ5roGUk_qI/AAAAAAAAMCQ/g0Hr3O0AFTs/s200/R0011990.JPG" alt="" id="BLOGGER_PHOTO_ID_5304795747724885666" border="0" /&gt;&lt;/a&gt;先週からいきなり始めてみた「AVRを使ってみる」という活動だが、ふと机の横に転がっていたBLINKMを眺めるとAVR Tiny45が目についた。ちょうどAVR Tiny85で遊んでいたところだった（その話はまた今度）ので、「Blinkmを単純にLED付きのAVRとして使えるんじゃないか？」と思い立った。実際にやってみたのが今回のエントリの「USBに直接つながるBLINKM」だ。i2cのデイジーチェーンできるという利点は無くなってしまうけれど、USBならどんなPCにも大体ついているので、一個だけ使う場合には逆にお手軽になる（と期待している）。今回は、ハードウェア部分について書いてみることにする。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;BLINKMの回路図&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/SZ5quJuFMBI/AAAAAAAAMBw/7-P-01p4qWk/s1600-h/R0011982.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_nwrLM141xU8/SZ5quJuFMBI/AAAAAAAAMBw/7-P-01p4qWk/s320/R0011982.JPG" alt="" id="BLOGGER_PHOTO_ID_5304794752204746770" border="0" /&gt;&lt;/a&gt;BLINKMを裏返して眺めてみると、実装されている部品はLEDと電流制限用の抵抗(x3)とAVR TINY45とデカップリング用のコンデンサくらいだ。とりあえずI2Cの接続用にでている4pinがどこにつながっているかと、LEDがどのIOにつながっているかがわかれば良いとおもって回路を追ってみた。というわけでわかったのが左の図に示す回路図。大変都合の良いことに、i2cのdata/clockの線がPB0/PB2につながっている。&lt;br /&gt;&lt;br /&gt;あと実際のBLINKMには実装されていないけれど、ISCPに必要な信号線を出すためのパターンも実装されていて、reset/misoは簡単に外部に引き出せる。&lt;br /&gt;AVRでソフトウェア的にUSBを実現するコードとしてobject development社が公開している&lt;a href="http://www.obdev.at/products/avrusb/index.html"&gt;AVRUSB&lt;/a&gt;があるが、USBの信号線の一本をINT0に接続することが推奨されている。PB0/PB2が出ているのがどうして都合が良いかというと、PB2はINT0だからだ。ちょうどTINY85でAVRUSBを試していたところだったので、すぐに「ほとんど外付け回路無しでUSB化できそうだ」という予想ができた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;BLINKM-USBブリッジ回路&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ5quUE6_yI/AAAAAAAAMB4/twxw20xiOjQ/s1600-h/R0011988.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SZ5quUE6_yI/AAAAAAAAMB4/twxw20xiOjQ/s320/R0011988.JPG" alt="" id="BLOGGER_PHOTO_ID_5304794754984902434" border="0" /&gt;&lt;/a&gt;というわけで、BLINKMの4pinコネクタからUSBのAコネクタに変換するための外部回路を書いてみる。基本的にAVRUSBのリファレンス回路のツェナーダイオードを使うやつと同じ。&lt;br /&gt;USB1.1の仕様ではD-信号線を1.5Kオームでプルアップすると、low speed (1.5Mbps)デバイスだと認識する。そのためのプルアップ抵抗が一本、信号線の電圧をクリッピングするためのツェナーが2本、あと信号線のシリーズ抵抗(68オーム)が2本、だけの簡単な回路になる。実際にはVccラインに保護用に500mA以下(LEDだけだったら300mA程度で十分）のポリヒューズを一本と、0.1uF程度のセラミックコンデンサを実装しておけば良い。&lt;br /&gt;ポリヒューズが無ければ直結するという方法もあるが、何か間違ったときにPC側のUSBポートやUSBホストコントローラを焼いちゃうかもしれないのでおすすめしない。デカップリング用コンデンサはなくてもいいから、過電流の保護はちゃんとやっておこう。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;BLINKM-USBブリッジの実装&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SZ5quUtjA3I/AAAAAAAAMCA/UaPJ3RyA0FA/s1600-h/R0011984.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SZ5quUtjA3I/AAAAAAAAMCA/UaPJ3RyA0FA/s320/R0011984.JPG" alt="" id="BLOGGER_PHOTO_ID_5304794755155297138" border="0" /&gt;&lt;/a&gt;思い立ってから、最初の実験を含めて3つほど実装したけど、一番小さくなったやつを紹介しておく。USBもBLINKMも両方とも4pinのコネクタだったので、秋月の&lt;a href="http://akizukidenshi.com/catalog/g/gP-02515/"&gt;16穴スルーホール基板&lt;/a&gt;をつかって実装したくなった。10枚買えば一枚10円、100枚だと一枚5円というお手頃価格だし、基板を加工する手間も省ける。&lt;br /&gt;&lt;br /&gt;右の図が実体配線図。部品面から見た図になっている。斜め配線＆一つの穴に2本部品がはいっているというお行儀の悪い実装になっているけれどなんとか収まったので良しとしよう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/SZ57Exm744I/AAAAAAAAMCg/7UCttrOYLoE/s1600-h/R0011985.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_nwrLM141xU8/SZ57Exm744I/AAAAAAAAMCg/7UCttrOYLoE/s200/R0011985.JPG" alt="" id="BLOGGER_PHOTO_ID_5304812733055361922" border="0" /&gt;&lt;/a&gt;部品はだいたい秋葉原で揃う。3.6Vのツェナーダイオードは&lt;a href="http://www.sengoku.co.jp/"&gt;千石電商&lt;/a&gt;で100本入りをかった。これはどこでも売っているはず。68オームと2Kオームのチップ抵抗(1608)は&lt;a href="http://www.suzushoweb.com/"&gt;鈴商&lt;/a&gt;で売っている。チップ抵抗なら千石でもあるはずなんだけど、68オームは置いていなかった。一番面倒なのが面実装のポリスイッチ（ポリヒューズ）だ。容量の小さいものなら秋月で扱っているらしいけど0.1Aは小さすぎる。探してもなかったので&lt;a href="http://www.chip1stop.com/"&gt;チップワンストップ&lt;/a&gt;で、&lt;a href="http://www.tycoelectronics.com/japan/raychem/index.html" target="_blank"&gt;Tyco Electronics Raychem&lt;/a&gt; の&lt;span class="m_num"&gt;          PSR-27313-050を調達して使った。まあ、千石のB1で売っているポリスイッチを裏にがんばって貼り付けても大丈夫なのでそこまでしなくても平気だとはおもう。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/SZ57EzZauTI/AAAAAAAAMCo/4gqbRsrwug4/s1600-h/R0011986.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_nwrLM141xU8/SZ57EzZauTI/AAAAAAAAMCo/4gqbRsrwug4/s200/R0011986.JPG" alt="" id="BLOGGER_PHOTO_ID_5304812733535533362" border="0" /&gt;&lt;/a&gt;&lt;span class="m_num"&gt;実際に制作したものは右の写真のとおり。BLINKMはUSBコネクタ側にLEDが向くように差し込む。USBコネクタを差し込むと、ちょっと余裕が出るくらいの長さになるので、これがこの方法でつなげる場合に一番短くなる実装方法だろう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;USB-BLINKMのソフトウェア&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;もちろん、今回つくった回路で電気的にUSBコネクタにさせるようになったとしても、AVRのソフトウェアを書かないと動かない。I2C-USBブリッジではなく、BLINKMにのっているTINY45に直接USBを処理してもらわないといけないからだ。&lt;br /&gt;&lt;br /&gt;次回のエントリでは、AVRUSBについて説明してみる予定。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5504788066227037748?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5504788066227037748/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5504788066227037748' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5504788066227037748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5504788066227037748'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/02/usb-blinkm.html' title='USB-BLINKM'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/SZ5qudbyh0I/AAAAAAAAMCI/riZmbyDEMMc/s72-c/R0011987.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2909679860678374197</id><published>2009-02-19T20:27:00.006+09:00</published><updated>2009-02-19T20:56:58.806+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>ブレッドボードでArduino</title><content type='html'>「AVRのATMEGA168があればArduino互換ボードが作れる」ということだけを教えてもらって始めたところ、いくつかはまったのでメモ。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AVRISP MKIIでは外部電源が無いと書けない&lt;/li&gt;&lt;li&gt;買ってきたばかりのATMEGA168は外部クロックで動くモードになっているので、クロックを供給してあげないと書けない&lt;/li&gt;&lt;li&gt;AVRにはヒューズというものがあって、クロックなどの動作モードはそこに書く。ヒューズのビットマップはチップごとに違うので仕様書を参照&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SZ1G8XvcenI/AAAAAAAAL-o/tU5c9ND8PdI/s1600-h/R0011981.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SZ1G8XvcenI/AAAAAAAAL-o/tU5c9ND8PdI/s200/R0011981.JPG" alt="" id="BLOGGER_PHOTO_ID_5304473939091421810" border="0" /&gt;&lt;/a&gt;とりあえずfirmware(bootloader)を書くまでに超えないといけなかったのはこのくらい。前のエントリーの&lt;a href="http://hwhack.blogspot.com/2009/02/arduino.html"&gt;arduino用シリアルアダプタ(2)&lt;/a&gt; を作っただけでは「ブレッドボードでArduino」には到達できなかった。とりあえずクロックを供給するために、その辺にあった&lt;a href="http://www.murata.co.jp/products/resonator/index.html"&gt;セラロック&lt;/a&gt;(20MHz)をつなげてみた。DIPのATmega168のクロック周りのピン配置はGND-XTAL1-XTAL2の順番だが、セラロック（負荷容量内蔵）のピン配置はOSC0-GND-OSC1になっていてブレッドボードに挿すには都合が悪い。写真のようにGNDとOSC0のピンをひねって順番を入れ替えたものを作っておいた。これも今後たくさん使うようなものでは無いけれど、一個くらい持っていても損はしないだろう。&lt;br /&gt;&lt;br /&gt;で、次にはまったのがこのいい加減に選んだ20MHzという速度だった。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Arduinoのブートローダーはクロック周波数によって違う&lt;/li&gt;&lt;/ul&gt;普通のArduinoは16MHzで動作するらしい。16MHz以外のクロックをつかって標準的なブートローダーを書き込んでもシリアル通信のタイミングが合わなくて通信できない。解決方法は2つで、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;供給しているクロックに対応したブートローダーを作成して書き込む&lt;/li&gt;&lt;li&gt;内部クロック（８MHｚ）で動作する用にヒューズを書き換えて、8MHz用のブートローダー（lilypad 8MHz用）などを書き込む&lt;/li&gt;&lt;/ul&gt;のどちらかをやらないといけない。&lt;br /&gt;&lt;br /&gt;とくにArduinoのknow-howが無い状態で始めてしまったので「こんなところではまるなよ」と言われそうだけど、しょうがない。おかげで最初にLEDの点滅プログラムを動かせた時には、すでにブートローダーのソースを読み終わっているというArduinoの思想とはちょっと離れたスタートになってしまった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2909679860678374197?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2909679860678374197/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2909679860678374197' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2909679860678374197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2909679860678374197'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/02/arduino_19.html' title='ブレッドボードでArduino'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nwrLM141xU8/SZ1G8XvcenI/AAAAAAAAL-o/tU5c9ND8PdI/s72-c/R0011981.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2094061380388075767</id><published>2009-02-19T17:41:00.009+09:00</published><updated>2009-02-19T20:25:08.628+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>arduino 用シリアルアダプタ（２）</title><content type='html'>単に機会が無くていままでAVRを使うことは無かったのだが、共同執筆者のCUEと秋葉原で会ったときに「AVRつかったことないんだ」と言われてしまったので、その場の勢いでATMEGA168とATTINY85を購入してしまった。さて、帰ろうかとおもったときにふと違和感を感じた。「あれ？これってどうやってプログラムを書き込むんだ？」。今までAVRをさわったことのない私に何らかの開発環境があるわけがない。結局、さらにATMELの&lt;a href="http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3808"&gt;AVRISP MKII&lt;/a&gt;を秋月で4000円で購入するはめになった。&lt;br /&gt;&lt;br /&gt;というわけで、何となくAVRと戯れることになったで、最近の週末プロジェクトについて書いてみようと思う。&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;Arduino用シリアルアダプタ&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SZ0tY0KiiYI/AAAAAAAAL-I/pIaZ2dtxadg/s1600-h/R0011977.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SZ0tY0KiiYI/AAAAAAAAL-I/pIaZ2dtxadg/s320/R0011977.JPG" alt="" id="BLOGGER_PHOTO_ID_5304445840455272834" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;右も左もわからなかったのだが、AVRといえばArduinoがはやっているらしいし、CUEもさわっているみたいだったのでその辺から攻めてみた。せっかくATMEGA168を買ってしまった手前Arduinoを更に買うのももったいなかったので、ブレッドボードで実験してみることにする。CUEがやっていた&lt;a href="http://hwhack.blogspot.com/2009/01/arduino.html"&gt;シリアルアダプタ&lt;/a&gt;が便利そうだったので、こちらでも作ってみた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;たくさんつくるものでもないし、必要そうな機能は全部実装した。 &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;USB-AVR間のシリアル通信&lt;/li&gt;&lt;li&gt;DTRを用いたオートリセット&lt;/li&gt;&lt;li&gt;手動リセットスイッチ&lt;/li&gt;&lt;li&gt;シリアル通信のTX/RXのステータスLED&lt;/li&gt;&lt;li&gt;AVRISP MK2をAVRにつなげるためのICSPの6ピンコネクタ&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;AVRISP MKIIはターゲットとなるAVRに電源が供給されていないと書き込めないので、USB給電で全部書き込むためにはICSPコネクタが手元にあった方が、ブレッドボード上のAVRを扱うときに都合がよい。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/SZ0unVvsGNI/AAAAAAAAL-Q/0M7Gm_O-cSA/s1600-h/R0011978.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_nwrLM141xU8/SZ0unVvsGNI/AAAAAAAAL-Q/0M7Gm_O-cSA/s320/R0011978.JPG" alt="" id="BLOGGER_PHOTO_ID_5304447189499254994" border="0" /&gt;&lt;/a&gt;これで、こんな感じにブレッドボード上にArduino互換の環境をすぐに準備できるようになった。AVRISP MKIIをつなげないといけないのはブートローダを書き込む最初の一回だけで、Arduinoを使うのならそれ以降に接続する必要はない。&lt;br /&gt;&lt;br /&gt;まあ、Arduino以外でブレッド ボードにのったAVRを使うこともあるだろうから、つけて良かったと感じている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ0vr6EZq_I/AAAAAAAAL-Y/A8nbV_Nyfxo/s1600-h/R0011976.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SZ0vr6EZq_I/AAAAAAAAL-Y/A8nbV_Nyfxo/s200/R0011976.JPG" alt="" id="BLOGGER_PHOTO_ID_5304448367480908786" border="0" /&gt;&lt;/a&gt;&lt;/div&gt; とりあえず基板のレイアウトを書いておいた紙を記録用に載せておく。接続図とかは自明だからいらないよね。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ06iYozysI/AAAAAAAAL-g/55ggB1NX1aU/s1600-h/R0011980.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_nwrLM141xU8/SZ06iYozysI/AAAAAAAAL-g/55ggB1NX1aU/s200/R0011980.JPG" alt="" id="BLOGGER_PHOTO_ID_5304460298515892930" border="0" /&gt;&lt;/a&gt;（補足：2009/02/19 19:54)&lt;br /&gt;自分でも忘れそうだから、配線図を書き下した。参考までに載せておく。RX/TXのLEDは割愛。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/SZ06iYozysI/AAAAAAAAL-g/55ggB1NX1aU/s1600-h/R0011980.JPG"&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2094061380388075767?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2094061380388075767/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2094061380388075767' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2094061380388075767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2094061380388075767'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/02/arduino.html' title='arduino 用シリアルアダプタ（２）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nwrLM141xU8/SZ0tY0KiiYI/AAAAAAAAL-I/pIaZ2dtxadg/s72-c/R0011977.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2412796593391056419</id><published>2009-01-29T14:50:00.007+09:00</published><updated>2009-01-29T15:03:45.059+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>arduino 用シリアルアダプタ</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;arduinoの場合には作品制作にPCは必須ではない、というよりPCからコントロールする作品ならば、プログラムが一種類ですむgainerのほうがより簡単に扱えるし、PGAや静電容量センサーが使えて便利なことがおおい。arduinoの本領はgainerでは動作しないようなデバイスを動かす場合や、マイコン単体で動作する作品をつくる場合だろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そのため、gainerの時と違ってUSBシリアルをすべてのボードに同梱する必要はなく、プログラムの書き込みやデバッグ時のためだけに使えるようにすればよい。&lt;/div&gt;&lt;div&gt;そこで、USBシリアルアダプタを作品のブレッドボードに差し込みやすい形で作ることにした。まず最初に試作してみたのが、L型ヘッダをつかい、縦に基板を差し込む方法である。Decemiela についているリセット端子と同様の回路（抵抗とコンデンサ）をつけることで、自動リセットにも対応している。&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SYFEUjN8W4I/AAAAAAAABNE/JZtE_1RvE-I/s320/R0013985.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296589756606208898" /&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SYFEUjfmRbI/AAAAAAAABNM/PdOSNJjTaVs/s320/R0013984.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296589756680258994" /&gt;&lt;div&gt;上からみた配線図はこのよ&lt;/div&gt;&lt;div&gt;うになる。電源ラインの取り回しにモジュールの６ピンのところを通してあるが、ここはソケットのピンを抜いておいて、通電しないようにしてある。もちろん、ジャンパとして表面をまわしてもよいだろう。0.1uFのコンデンサと10KΩの抵抗で通信用のラインを横切っているので、裏面にはジャンパが飛ばないようになっている。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SYFEKMqMhpI/AAAAAAAABM0/jk_LkKJhxws/s320/R0013978.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296589578752001682" /&gt;&lt;div&gt;この方法ならブ&lt;/div&gt;&lt;div&gt;レッドボードに部品が少々のっていても大丈夫であるとおもったが思ったよりもL型コネクタに厚みがありほとんど部品がない状態でなければ刺せない。&lt;/div&gt;&lt;div&gt;よってこのままでは使えないので、ケーブルをつかってのばすことを考えた。よくやる手ではケーブルの先にピンヘッダをハンダ付けするのだが、今日はイマイチうまくいかなかったので新しい方法を試してみた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SYFEJw_1IDI/AAAAAAAABMk/V2ziDC28IjY/s320/R0013949.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296589571326550066" /&gt;&lt;div&gt;もともと千石電商で売られているヘッダピンとブレッドボードを結ぶジャンパケーブルを分解する。これはエクステン&lt;/div&gt;&lt;div&gt;ションのようになっていて、１ピンのソケットと、１ピンのピンヘッダがそれぞれ圧着されている、簡単にいえばジャンパワイヤーの延長コード状のものだ。(図)ピンヘッダがついた部品をブレッドボードにさすのに利用するワイヤーだが、これを使ってシリアルのヘッダを延長することにした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;もちろん、そのまま５本のケーブルをさすのでもかまわないのだが、ここは専用ケーブルとするためにも、ヘッダを分解し、１x８列の枠を使って再構成することとした。一度ささっている圧着ヘッダを抜くためには、細いマイナスドライバを用いるのがいい。ソケットのプラスチックのひっかかりがある部分をすこしこじって、ひっぱればケーブルを抜くことが出来る。両側のケーブルを抜くと、このように金具だけになったケーブルが出来上がる。これを５本用意して８列ソケットの両側から、３本、２本とさす。延長なのでクロスする部分がないようにフラットに両側のソケットを実装すれば完成である。&lt;/span&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SYFFtrq3nlI/AAAAAAAABNc/qHAec3rS9Ho/s320/R0013947.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296591287883374162" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これを使うことで１列の隙間があればブレッドボード上のarduinoに書き込みを行うことが出来る。&lt;/div&gt;&lt;div&gt;もちろん、延長ケーブルの配線でクロスさせるなら、もっと簡単にラインを引っ張りだせた、というのは言うまでもないが、直接させることを目標にしたというのが今回の工作の主眼なのでそこは問わないことにしよう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SYFFt59AvJI/AAAAAAAABNk/eUU4qqsZ4Qw/s320/R0013981.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296591291717565586" /&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;なんにせよ、これで格安arduino環境が整い、ブレッドボード上に低コストで作品を作ることが出来るようになったわけだ。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2412796593391056419?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2412796593391056419/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2412796593391056419' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2412796593391056419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2412796593391056419'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/01/arduino.html' title='arduino 用シリアルアダプタ'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZFlW0NdMJdk/SYFEUjN8W4I/AAAAAAAABNE/JZtE_1RvE-I/s72-c/R0013985.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4726059496981836655</id><published>2009-01-28T18:48:00.003+09:00</published><updated>2009-01-28T18:59:18.914+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>ブレッドボードで arduino/88</title><content type='html'>&lt;div&gt;&lt;a href="http://www.geocities.jp/arduino_diecimila/obaka/project-2/index.html"&gt;one chip Arduino clone&lt;/a&gt; というのを&lt;a href="http://jp.makezine.com/blog/2009/01/onechip_arduino.html"&gt; Make blog&lt;/a&gt;などで発見した。制作記事を読むとATMega88 をつかって 内部発振で動くらしい。ということで、何度か試したもののあまり巧くいってないarduino clone作りであるがこれはさっそく真似せねば！と思い、ブレッドボード上に実装してみた。これは速報のonechip arduinoの前に行った実験だが、報告の前後が逆になっている。&lt;/div&gt;&lt;div&gt; &lt;br /&gt;&lt;/div&gt;&lt;div&gt;最近の&lt;a href="http://arduino.cc/"&gt;Arduino&lt;/a&gt;は通常 Atmega168 を 16MHzで駆動しているが、one chip arduino は日本の誇る&lt;a href="http://akizukidenshi.com/"&gt;秋月電子&lt;/a&gt;で格安に販売されている Atmega 88 を使い、内部発振で駆動しているため発振子も必要なくなっている。このチップに最低限の回路としてステータス表示用のLEDと動作きりかえのためのリセットスイッチを実装したのがone chip arduino だ。実装部品は思ったよりも少なく、gainerと違い、シリアルポートもオプションなのでたしかにワンチップの上に載せられるくらいの部品しか存在しない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これをベースにワンチップ化の前に、さらにシンプルになるように配慮しながらブレッドボードに組み立ててみることとした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そのまえに、まずAVRをarduinoとして動作させるのに必要なブートローダをAtmega88に書き込んだ。&lt;/div&gt;&lt;div&gt;仕事でAVRを使っているグループがいるのもあり、手元にたまたま STK500が転がっていたので、&lt;a href="http://www.geocities.jp/arduino_diecimila/index.html"&gt;kosakaさんのページ&lt;/a&gt;&lt;/div&gt;&lt;div&gt;を参考に STK500をarduinoに登録した。&lt;/div&gt;&lt;div&gt;さすが純正品ということで当たり前だが、なんのトラブルもなく書き込みを行えた。ブートローダは各チップに一度だけ書けばいいので、チップを買ってきたらまとめて作っておくのがよいだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SYArqdfkP9I/AAAAAAAABMM/5t2_h_l5yVo/s320/R0013976.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296281170259230674" /&gt;&lt;div&gt;秋月電子で一番安いブレッドボードの上でこれを組み立てることとして、&lt;/div&gt;&lt;div&gt;配線を行った。この　ブレッドボードでの最大の問題は、電源ラインが左右に分離しているところであり、このため通常はやらないパーツの上をとびこえる配線が１カ所だけ入っている。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SYArqz9D2LI/AAAAAAAABMU/4HqLn7Hucaw/s320/R0013973.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296281176288516274" /&gt;&lt;div&gt;なお、もう１つ大きいブレッドボードの場合には、電源ラインが２本づつ入っているので、左右をちゃんとつなぎ込めば、無様な真似をしなくても作ることが出来る。余白に回路を作ることを考えると、実はこちらのほうがよいのかもしれない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SYArqfsG4cI/AAAAAAAABME/KQl9IIB-6OA/s320/R0013951.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296281170848702914" /&gt;&lt;div&gt;実際に利用するスケッチを書き込むためには、USBシリアルの変換アダプタが必要だ。秋月のUSBシリアル変換モジュールにコンデンサと抵抗でリセット回路を組み合わせた書き込み用ボードを作成した。L字型のコネクタを使うことで、直接ブレッドボードにさせるのを狙ったが、微妙にスペースが足りずに干渉しやすいことが判ったので、延長ケーブルでつないでいる。&lt;/div&gt;&lt;div&gt;こちらに関してはのちほど別の記事でお伝えしようとおもう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;arduinoも思ったよりも簡単に作ることが出来たので、これでパソコンとの連携が必要ない作品を作る場合はarduinoを使ってもいいかもしれないと思えてきた。パソコンを使う場合で、機能が収まる場合には、arduinoよりもgainerのほうが開発コストが低いと思われるので、gainerの意味がなくなったという訳ではない。とくにgainerの派生物としてAVRと組み合わせた ginger/peper は秀逸で、USBをソフトウェア実装してあるため、USB接続をする先まで考えても、コストが安いことと、実装面積が小さくていいことの２つから便利に使えそうである。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SYArqVY2zOI/AAAAAAAABL8/3RTQ_b93jHQ/s320/R0013903.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5296281168083602658" /&gt;&lt;div&gt;実は先にAtmega168 をつかった Diecimila互換機もブレッドボード上に実装してみた。こちらはマルツで買ったAtmega168と秋月で買った16MHz のセラロック（セラミック発振子）を配線してあるだけでほかは大きな違いはない。高速処理が必要ならばこちらもやってみるといいだろう。ただし、本気で高速処理を考えるならば、普通にAVRGCCをつかってC言語でプログラムをかいたほうがいいのは言うまでももない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4726059496981836655?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4726059496981836655/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4726059496981836655' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4726059496981836655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4726059496981836655'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/01/arduino88.html' title='ブレッドボードで arduino/88'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/SYArqdfkP9I/AAAAAAAABMM/5t2_h_l5yVo/s72-c/R0013976.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5536606681899504061</id><published>2009-01-26T19:24:00.004+09:00</published><updated>2009-01-26T19:34:26.175+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='arduino'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>速報　one chip arduinoを作ってみた</title><content type='html'>&lt;div&gt;ちょっと時間ができたので &lt;a href="http://www.geocities.jp/arduino_diecimila/obaka/project-2/index.html"&gt;one chip arduino&lt;/a&gt;を真似してチップ上に無理矢理実装というのをやってみた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;コンデンサの数を減らし、書き込みはヘッダピンがなくてもブレッドボードでやればいいじゃないかということで、極力パーツを省略することで、さらにパーツの少ないすっきりとしたものが出来上がった。この先は表面実装用のパーツとシール基板を使えば、もっとすっきりしたものが出来上がるだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ビフォーアフターは以下のとおり。&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SX2Q9JUpoWI/AAAAAAAABL0/k5IvKGxQ1R4/s320/R0013956.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5295548117006524770" /&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SX2Q9P9CxKI/AAAAAAAABLs/rrC2vw10m40/s320/R0013959.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5295548118786557090" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;書き込みはこのように、USBシリアルアダプタを使ってブレッドボード上で行うこととした。このシリアルアダプタの話はまた今度しようとおもう。シリアルアダプタの中にリセット用の回路を組んであるので、リセットスイッチを押さなくても書き込みは可能である。&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SX2Q9D1JFFI/AAAAAAAABLk/He3TJ9CQe2w/s320/R0013957.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5295548115532190802" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5536606681899504061?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5536606681899504061/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5536606681899504061' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5536606681899504061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5536606681899504061'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/01/one-chip-arduino.html' title='速報　one chip arduinoを作ってみた'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZFlW0NdMJdk/SX2Q9JUpoWI/AAAAAAAABL0/k5IvKGxQ1R4/s72-c/R0013956.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5938861604869874214</id><published>2009-01-26T14:01:00.004+09:00</published><updated>2009-01-26T14:17:06.805+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>LEGO Duplo をケースに</title><content type='html'>&lt;div&gt;携帯モノの工作をしたときには、そのケースに苦労することが多い。今回は本業で作っているzigbeeの携帯用ノードであるが、ちょうどいいケースを探していたときに 赤ちゃんむけのLego であるdupro シリーズがちょうどいいんでは？と思い当たり、試してみた。残念ながらレゴは単品売りが行われていないので、一番安くて普通のブロックが沢山入ってそうなものということで、緑のバケツというのを購入した。この中には通常サイズのブロックのほかに動物や人&lt;/div&gt;&lt;div&gt;形、車といったパーツが入っていたが、こちらは今回の用途には役に立たないので、最近激務な同僚の先生のお子さんに差し上げることにして、通常の８つ突起のあるブロックをそのまま削り込むことにした。&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SX1HHfLpfsI/AAAAAAAABLc/yQAwa7-kT7Y/s320/R0013941.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5295466930812583618" /&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SX1FvmMKOnI/AAAAAAAABLE/Av5KmZm2Hoo/s320/R0013911.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5295465420865288818" /&gt;&lt;div&gt;結果はこのように、あつらえたように申し分のないサイズとなった。今回の用途では大満足だ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;レゴの内側には噛み合わせのための形状がモールドされている。もちろん、中にモノを詰め込むためにはこのモールドは邪魔になるので切り刻むしかない。カッターとペンチと電動リュータを駆使して中身をくりぬいたところがこちら。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ブロックの内側の構造にカッターで切れ目をいれ、出来る限りペンチでもぎ取る。残った部分はリュータを使って削りこんでいって完成だ。レゴの素材はやわらかく、熱に強いので、ゆっくりカッターやリュータをつかえば思ったよりは簡単に削り込めるし、割れる心配もほとんどない。Oリングをつけるための金具はピンバイスであけた穴を拡張して利用している。こちらの金具はタカチのもので袋には70円と書いてあった。&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SX1FvyoMwdI/AAAAAAAABLM/9gmODpFrbA0/s320/R0013912.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5295465424204120530" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あとは基盤の組み付けの問題は残っているが、現状では電池ケースを接着剤ではりつけ、基盤は電池に対して両面テープでとりつけた。今後はうすい普通サイズのレゴのパーツをつかい蓋をするなどといった案が考えられるだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;レゴを使ったケースは手間とコストはかかるものの見栄えとしても悪くないし、持ち歩きもの、インテリアものにはよいのではないだろうか。次はユニバーサル基板をいれてみようかとおもう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5938861604869874214?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5938861604869874214/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5938861604869874214' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5938861604869874214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5938861604869874214'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2009/01/lego-duplo.html' title='LEGO Duplo をケースに'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZFlW0NdMJdk/SX1HHfLpfsI/AAAAAAAABLc/yQAwa7-kT7Y/s72-c/R0013941.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6618491709858428118</id><published>2008-12-22T17:08:00.002+09:00</published><updated>2008-12-22T17:12:18.941+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='OSX'/><title type='text'>OSX でTCPウインドウ制御</title><content type='html'>&lt;div&gt;ある種の Firewallと MacOSX  の rfc1323実装の相性が悪いらしく、&lt;/div&gt;&lt;div&gt;職場の環境では大きいファイルのダウンロードをやっているとかならずストールしてしまう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そんなとき以下のようにすればいいと教わった。&lt;/div&gt;&lt;div&gt; sudo sysctl -w net.inet.tcp.rfc1323=0&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これを毎回打つのもなんだかなーと思っていたら、 &lt;/div&gt;&lt;div&gt;/etc/sysctl.conf というファイルに以下の１行書いておけばいいらしい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;net.inet.tcp.rfc1323=0&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;実績はリブートしてのお楽しみ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6618491709858428118?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6618491709858428118/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6618491709858428118' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6618491709858428118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6618491709858428118'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/12/osx-tcp.html' title='OSX でTCPウインドウ制御'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-290381111630987139</id><published>2008-12-15T11:17:00.004+09:00</published><updated>2008-12-15T11:23:52.137+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>Gainer の PGA設定</title><content type='html'>&lt;div&gt;Gainer(というよりPSoCの)PGAの倍率設定は0-15を指定すると、それに対応した倍率になる。&lt;/div&gt;&lt;div&gt;これがまた微妙な間隔で、覚えるのも大変なので覚え書きとして書いておく。&lt;/div&gt;&lt;div&gt;6,10,12 あたりが２x、４x、８xとなって判りやすいのでよく使うと思う。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;指定値   倍率        &lt;/div&gt;&lt;div&gt; 0&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1.00&lt;/div&gt;&lt;div&gt; 1&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1.14&lt;/div&gt;&lt;div&gt; 2&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1.33&lt;/div&gt;&lt;div&gt; 3&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1.46&lt;/div&gt;&lt;div&gt; 4&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1.60&lt;/div&gt;&lt;div&gt; 5&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;1.78&lt;/div&gt;&lt;div&gt; 6&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;2.00&lt;/div&gt;&lt;div&gt; 7&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;2.27&lt;/div&gt;&lt;div&gt; 8&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;2.67&lt;/div&gt;&lt;div&gt; 9&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;3.20&lt;/div&gt;&lt;div&gt;10&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;4.00&lt;/div&gt;&lt;div&gt;11&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;5.33&lt;/div&gt;&lt;div&gt;12&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;8.00&lt;/div&gt;&lt;div&gt;13&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;16.0&lt;/div&gt;&lt;div&gt;14&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;24.0&lt;/div&gt;&lt;div&gt;15&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;48.0&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-290381111630987139?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/290381111630987139/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=290381111630987139' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/290381111630987139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/290381111630987139'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/12/gainer-pga.html' title='Gainer の PGA設定'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3026838494349362767</id><published>2008-11-04T21:39:00.004+09:00</published><updated>2008-11-04T21:47:31.865+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>gainer-rubyを NetBSDの箱で動かす</title><content type='html'>&lt;div&gt;&lt;a href="http://8-p.info/gainer-ruby/"&gt;gainer-ruby&lt;/a&gt;は rubyで作られたgainerのライブラリであり、rubyを知っていれば非常に簡単にgainerを使うことが出来るのが特徴だ。GUIを使った作品作りとは異なるが、本blogでも twitterとgainerをつなげるなどのエントリで活躍している。ruby自体にさまざまなライブラリが豊富なので twitterやIMなどとの連携を行いやすく、グラフィカルなインスタレーションではないような用途では非常に重宝する。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;個人的には温度計を接続し、activerecord経由でDBと連携させて一定時間おきにtwitterに投稿するといった使い方をしている。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;個人的なgainer-rubyの問題としては NetBSDをいれた小さい箱で動かなかった点がある。これはシリアルポートのtermiosの設定がうまくいっていないようなので、ここを修正することとした。また、ダウンロードできるgainer-rubyのソースには PGAのゲイン調整のコードが入っていないのでこれも追加したものを作ってみた。動作を確認したNetBSDは 4.0R のi386版である。&lt;/div&gt;&lt;div&gt;PGAのほうは作者にも送ってあるので次のバージョンには反映されるかもしれない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;コードの差分をリンクしておくので、試してみたい方はsvnで checkoutした gainer-ruby にあててみてほしい。PGAのゲインコントロール関数は amp_gain_agnd/amp_gain_dgnd で&lt;a href="http://processing.org"&gt;processing &lt;/a&gt;のライブラリと対応させてある。シリアルポートはtermiosの設定を変更したが、NetBSDの他にOSX(10.5) でも動作することは確認済みである。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://hwhack.patapon.org:16080/wiki/index.php?plugin=attach&amp;amp;pcmd=open&amp;amp;file=netbsd.diff&amp;amp;refer=ruby-gainer"&gt;gainer-ruby用 NetBSD対応、PGAゲイン調整対応のdiff&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これをつかった作品の全容はまた後ほど&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3026838494349362767?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3026838494349362767/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3026838494349362767' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3026838494349362767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3026838494349362767'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/11/gainer-ruby-netbsd.html' title='gainer-rubyを NetBSDの箱で動かす'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6088788815321128751</id><published>2008-10-14T16:49:00.004+09:00</published><updated>2008-10-14T16:57:25.529+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>ベリーショートなACタップ</title><content type='html'>&lt;div&gt;テーブルタップのコードがからまるという問題は、古今東西あらゆる現代人が直面している問題のようで、さまざまなツールや解決案が提案されている。また、別のテーブルタップの問題としてはコンセントの口が少ないということがよくあげられる。総計1500Wの3つ口テーブルタップに、昔なら数百ワットを使うテレビやこたつといったものをつなぐのが普通だったのが、最近ではたった100W以下しか使わないゲーム機やパソコンのACアダプタを数多くつなぎたいという要求のほうが多い。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これを解決するには多口のタップを使うのが簡単だが、そう多いものは売られていない。そのため、タップは基本的にたこ足になってしまうのが一般的だが、その場合には長いコードのやり場に困る。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そこで個人的によくやっているのが、タップのコンセントを短く切断してしまう方法だ。とくにオフィスのデスクの下に転がすタップなどはデスクに磁石で取り付けることもあり、あまり長いと邪魔なだけなので、20cmくらいの長さになるようにコードを切断したものを用意している。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;高級品のタップの場合にはタップ側を分解するとケーブルがねじ留めされているので、その場合にはねじを外して、コードを短く切り、もう一度ねじ止めする。普通のタップの場合には、ケーブルがハンダ付けされていたり分解できないようなネジや、接着といった方法でとめられていたりするのでその場合にはコンセント側を捨てることにして、新しいコンセントの部品をホームセンターで買ってくればいい。このときにコンセントを90度に曲がるものや回転するものなど、自分のさしたい場所にあわせてやるといいだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SPRPvv5C9NI/AAAAAAAAA8g/RZvg26_LlcU/s320/%E3%83%87%E3%82%B9%E3%82%AF%E4%B8%8B.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5256914346776392914" /&gt;&lt;/div&gt;&lt;div&gt;写真は筆者のオフィスのテーブルに張り付いているタップである。真ん中が床下から生えてきているタップでそれを左右２つのタップに分岐して使っている。ただでさえ、イーサネットケーブルと電源ケーブルで混乱している机の下だが、このタップのケーブルが３mもある場合とは雲泥の差であるのは判ってもらえるだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;既製品を切り刻むのは抵抗があるのだろう。簡単にできる割にあまりやった話を聞かないのだが、自分の足下がおどろくほど快適になるのでぜひ試してみてほしい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに切ってしまうと模様替えなどで長いケーブルが必要になると使えないじゃないか！と言う人もいるとおもうが、自分の手元に必要なテーブルタップの口数がかわらない以上は手元まで引っ張るものと手元でバラすものが必要なわけで、大きな問題にならないはずだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6088788815321128751?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6088788815321128751/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6088788815321128751' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6088788815321128751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6088788815321128751'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/10/ac.html' title='ベリーショートなACタップ'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/SPRPvv5C9NI/AAAAAAAAA8g/RZvg26_LlcU/s72-c/%E3%83%87%E3%82%B9%E3%82%AF%E4%B8%8B.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-323068287854131827</id><published>2008-10-01T18:20:00.005+09:00</published><updated>2009-05-11T03:16:21.927+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>passenger(mod_rails) でバーチャルホストを使わない複数アプリケーション動作</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;railsの実行環境としてこの春あたりから話題騒然のpassengerを試してみた。このとき、普通にアプリケーションを立ち上げるのはみんながやっているが複数のアプリケーションをディレクトリで切り替えるというのはあまり見なかったので簡単にまとめておく。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まず、apache + passenger のインストールだが、どこのblogにも書いてあるので省略する。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;passengerのための設定までは終了したとして、この後にそれぞれのアプリケーションを動かすための設定を行う。アプリケーションを動かすために設定しないといけない項目はシンボリックリンクを含めると合計４カ所だ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まず最初にやるべきことはrails のアプリケーションのシンボリックリンクを作ることである。rails アプリケーションそのものが存在するディレクトリはapacheを動かしているユーザで&lt;/div&gt;&lt;div&gt;アクセスできれば、documentrootの中にある必要はないようだ。さすがアプリケーション。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;railsアプリの名前が tasklist だとするとtasklistの中のpublic をシンボリックリンクで&lt;/div&gt;&lt;div&gt;Documentroot内の適当な場所にリンクする。だいたいこんな感じになるだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;cd /WWWROOT/rails/&lt;/div&gt;&lt;div&gt;ln -s /home/name/tasklist/public tasklist &lt;/div&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次に設定するべきところは railsアプリの routingだ。ここでアプリの中でindexを開いたときに動くべきコントローラが taskであり、最初にアクセスされるべきアクションがindexだとして設定をおこなう。ここでは railsのアプリケーションの中の config/route.rb に以下の行を追加する。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&lt;/div&gt;&lt;div&gt;map.connect '', :controller =&gt; "task", :action =&gt; 'index'&lt;/div&gt;&lt;div&gt;--&lt;/div&gt;&lt;div&gt;そして、public内のindex.htmlファイルにアクセスされないように index.htmlを&lt;/div&gt;&lt;div&gt;削除ないし名前変更する必要がある。これをやらないとindex.htmlをアクセスしていつまでたってもアプリケーションにたどり着かないことになってしまう。&lt;/div&gt;&lt;div&gt;これだけの設定でrailsアプリ側の準備ができた。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最後は httpd.confに railsのアプリケーションのrootを伝える設定を書き加える。passenger の設定の下に以下のような行を加えよう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;RailsBaseURI /rails/tasklist&lt;/div&gt;&lt;div&gt;---&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このあと apacheをリスタートした後ブラウザから、 http://hostname/rails/tasklist とアクセスすると無事にアプリケーションが立ち上がっていることが確認できるだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回のポイントはこの最後の操作で、 RailsBaseURI の行を増やすと複数のアプリケーションに対応できるということにある。railsアプリを設定し、シンボリックリンクを作り、httpd.confに RailsBaseURIを書き加えれば、同時に複数のアプリケーションを立ち上げることが可能になる点がポイントだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以上、簡単だが主に自分でまた半年後にやるときの参考になればとおもい記録しておこう。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-323068287854131827?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/323068287854131827/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=323068287854131827' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/323068287854131827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/323068287854131827'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/10/passengermodrails.html' title='passenger(mod_rails) でバーチャルホストを使わない複数アプリケーション動作'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8699549862974205831</id><published>2008-07-08T01:00:00.007+09:00</published><updated>2009-02-12T17:11:23.823+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>gainer clone で「かざぐるま」あるいは PWMによるモーターの駆動 (2)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;前回のあらすじ&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;"&gt;Gainerモジュールにトランジスタアレイでかざぐるまを駆動することに成功したCUE。&lt;br /&gt;しかし、そのモーターからは脳を直撃する怪音が無限に鳴り響く！&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;すこし時間があいてしまったが、前回の最後で述べたとおり、怪音をなくすためにはPWMの周波数を変更するのがもっとも一般的かつ効果的な手法である。しかしながらgainerの配布されているファームウェアでは、PGAのゲインはコマンドで変更できてもPWMの周波数は変更できない。ということで、「Gainerのファームウェアを改造してノイズが出ないモータを実現するぞ」プロジェクトを決行した&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SHI_NWRSweI/AAAAAAAAA64/TCg1WKVs1Uw/s1600-h/screenshot1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SHI_NWRSweI/AAAAAAAAA64/TCg1WKVs1Uw/s200/screenshot1.png" alt="" id="BLOGGER_PHOTO_ID_5220304416624787938" border="0" /&gt;&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;当方ではファームウェアの不具合について感知しないのはもちろん、ファームウェアの焼き込みサービスも行ってないのであしからず。秋月電子などから PSOC miniProg を手に入れて各自で焼き込んでもらいたい。どのように作業したかは以下のとおりである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. ファームウェアの入手&lt;br /&gt;firmware はgainer.cc のページからダウンロードできる。&lt;a href="http://gainer.cc/Download/Download"&gt;以下のページ&lt;/a&gt;からファームウェアの&lt;a href="http://prdownloads.sourceforge.net/gainer/gainer_firmware_src_v1-1-0rc1.zip"&gt;ソースファイルをダウンロード&lt;/a&gt;する。ダウンロードできたらこれを unzipして展開しておく。&lt;br /&gt;&lt;br /&gt;2. ファームウェアの展開&lt;br /&gt;ファームウェアはzipなので適当なツールを使って展開する。このとき置き場所は日本語の入っていないディレクトリでなければ、PSoCデザイナでmakeするときに不具合がでることがあるので注意したほうがよい。僕は C:\ に直接展開したフォルダをそのまま移動した。&lt;br /&gt;&lt;br /&gt;3. 設定画面をながめる&lt;br /&gt;書き換えポイントを探るためにコンフィグとソースをよく見て考える。&lt;br /&gt;config_a にPWMモジュールが8つ発見できたので、これが出力用のPWMに違いないとあたりをつける。そのときに、PWMのクロックをどこからもらってるかを配線からながめると１６ビットのカウンタを使ってブロードキャストバスに信号を流し込み、そのバスの信号をクロックとして使っているということがわかった。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;その後で、ソースコードをかるく読んでみるとまさしく config-a の PWMモジュールの山がそのままPWMとして出力されることがわかる。これでconfig-a のPWMモジュールのクロックを書き換えるという方針が決定した。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 使えそうなクロックを探す&lt;br /&gt;使えそうな clockとして Gainerの生の設定でPSoCモジュールが供給しているのは、24MHzの生クロックのほかこれを分周して作っている VC1,2,3 のそれぞれさらに専用のcounterにより作りだされているもともとのPWMの信号がある。それぞれのクロックはどれくらいの周期かというとPWMでは 256クロックで１周期ということなのでCPUCLK 24MHz が およそ 100KHzとなるがこれはすこし早すぎるようだ。&lt;br /&gt;&lt;br /&gt;VC1は　24/3 = 8MHz VC2は  8/4  = 2MHz であり、これをさらに 1/256したものが周波数になる。よって VC1でおよそ 32KHz VC2では 8KHz となる。超音波領域に突入することが目標なので、 VC1のほうを採用することとした。&lt;br /&gt;&lt;br /&gt;これをそのまま PWMのクロックに入れればいいのだが8つある設定を書き換えるのは大変なので大本となっている PWM用のカウンタであるCounter16に入力することにした。&lt;br /&gt;&lt;br /&gt;このままでは counter16のソースが 8MHzとなったはいいがカウンタをつかってさらにスピードを落としているので、それをカウントしている部分を探すこれはソースコードのほうで発見した。&lt;br /&gt;クロックの比は 1:1 なので226行目(あたり）のところの Counter16_A_PWMClk_WritePeriod(0); を 0に書き換える。これで毎回カウントアップのたびにCounterがあふれているはずだ。&lt;br /&gt;実際のところcounter16など使わなくても、直接配線をVC1に変更しまくればそれでもOKなのだが、その場合には書き換えるポイントが8つになってしまうので、間違い等があると大変である。そこで今回はCounterはそのまま使って、そのカウンタの周期を修正したのである。修正ポイントのコードは以下のとおりである。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SHI-7wAXzaI/AAAAAAAAA6w/qOMi32WrQg4/s1600-h/screenshot.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SHI-7wAXzaI/AAAAAAAAA6w/qOMi32WrQg4/s200/screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5220304114295492002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;--ここから&lt;br /&gt;// start analog outputs&lt;br /&gt;//    Counter16_A_PWMClk_WritePeriod(157);    // 50Hz (i.e. 20ms)&lt;br /&gt;　    Counter16_A_PWMClk_WritePeriod(0);    // 10KHz (i.e. 1ms)&lt;br /&gt;Counter16_A_PWMClk_WriteCompareValue(0);&lt;br /&gt;Counter16_A_PWMClk_Start();&lt;br /&gt;--ここまで&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;この２つをやってからbuild を行う。今回はHitechC のフリー版つかってmakeを行った。Gainer自体はもともとimage-craftのコンパイラで作られていたはずだが、何の問題もなくコンパイルもおわったのでこれを miniprogを使って書き込んで完成である。&lt;br /&gt;&lt;br /&gt;これで動作させればPWMでモータを駆動させても音がならないGainerが完成である。モータが動かなくなるくらい低いPWM値の場合にモータからの異音がしなくなるのがわかるはずだ。&lt;br /&gt;&lt;br /&gt;改変した後のHEXファイルは&lt;a href="http://hwhack.patapon.org/wiki/index.php?plugin=attach&amp;amp;pcmd=open&amp;amp;file=gainer-pwm32k.hex.zip&amp;amp;refer=PSOC"&gt;こちらに&lt;/a&gt;おいておく。そのままmini-progで焼き込めば動くはずだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8699549862974205831?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8699549862974205831/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8699549862974205831' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8699549862974205831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8699549862974205831'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/07/gainer-clone-pwm-2.html' title='gainer clone で「かざぐるま」あるいは PWMによるモーターの駆動 (2)'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/SHI_NWRSweI/AAAAAAAAA64/TCg1WKVs1Uw/s72-c/screenshot1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3609617105300906983</id><published>2008-06-25T12:05:00.015+09:00</published><updated>2008-12-10T21:25:31.778+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>gainer clone で「かざぐるま」あるいは PWMによるモーターの駆動</title><content type='html'>Gainerは設定にもよるが 4ないし8本のアナログ出力(PWM)を使うことが出来る。前に作成した power gainer は電源にもよるがトランジスタアレイにより小型のモータを回転させるには十分な電力を供給することができる。そこで、前からやってみたかったアンビエントディスプレイである「かざぐるま」を作ってみた。&lt;br /&gt;&lt;br /&gt;これは MITのメディアラボで行われているタンジブルコンピューティングの象徴的なアンビエントデバイスの一つである。(詳しくは &lt;a href="http://tangible.media.mit.edu/"&gt;Media LabのTangible Media Group &lt;/a&gt;を参照。)　&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SGG2olDCcJI/AAAAAAAAA5w/YbPf7-yTEY8/s1600-h/R0011279.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SGG2olDCcJI/AAAAAAAAA5w/YbPf7-yTEY8/s200/R0011279.JPG" alt="" id="BLOGGER_PHOTO_ID_5215650651727622290" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SGG2pTPJIAI/AAAAAAAAA54/Cp-L6DB2g7U/s1600-h/R0011280.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SGG2pTPJIAI/AAAAAAAAA54/Cp-L6DB2g7U/s200/R0011280.JPG" alt="" id="BLOGGER_PHOTO_ID_5215650664126423042" border="0" /&gt;&lt;/a&gt;使ったのは前に作成したTD62083をワンボードに組み込んだGainer(Power gainer)とタミヤのプーリー基本キットである。これらをささえる土台となっているのは、100円ショップで買ってきたアクリルのメニュー立てだ。プラスチックのプーリーをゴムベルト（ゴムバンド）で回転させるプーリーキットは回転時に音がほとんどしないので、ギアボックスと違い常時動かしておくアンビエントディスプレイに適している。これに、ケント紙で作った風車を両面テープで貼付けてハードウェアのほうは完成である。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SGG2p2r_2EI/AAAAAAAAA6A/-kYplH0FGFY/s1600-h/R0011282.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SGG2p2r_2EI/AAAAAAAAA6A/-kYplH0FGFY/s200/R0011282.JPG" alt="" id="BLOGGER_PHOTO_ID_5215650673642690626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gainerのconfiguration3ならばPWM出力が8ch仕様ということで作成した風車のセットを同時に8つコントロールできるが、今回はサンプルということもあり１つの風車だけで満足しておくこととする。8ch同時で動かすにはUSBに寄生するだけではなくターゲットボードにACアダプタ等の外部電源が必要だろう。&lt;br /&gt;&lt;br /&gt;このgainerをコントロールするプログラムはまず、テスト用ということで簡単なものを用意した。マウスカーソルを動かすとそれに従ってアナログ値が変化するものだ。これで、ウインドウ上をマウスを左右に動かすだけで回転を変化させることが出来るので動作確認には十分だろう。このプログラムはPWMで動かすデバイスの試験にいつも使っているものでもある。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SGG3MupeuUI/AAAAAAAAA6I/P3ytnE9MvoA/s1600-h/screenshot.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/SGG3MupeuUI/AAAAAAAAA6I/P3ytnE9MvoA/s200/screenshot.jpeg" alt="" id="BLOGGER_PHOTO_ID_5215651272780069186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="320" height="266" class="BLOG_video_class" id="BLOG_video-7cf8d273404548fd" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v10.nonxt2.googlevideo.com/videoplayback?id%3D7cf8d273404548fd%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331523965%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D4454527CFF736E078777F01EDC679D6F16AFCD2A.53EDB49CAEFD57E111EFDC90560EB9720EF8EE31%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D7cf8d273404548fd%26offsetms%3D5000%26itag%3Dw160%26sigh%3DcnOj5rF2i2KUVenOtMXugSCsCbA&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="320" height="266" bgcolor="#FFFFFF"flashvars="flvurl=http://v10.nonxt2.googlevideo.com/videoplayback?id%3D7cf8d273404548fd%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1331523965%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D4454527CFF736E078777F01EDC679D6F16AFCD2A.53EDB49CAEFD57E111EFDC90560EB9720EF8EE31%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3D7cf8d273404548fd%26offsetms%3D5000%26itag%3Dw160%26sigh%3DcnOj5rF2i2KUVenOtMXugSCsCbA&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;以上のように風車は簡単に動くところまではきたのだが、ひとつ大きな問題が残ってしまった。ほとんど動いていないときもピーピーとモーターから音がする。これは Gainerの PWMの周波数が1KHzであるため、 1KHz周期でモータが振動してしまっている音であり、PWMでモータを動かす場合に起きる現象だ。このノイズを解決するためにはモータを駆動するPWMの周期を25KHz以上に上げる方法がよく使われる。こうなると、モーターの振動音が超音波の領域に入るため人間には聞こえなくなるのである。もちろんノイズがなくなるわけではないので、コウモリやイルカには迷惑なのかもしれないが、そこは気にしないことにして、ファームウェアを改造しPWMの周波数を上げる対策をとることとした。&lt;br /&gt;&lt;br /&gt;（つづく）&lt;br /&gt;&lt;br /&gt;PWMテスターのソースコードは以下のとおり。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;----------&lt;br /&gt;import processing.gainer.*;&lt;br /&gt;&lt;br /&gt;Gainer gainer ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  size(500,100) ;&lt;br /&gt;  gainer = new Gainer(this) ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void draw() { &lt;br /&gt;  int i ;&lt;br /&gt;  background(mouseX/4) ;&lt;br /&gt;  &lt;br /&gt;  for ( i = 0; i&lt;500;i+=100) {&lt;br /&gt;    stroke(255,0,0) ;&lt;br /&gt;    line(i ,0,i,100) ;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  gainer.analogOutput(1,mouseX/2) ;&lt;br /&gt;  stroke(0,0,255);&lt;br /&gt;  line(mouseX,0,mouseX,100) ;&lt;br /&gt;  println("NOW: " + mouseX/2  + "*" ) ;&lt;br /&gt;}&lt;br /&gt;----------&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3609617105300906983?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=7cf8d273404548fd&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3609617105300906983/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3609617105300906983' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3609617105300906983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3609617105300906983'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/06/gainer-clone-pwm.html' title='gainer clone で「かざぐるま」あるいは PWMによるモーターの駆動'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/SGG2olDCcJI/AAAAAAAAA5w/YbPf7-yTEY8/s72-c/R0011279.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1917258643983016612</id><published>2008-06-24T19:56:00.005+09:00</published><updated>2008-12-10T21:25:32.133+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>Processingでtwitterと http認証 (basic auth)</title><content type='html'>Processingをつかって、httpをしゃべらせることは難しくはない。ただ通信してページを取ってくるだけならば、loadStrings() の引数にURLを指定してやれば、自動的にJavaのURLクラスを使ってStringsの配列として格納できる。これをつかって、twitterのデータを読み込もうとおもったのだが、twitterではbasic authを使わなければ自分のfriends timelineを取り出すことが出来ない。そこで basic authを processingでやってる例をさがしたのだが、発見できなかったので生のjavaでのbasic authの方法をそのまま取り込んで実現してみた。&lt;br /&gt;&lt;br /&gt;さまざまなページによると javaでのhttp認証では java.net.authenticator とjava.net.PasswordAuthentication の２つのクラスを使い、Authenticator クラスを継承した認証クラスを作ってハンドラを設定する、というのが正解らしい。つまり、以下のようなコードとなるわけだ。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;import java.net.Authenticator;&lt;br /&gt;import java.net.PasswordAuthentication;&lt;br /&gt;&lt;br /&gt;//public&lt;br /&gt;class BasicAuth extends java.net.Authenticator{&lt;br /&gt; private String user;&lt;br /&gt; private String pass;&lt;br /&gt; public BasicAuth(String user, String pass)&lt;br /&gt; {&lt;br /&gt;   this.user = user;&lt;br /&gt;   this.pass = pass;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected PasswordAuthentication getPasswordAuthentication()&lt;br /&gt; {&lt;br /&gt;   return new PasswordAuthentication(user,pass.toCharArray());&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;このクラスの利用方法は、user名とpasswordを設定して作成したクラスのインスタンスを生成し、そのあとで、Authenticator の setDefaultを呼び出す。前処理としてこの作業を行うと以降の http通信で認証が必要とされる場合には設定した情報をベースに自動的に認証が行われる。これをそのまま、processingに追加して使った。Processingは基本的にjavaそのものなので、このような場合の拡張は非常に簡単ですばらしい。&lt;br /&gt;本当はpackage化してライブラリとするといいのだろうがそれはまた今後の課題ということにしておこう。&lt;br /&gt;&lt;br /&gt;さて、現実にtwitterの出力するXMLの解析には、simlpeMLというライブラリを使うことにした。simpleMLはdaniel shiffman(http://www.shiffman.net/) の開発したライブラリであり彼のページからダウンロードできる。loadStrings()を使うよりもよい点は、後で XMLライブラリを使ってエレメントを取り出すよりも簡単なことと thread をつかって非同期にhttpリクエストを発生させて、ページを取得できたときにイベントを発生させることが出来る点である。とくに後者は、一定時間ごとにページを取得して書き換えるような動作を行いたい場合には、非常に有効であろう。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SGDVW2qjPMI/AAAAAAAAA5o/yppRm2FszmA/s1600-h/screenshot3.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SGDVW2qjPMI/AAAAAAAAA5o/yppRm2FszmA/s200/screenshot3.jpeg" alt="" id="BLOGGER_PHOTO_ID_5215402957102857410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;timelineの twitterAPI呼び出しを行うにはBasic認証付きでAPIで定められたURLを呼びだせばよい。受信形式はいろいろ見比べた結果、後処理がもっともやりやすそうなRSS形式を指定した。これらをまとめるとコードは以下のようになる。あとは、数分おきにreloadをするとか、スクロールするとかのフィーチャーを盛り込めば、twitter viewerとしての機能は十分だろう。&lt;br /&gt;ちなみに書き込みは post method が必要なのだが、こちらも processingで使えるモジュールはなさそうなのとすこし複雑な処理が必要そうなのでもう一工夫必要なようなので今後の課題としておこう。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SGDVW6pNgLI/AAAAAAAAA5g/jMYGoAy2HwQ/s1600-h/screenshot2.jpeg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SGDVW6pNgLI/AAAAAAAAA5g/jMYGoAy2HwQ/s200/screenshot2.jpeg" alt="" id="BLOGGER_PHOTO_ID_5215402958170980530" border="0" /&gt;&lt;/a&gt;動作させるためには、フォントを作成する必要がある。Processingのメニューから Tools--&gt;Create Fontを選択すると次のような画面が出るので Osakaフォントの16pointを指定する。日本語表示には日本語のフォントも必要なので All Fontのチェックボックスにもチェックをいれておく必要があるだろう。こうやってフォントを作成した後、コードの中の user と pass を自分のものに入れ替えれば動作させてみることができる。&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;--------------------------------&lt;br /&gt;import simpleML.*;&lt;br /&gt;&lt;br /&gt;import java.net.Authenticator;&lt;br /&gt;import java.net.PasswordAuthentication;&lt;br /&gt;&lt;br /&gt;// configration &lt;br /&gt;String user = "uname" ;&lt;br /&gt;String pass = "xxxxx" ;&lt;br /&gt;&lt;br /&gt;// request url&lt;br /&gt;String url = "http://twitter.com/statuses/friends_timeline.rss" ;&lt;br /&gt;  &lt;br /&gt;//public &lt;br /&gt;class BasicAuth extends java.net.Authenticator{&lt;br /&gt;  private String user;&lt;br /&gt;  private String pass;&lt;br /&gt;  public BasicAuth(String user, String pass)&lt;br /&gt;  {&lt;br /&gt;    this.user = user;&lt;br /&gt;    this.pass = pass;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected PasswordAuthentication getPasswordAuthentication()&lt;br /&gt;  {&lt;br /&gt;    return new PasswordAuthentication(user,pass.toCharArray());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;XMLRequest xmlRequest;&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;  size(screen.width/2,screen.height/2);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  BasicAuth tw_authenticator = new BasicAuth(user, pass);&lt;br /&gt;  Authenticator.setDefault(tw_authenticator);&lt;br /&gt;&lt;br /&gt;  // Creating and starting the request&lt;br /&gt;&lt;br /&gt;  xmlRequest = new XMLRequest(this,url);&lt;br /&gt;  xmlRequest.makeRequest();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void draw() {&lt;br /&gt;  // background(frameCount % 255);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// When the request is complete&lt;br /&gt;void netEvent(XMLRequest ml) {&lt;br /&gt;&lt;br /&gt;  PFont fontA = loadFont("Osaka-16.vlw");&lt;br /&gt;  textFont(fontA, 16);&lt;br /&gt;&lt;br /&gt;  // Retrieving an array of all XML elements inside "&lt;title*&gt;" tags&lt;br /&gt;  String[] titles = ml.getElementArray("title");&lt;br /&gt;&lt;br /&gt;  for (int i = 0; i &lt; titles.length ; i++) {&lt;br /&gt;    println(titles[i].replaceAll("\n",""));&lt;br /&gt;    fill(10*i,0,0) ;&lt;br /&gt;    text( titles[i].replaceAll("\n",""),5,18*(i+1)) ;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------------&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ここまで。&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1917258643983016612?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1917258643983016612/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1917258643983016612' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1917258643983016612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1917258643983016612'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/06/processingtwitter-http-basic-auth.html' title='Processingでtwitterと http認証 (basic auth)'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZFlW0NdMJdk/SGDVW2qjPMI/AAAAAAAAA5o/yppRm2FszmA/s72-c/screenshot3.jpeg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8813458020328361992</id><published>2008-05-22T15:38:00.003+09:00</published><updated>2008-12-10T21:25:32.238+09:00</updated><title type='text'>戦利品</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SDUVdQG4SYI/AAAAAAAAAsw/dRaBpvleFxk/s1600-h/TI.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SDUVdQG4SYI/AAAAAAAAAsw/dRaBpvleFxk/s200/TI.jpg" alt="" id="BLOGGER_PHOTO_ID_5203088536780687746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;昨日のTIのセミナーでもらったお土産。&lt;br /&gt;２．４Gの無線つき MSP430のモジュール。たくさんあると&lt;br /&gt;スター型になれるらしいのですが２個入りでした。残念w&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8813458020328361992?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8813458020328361992/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8813458020328361992' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8813458020328361992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8813458020328361992'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/05/blog-post.html' title='戦利品'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZFlW0NdMJdk/SDUVdQG4SYI/AAAAAAAAAsw/dRaBpvleFxk/s72-c/TI.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4718075249600729837</id><published>2008-05-15T18:11:00.002+09:00</published><updated>2008-05-15T18:27:36.033+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><title type='text'>Xbeeの開発環境</title><content type='html'>東京ビックサイトで5/14-16で行われているESEC2008(組込システム開発技術展）にちょっとだけ用事があったので行ってきた。名前の通り、様々な組込系のボードや技術に関係しているベンダーがいろいろな製品やサービスを展示する展示会なんだが、いくつかのブースでは展示＆会場限定で即売、みたいな事もやっていることがある。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Digiインターナショナルのブースをみてみたら、&lt;a href="http://www.digi-intl.co.jp/digi/wireless/zigbee/dev-kit-zigbee.html"&gt;Xbeeの開発環境&lt;/a&gt;が会場限定で10000円とか書いてあったのでちょっと考えてから買ってしまった。Xbeeのモジュールが５枚と、Xbeeを刺すドーターボードが５枚、電源、ソフトウェアなど一式はいっているお大尽仕様だった。&lt;/div&gt;&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.co.jp/s/c/bin/slideshow.swf" width="288" height="192" flashvars="host=picasaweb.google.co.jp&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.co.jp%2Fdata%2Ffeed%2Fapi%2Fuser%2Fyojiro%2Falbumid%2F5200530652792504321%3Fkind%3Dphoto%26alt%3Drss" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;div&gt;普段は40000円（300USD)くらい。明日までやっているのでほしい人はいいチャンスかも！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4718075249600729837?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4718075249600729837/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4718075249600729837' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4718075249600729837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4718075249600729837'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/05/xbee.html' title='Xbeeの開発環境'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4805025406428268068</id><published>2008-05-13T12:44:00.005+09:00</published><updated>2008-05-13T21:02:39.638+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>OpenBSDでEmobile D02HWを使う(1)</title><content type='html'>縁あってOpenBSDの開発者の人たちと一緒にhackする機会があったので、なにかコントリビューションできることはないかなと考えたところ、OpenBSDの3Gモデムのサポートを拡張することにした。&lt;br /&gt;特にD02HWは、本当の名前はE220といって世界各地で使われているメジャーなモデムなので、これがまともに使えるようになるとうれしい人がそれなりにいるだろうから、ちょうど良い。&lt;br /&gt;&lt;br /&gt;OpenBSDもNetBSDと同様に、FreeBSD由来のUSBサブシステムを採用しているので、usbデバイスドライバは大きな差異は存在しない。NetBSD用につくったuhmodem(4)をそのまま移植するという手もあったのだけど、OpenBSDにはHSDPAモデム用のドライバとしてumsm(4)がすでに存在していたので、それを拡張する形で実装してみることにした。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;umsm(4)（拡張前）&lt;/span&gt;&lt;br /&gt;dev/usb/umsm.c(rev.1.21)を眺めてみると、非常にシンプルなドライバになっていた。具体的に言うと、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;struct ucom_methods umsm_methods = {&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;   NULL,&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;となっていた。struct ucom_methods は、上位ドライバとなるucom(4)のopen/closeなどの各処理におけるデバイス依存コードへの関数ポインタを渡すための構造体なので、この状態ではシリアルに関する処理はucomでのデフォルト動作だけで実行されることを意味している。&lt;br /&gt;&lt;br /&gt;どうしてこれで他のドライバが動作しているのだろうか？と「？？？」と思いながらざっくりとコードを追ってみたところ、シリアルデバイスのinterrupt endpointに関する処理がざっくりと抜け落ちていることに気がついた。単なるin/out endpointを処理するだけなら、確かにucom(4)における特別な処理は必要ないが、モデムで通信を行う際には自分から始めるだけではなく割り込み処理が必要である。&lt;br /&gt;近くにいたOpenBSD開発者に聞いてみたら「おれが使っているE220で昔だれかが作ったパッチで試した見たところ、たしかにPPPまでは張れることもあるがうまく動かなかった。つながるけど切れたり通信できなかったりしてね。それから使ってない」と言われた。さもありなん、ということでinterrupt endpointの処理を拡張するところから始めることにする。D02HW(E220)以外でも役にたつだろう。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;interrupt endpoint処理の追加&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;endpointの割り当て処理はumsm_attach()の中で行われる。data用のbulk in/out endpointしか処理していなかった部分を、以下のように変更する。また、struct umsm_softcにもinterrupt endpoint周りの状態を保持するための変数を拡張しておく。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;  if (UE_GET_DIR(ed-&gt;bEndpointAddress) == UE_DIR_IN &amp;amp;&amp;amp;&lt;br /&gt;       UE_GET_XFERTYPE(ed-&gt;bmAttributes) == UE_INTERRUPT) {&lt;br /&gt;          sc-&gt;sc_intr_number = ed-&gt;bEndpointAddress;&lt;br /&gt;          sc-&gt;sc_isize = UGETW(ed-&gt;wMaxPacketSize);&lt;br /&gt;        DPRINTF(("%s: find interrupt endpoint for %s\n",&lt;br /&gt;                 __func__, sc-&gt;sc_dev.dv_xname));&lt;br /&gt; } else if (UE_GET_DIR(ed-&gt;bEndpointAddress) == UE_DIR_IN &amp;amp;&amp;amp;&lt;br /&gt;               UE_GET_XFERTYPE(ed-&gt;bmAttributes) == UE_BULK)&lt;br /&gt;               uca.bulkin = ed-&gt;bEndpointAddress;&lt;br /&gt;  else if (UE_GET_DIR(ed-&gt;bEndpointAddress) == UE_DIR_OUT &amp;amp;&amp;amp;&lt;br /&gt;             UE_GET_XFERTYPE(ed-&gt;bmAttributes) == UE_BULK)&lt;br /&gt;                  uca.bulkout = ed-&gt;bEndpointAddress;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;これで、interrupt endpointを持っているinterfaceがあったら、interrupt endpointを正しく扱うための準備ができる。&lt;br /&gt;&lt;br /&gt;次に、ucomをopenしたときに検出したinterrupt endpointをucom割り込みとして利用するためのコードを追加しなければならない。まずucomをopenしたときにusb的にinterrupt endpointを登録するコード(usbd_open_pipe_intr()を呼ぶ）と、closeしたときに後始末(usbd_about_pipe() &amp;amp; usbd_close_pipe()を呼ぶ）をするデバイス依存の関数を追加する。それぞれubsa(4)から持ってきて、umsm_open(), umsm_close()ということにしておく。ucomがopen/closeされるタイミングで呼ばれるデバイス依存関数は、前述のstruct ucom_methodsで指定しておけばよい。&lt;br /&gt;&lt;br /&gt;さらに割り込み発生時に呼び出されるデバイス依存関数とその補助関数として、同じくubsa(4)からumsm_intr(), umsm_get_status()を持ってくる。同様にstruct ucom_methodsに指定する。&lt;br /&gt;&lt;br /&gt;これで、interrupt endpoint周りの処理は完了。普通のHSDPAモデムのDoCoMo A2502をつなげて試してPPPセッションが正しく張れるようになっていることを確認。とりあえずここまでで半分くらい終了。&lt;br /&gt;&lt;br /&gt;ここまでのコードの差分は、&lt;a href="http://www.openbsd.org/cgi-bin/cvsweb/src/sys/dev/usb/umsm.c.diff?r1=1.22&amp;amp;r2=1.23&amp;amp;sortby=date&amp;amp;f=h"&gt;OpenBSD CVSweb&lt;/a&gt;で確認できる。&lt;br /&gt;&lt;br /&gt;次回のエントリーでは、D02HWのモード遷移のための関数の統合について書く予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4805025406428268068?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4805025406428268068/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4805025406428268068' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4805025406428268068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4805025406428268068'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/05/openbsdemobile-d02hw1.html' title='OpenBSDでEmobile D02HWを使う(1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2377419235520635777</id><published>2008-05-12T21:25:00.003+09:00</published><updated>2008-12-10T21:25:32.430+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>背の低いUSBシリアル</title><content type='html'>&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/SCg3tHWSpKI/AAAAAAAAAmo/Kc8WT9o6fdE/s200/R0010947.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5199467018005423266" /&gt;ということで、ジャンパピンがでっぱってケースに入らないことがあるので、&lt;div&gt;ピンをはがしてワイヤハンダ付けして結線しなおし。&lt;/div&gt;&lt;div&gt;どうせ、設定決めたらいじらないし。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最近どうもコネタばかりだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2377419235520635777?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2377419235520635777/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2377419235520635777' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2377419235520635777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2377419235520635777'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/05/usb.html' title='背の低いUSBシリアル'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZFlW0NdMJdk/SCg3tHWSpKI/AAAAAAAAAmo/Kc8WT9o6fdE/s72-c/R0010947.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-329332541310752545</id><published>2008-04-28T21:43:00.007+09:00</published><updated>2008-12-10T21:25:32.907+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>PSoC書き込み器またまたあらわる</title><content type='html'>&lt;div&gt;何度でもやるぞというくらいこのblogで出てくるネタとしてPSoCの書き込み方法がある。　mini-eval の丸ピンソケットをZIFにしてやれば書き込み器として使えるよねというアイデアは多くの人が提唱しているところではあるが、検索してみるとそれほど難しくなさそうだったのでやってみた。&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/SBXM0sqcksI/AAAAAAAAAjI/d7wgjKsf2TI/s200/R0010278.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5194282950956192450" /&gt;&lt;/div&gt;&lt;div&gt;簡単にいえば、秋月の28ピンZIFソケットをバラして、細いほうに組み直すという作業を行えばよい。ソケットをよく裏をみると内側にも２列穴があいていることに気づくはずだ。こちらにあわせてやればよいのだが、ソケットはナットではなくピンでとまっているのでこじあけなければならない。先の細い精密ドライバか割り箸のようなものをあてて、上からプラスチックハンマーで叩いてピンを外す。これで組み替えができるようになるので金具を左右いれかえてやる。そうすれば、無事に内側の穴から足のはえたZIFソケットができあがる。次の難関はどうやって元にもどすかだが、筒状のおさえがあれば、リングをささえて押し込むことが出来る。私が使ったのはノベルティのボールペンの先っぽ部分。分解して軸のほうの先をあて、穴のあいたところにピンの軸が入るようにしてやり、上からやはりプラハンで叩いて押し込む。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/SBXNW8qcktI/AAAAAAAAAjQ/cnfNDe9f2SM/s200/R0010279.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5194283539366712018" /&gt;&lt;div&gt;これで無事もとどおりになって、しかもスリム28pinのソケットに入るZIFが出来上がる。注意点としては、組み替えるときに上下逆さまではなく、金具を左右をいれかえなければひっかかりができずに使えないということだろう。参考となるページは多数あるようなので、詳しい写真などは他の人のブログを参考にして試してみればよいとおもう。これにより、先に書き込む中身が決まっているPSoCならストレスなしに書き込みが行える。簡単にいえばGainer互換チップを作るのに非常に重宝したというわけだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-329332541310752545?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/329332541310752545/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=329332541310752545' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/329332541310752545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/329332541310752545'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/04/psoc.html' title='PSoC書き込み器またまたあらわる'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZFlW0NdMJdk/SBXM0sqcksI/AAAAAAAAAjI/d7wgjKsf2TI/s72-c/R0010278.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5715911959517546549</id><published>2008-04-12T18:58:00.004+09:00</published><updated>2008-04-12T19:02:42.057+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><title type='text'>100ccで100g (転載というか移動）</title><content type='html'>&lt;div&gt;知人がやっていたデジカメ連射があまりにも面白かったので、新しいデジカメとして EXILIM Z1080というすこし型落ちのモデルを手に入れた。連射性能と値段を考慮するとこれがベストの選択だろうということだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;それまでは借り物の Cybershot DSC-T9という薄型ででっぱらないレンズのカメラを使っていたので最初の印象は「分厚いな」であり、手に持つと「軽いな」であった。二つをはかりにのせてみるとどちらもメモリとバッテリをいれて153gと159g だったので体感できるほどの差があるとは思えない。この差はなんだ？と思って思い出したのが10年以上前の学生時代に先生から聞いた一言だった。曰く「携帯電話ってのは 100g 100cc というのが一つの目標なんだよ」という言葉である。人間の体はほとんどが水分なので比重が１に達すると持ったときの違和感が薄れるということだそうだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;この言葉を思い出してから、カタログを見ながら電卓をたたいてみるとまさにその通りの結果であった。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Casio Z1080  125cc 153g に対して Sony DSC-T9 は 159gで 85cc しかない。凝縮されている分だけ重く感じてしまうわけだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;同じことを、以前使っていたレッツノートYシリーズから macbook air にかえたときにも思ったので、こちらも電卓をたたいてみることにした。ちなみに、重いと感じる macbook air が 1370g に対してLets note Y7 は 1510g なので140g すなわちケータイ１個分くらいはairのほうが軽い。それでもairを持った後にYを持つと「軽い！」と思う。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;計算結果はというと macbook air はもっとも厚い部分がそのままスクエアで角をおとしていないという想定でもおよそ 1400ccであり、実質丸みをおびた分で8割程度しかないのではないだろうかと思われる。こうなると比重として 1をすこし超える程度となる。ある意味、重さと体積の黄金比でもあるわけで持ちあるくという意味での十分な比率にはなっていると思う。これに対して、レッツノートは十分に分厚い筐体のためか、最薄部分で考えても2100cc と、700ccも多く、比重を計算すると0.7程度と１を大きく下回っている。これが軽さを感じさせる理由であることは間違いなさそうだ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;重さを感じるのは最終的には脳なので、見た目も重さのうちということがよくわかる計算結果となった。それにしても、まだアナログ携帯電話の時代から比重の重要性を実感していた人たちはすごい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;--&lt;/div&gt;&lt;div&gt;(もともと別のblogに書いたものですが転載しました。)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5715911959517546549?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5715911959517546549/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5715911959517546549' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5715911959517546549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5715911959517546549'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/04/100cc100g.html' title='100ccで100g (転載というか移動）'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1978047162627084185</id><published>2008-04-11T21:04:00.006+09:00</published><updated>2008-12-10T21:25:33.934+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>Power Gainer 　(またまたGainer 互換機)</title><content type='html'>&lt;div&gt;Gainerを使ってブレッドボードで作品をつくると作品をブレッドボードのまま保存しないといけない。しかしながら、ブレッドボードだとパーツはともかく、配線がもげたりして、動かなくなりがちである。1作品に１個gainerを消費するのは耐えられないという貧乏性なのもありサーボのときもユニバーサル基板で簡単な回路を起こしたが、今度はトランジスタアレイを駆動することにしたボードを作ってみた。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;このトランジスタアレイつきGainerならば小型モータくらいならそのまま動かすことができるので、power gainer と名付けてみた。こうやって作ってみた基板がこちら。これをコンフィグレーション３、４を使えば8ポートのアナログ出力をトランジスタでドライブした形で使うことができる。シンクドライバなのだが、論理の反転はトランジスタアレイがやるのでそのまま出力すれば問題なく、出力を変化させることができる。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;実際には多チャンネルを外部から同時に利用するためには、トランジスタアレイに別途電源を用意しなければ、USB給電の限界が先にくることになるとはおもう。何に使うかはまだ決めていないが、最近のマイブームでは振動モータが熱いのでそれをPWMで複数駆動してみる予定である。&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/R_9UGEO85iI/AAAAAAAAAGE/EMQ5OpF-zXU/s200/PWgainer1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5187957758946502178" /&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R_9UX0O85jI/AAAAAAAAAGM/9kaV0lGDCGI/s200/PWgainer2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5187958063889180210" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1978047162627084185?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1978047162627084185/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1978047162627084185' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1978047162627084185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1978047162627084185'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/04/power-gainer-gainer.html' title='Power Gainer 　(またまたGainer 互換機)'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ZFlW0NdMJdk/R_9UGEO85iI/AAAAAAAAAGE/EMQ5OpF-zXU/s72-c/PWgainer1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-236579527373884328</id><published>2008-04-11T01:34:00.009+09:00</published><updated>2008-12-10T21:25:34.241+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>Gainerとrubyとtwitter　（あるいはタンジブルなtwitter)</title><content type='html'>&lt;div&gt;Gainerをコントロールするためのライブラリを探すと processingや Flashといった作者から提供されているものだけではないさまざまなライブラリが存在する。その中でも個人的に普段使う言語である&lt;a href="http://8-p.info/gainer-ruby/"&gt;rubyのライブラリ&lt;/a&gt;を発見したので、それを使ってみることにした。gainerでよく使っていたprocessingは基本的にディスプレイと一体化しているのでデーモンを作るのは困難であるが（とおもう）rubyならば簡単にバックグラウンドタスクで動かすことが出来る。さらにrubyの他のライブラリと同時に使うことでさまざまな処理を簡単に行うことができることも&lt;/div&gt;&lt;div&gt;、processingとの違いであろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;processingを使うとグラフィックを簡単に表示できるので画面をつかったインタラクションを作るのには非常に向いているのであるが、今回のようなネットワークをつかったフロントエンドで、画面を必要としないようなものの場合には、rubyのほうがよいであろう。さらに、 C++のライブラリというのも見つけたので、組み込みマシンを使うならばそちらのほうがいいかもしれない。恐るべしgainer。&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R_5DakO85gI/AAAAAAAAAF0/V3MCgdNXpj0/s200/twbutton1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5187657944459437570" /&gt;&lt;/div&gt;&lt;div&gt;まあ、それはおいといて作ったものがこれ。ボタンをおすと twitterに「コーヒー飲みたい」みたいなメッセージを書き込む。ボタン２はランダムにfollowerを選択して「スゲー」と書き込む。&lt;/div&gt;&lt;div&gt;ruby-twitter のライブラリと &lt;a href="http://8-p.info/gainer-ruby/"&gt;gaine&lt;/a&gt;&lt;a href="http://8-p.info/gainer-ruby/"&gt;r-ruby&lt;/a&gt;のおかげでとても簡単に書き上がった。回路はブレッドボードの上につくったがコンフィグレーション１のまま Din の4ポートにスイッチをつないだだけである。&lt;/div&gt;&lt;div&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_ZFlW0NdMJdk/R_5EAUO85hI/AAAAAAAAAF8/OfJkWc5xU-4/s200/c1eae00d1a6908b4a5063bc053911c6d.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5187658592999499282" /&gt;&lt;/div&gt;&lt;div&gt;一度かきこんだら1分以上たたないと書き込まないといった処理は追加してボタンの押し過ぎに対応しておく。こうやっておかないと無限にボタンを押して大変なことになることがある。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これだと単なるキーボードでよさそうだが、このままスイッチを人感センサーに変更すれば「部屋にひとがきた！」みたいなことをしゃべるtwitterを作ることも簡単だ。もちろん、コードを修正してアナログの入力をつかえば「部屋があついです」とかもね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回のコードは以下のとおり。動作環境は intel imac の leopard 上でデフォルトのrubyを使っている。gem で twitter (twitter4rではない) と gainer-ruby をインストールしておく必要があるので試してみる前にお忘れなく。ちなみに twitterは gemでそのまま入るが、 gainer-rubyは URLを指定してやる必要がある。&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;#&lt;br /&gt;# Twitter Button&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;&lt;br /&gt;gem 'twitter'&lt;br /&gt;require 'twitter'&lt;br /&gt;gem 'gainer'&lt;br /&gt;require 'gainer'&lt;br /&gt;&lt;br /&gt;## setting for User account&lt;br /&gt;id = "UserName"&lt;br /&gt;pass = "password"&lt;br /&gt;&lt;br /&gt;tc0 = Time.now - 80&lt;br /&gt;tc1 = tc0&lt;br /&gt;tc2 = tc0&lt;br /&gt;tc3 = tc0&lt;br /&gt;tcb = tc0&lt;br /&gt;&lt;br /&gt;twit = Twitter::Base.new(id,pass)&lt;br /&gt;gainer = Gainer::Serial.new(ARGV.shift)&lt;br /&gt;&lt;br /&gt;puts "Ready.\n waiting buttun..."&lt;br /&gt;&lt;br /&gt;gainer.on_pressed = proc do&lt;br /&gt; puts 'Button pressed'&lt;br /&gt; if (Time.now - tcb &gt; 60 ) then&lt;br /&gt;   tcb = Time.now&lt;br /&gt;   fri = twit.followers()&lt;br /&gt;   fnum = fri.size&lt;br /&gt;   friend = fri[rand(fnum)].screen_name&lt;br /&gt;&lt;br /&gt;   puts "#{friend}  SUGOI..."&lt;br /&gt;   twit.update("@#{friend} スゲー!w by XXX ")&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;loop do&lt;br /&gt; sleep(0.1)&lt;br /&gt; gainer.peek_digital_input&lt;br /&gt;&lt;br /&gt; case gainer.digital_input[0]&lt;br /&gt;   when 1&lt;br /&gt;     puts "GET 1"&lt;br /&gt;     if (Time.now - tc0 &gt; 60 ) then&lt;br /&gt;       tc0 = Time.now&lt;br /&gt;       puts "Give me COFFEE..."&lt;br /&gt;       twit.update("珈琲プリーズ だれかプリーズ")&lt;br /&gt;     end&lt;br /&gt;   when 2&lt;br /&gt;     puts "GET 2"&lt;br /&gt;     if (Time.now - tc1 &gt; 60 ) then&lt;br /&gt;       tc1 = Time.now&lt;br /&gt;#        fri = twit.friends()&lt;br /&gt;       fri = twit.followers()&lt;br /&gt;       fnum = fri.size&lt;br /&gt;       friend = fri[rand(fnum)].screen_name&lt;br /&gt;&lt;br /&gt;       puts "#{friend}  SUGOI..."&lt;br /&gt;       twit.update("@#{friend} スゲーョ!")&lt;br /&gt;     end&lt;br /&gt;   when 4&lt;br /&gt;     puts "GET 3"&lt;br /&gt;     if (Time.now - tc2 &gt; 60 ) then&lt;br /&gt;       tc2 = Time.now&lt;br /&gt;       puts "I'm Sleepy..."&lt;br /&gt;       twit.update("ねむい中")&lt;br /&gt;     end&lt;br /&gt;   when 8&lt;br /&gt;     puts "GET 4"&lt;br /&gt;     if (Time.now - tc3 &gt; 60 ) then&lt;br /&gt;       tc3 = Time.now&lt;br /&gt;       puts "Give me FOOODDDD..."&lt;br /&gt;       twit.update("はらへり、ヘリハラ")&lt;br /&gt;     end&lt;br /&gt;   else&lt;br /&gt;   ##      puts "NODATA"&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-236579527373884328?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/236579527373884328/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=236579527373884328' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/236579527373884328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/236579527373884328'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/04/gainerrubytwitter-gainer-processing.html' title='Gainerとrubyとtwitter　（あるいはタンジブルなtwitter)'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/R_5DakO85gI/AAAAAAAAAF0/V3MCgdNXpj0/s72-c/twbutton1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6813038689791254135</id><published>2008-03-31T23:52:00.003+09:00</published><updated>2008-12-10T21:25:34.436+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>gainer clone (互換機）でサーボを動かす</title><content type='html'>LEDばかりでは面白くないのでgainer を使ってラジコン用のサーボを動かしてみることにした。このサーボモータはもともとはラジコン自動車、飛行機などでつかわれていたが、最近ではロボコンブームのおかげでその基幹パーツとして多種大量に供給されるようになってきている。&lt;br /&gt;&lt;br /&gt;一般的なラジコン用サーボモータはアナログのPWM信号によって移動角を制御している。基準として 1msecから2msecのパルス幅を投入すると、その幅に応じた角度にサーボモータの軸が回転する。これを周期的に与えてやることでその角度を維持したり、動作角度を変更したりすることが出来る。ロボットの場合には、この周期をどこまで早められるか、応答速度や、トルクといったメカトロてきな要素が非常に重要になるのだが、インタラクションデザインのためのサーボにはそこまでの精度は要求されないのが一般的だ。今回はgainerのアナログ出力が実際には電圧変化ではなく、PWM信号を用いていることを利用し、サーボモータの駆動を試してみることとする。&lt;br /&gt;&lt;br /&gt;アナログサーボには個体差があるので、両端のぎりぎりの部分を使うためには、それぞれのサーボに応じたパルス幅を調べる必要がある。Aout(0) にサーボの信号線を繋ぎ込んで利用する前提で作成したコードは以下のとおり。&lt;br /&gt;　&lt;br /&gt;コントロールなしのダイアモンドカーソルでサーボの稼働角を調整できる。 E/X で 5ステップづつS/D で1ステップずつの稼働となっている。&lt;br /&gt;&lt;br /&gt;コンソールに現在の数字が出るので幅を記録していこう。一般的な安いサーボモータは最大と最小で180度前後の回転角を得ることができる。Analogoutが最大で8ch までとることが出来るので、8個のサーボなら同時に動かすことが出来るはずだ。ただしその場合には、電力が足りなくなると思われるので、サーボ駆動の電源を別途用意する必要があるだろう。&lt;br /&gt;&lt;br /&gt;手元のサーボで試し&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R_smnBB5CnI/AAAAAAAAAFs/GzPWVhdn8TE/s200/CIMG0734.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5186781847580379762" /&gt;たところパルス幅が 8から30程度ということで 180度を20分割程度にはできるようだ。回転角がシビアな用途でない、見せるための作品であれば十分に実用的な範囲だと考えられる。&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;&lt;br /&gt;import processing.gainer.*;&lt;br /&gt;Gainer gainer ;&lt;br /&gt;int i ;&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt; gainer = new Gainer(this) ;&lt;br /&gt; frameRate(5) ;&lt;br /&gt; i = 20 ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void keyPressed() {&lt;br /&gt;&lt;br /&gt; switch(key) {  &lt;br /&gt;   case 'x':&lt;br /&gt;     i -=5 ;&lt;br /&gt;     break ;&lt;br /&gt;    &lt;br /&gt;   case 'e':&lt;br /&gt;     i +=5 ;&lt;br /&gt;     break ;&lt;br /&gt;    &lt;br /&gt;   case 's':&lt;br /&gt;     i -- ;&lt;br /&gt;     break ;&lt;br /&gt;    &lt;br /&gt;   case 'd':&lt;br /&gt;     i ++ ;&lt;br /&gt;     break ;&lt;br /&gt;   default:&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void draw() {&lt;br /&gt;  gainer.analogOutput(0,i) ;&lt;br /&gt;   println("NOW: " + i + "..." ) ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6813038689791254135?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6813038689791254135/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6813038689791254135' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6813038689791254135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6813038689791254135'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/03/gainer-clone.html' title='gainer clone (互換機）でサーボを動かす'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/R_smnBB5CnI/AAAAAAAAAFs/GzPWVhdn8TE/s72-c/CIMG0734.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2848148395688704107</id><published>2008-03-12T19:49:00.002+09:00</published><updated>2008-03-12T19:59:09.148+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>Gainer Clone でwebcamを操作する</title><content type='html'>前回はハードウェアをブレッドボード上にならべて満足したので次は簡単な実装としてgainer備え付けのボタンを押すとシャッターが切れてwebcamから写真がとれる、というものをつくってみた。基本的にはボタンだけでは面白くないがこのボタンを光電センサやドアの開け閉めに連動させればパソコンのキーボードを押してwebcamを操るのとは違うことができるはずだ。単純にボタンだけであっても長いUSBケーブルさえ用意すれば、レリーズのように遠隔でシャッターをおすことも可能だ。玄関のドアやブースの外側といったところにカメラをむけてセンサーをおけば、監視カメラとしての役割くらいは十分にこなせる。&lt;br /&gt;&lt;br /&gt;コードは非常に簡単で写真を撮るためのcaptureオブジェクトの read をボタンが押されたときのハンドラに登録し画面に表示するだけだ。ほとんど何の処理もしていないが、サンプルコードは以下に示す。撮られた画像は画面に表示するだけなので、セーブが必要ならばそのようなルーチンを書き足す必要がある。&lt;br /&gt;動作確認は OSX10.5 で内蔵の isight をつかって行った。カメラとgainerがうごけばwindowsでも動作するだろう。&lt;br /&gt;&lt;br /&gt;この発展であるセンサーのアナログ値を使ったカメラの駆動はまた後ほどということで。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/*&lt;br /&gt;  capture by button &lt;br /&gt; &lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;import processing.gainer.*;&lt;br /&gt;import processing.video.*;&lt;br /&gt;&lt;br /&gt;Gainer gainer ;&lt;br /&gt;Capture cam ;&lt;br /&gt;&lt;br /&gt;void setup() {&lt;br /&gt;&lt;br /&gt;  size(320,240) ;&lt;br /&gt;  frameRate(24) ;&lt;br /&gt;  background(0) ;&lt;br /&gt; &lt;br /&gt;  cam = new Capture(this,320,240) ;&lt;br /&gt;  gainer = new Gainer(this) ;&lt;br /&gt;  delay(100) ;&lt;br /&gt;  cam.read() ;&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void draw() {&lt;br /&gt;&lt;br /&gt;  if ( gainer.buttonPressed ) {&lt;br /&gt;    cam.read() ;&lt;br /&gt;  }&lt;br /&gt;    image(cam,0,0) ;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2848148395688704107?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2848148395688704107/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2848148395688704107' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2848148395688704107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2848148395688704107'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/03/gainer-clone-webcam.html' title='Gainer Clone でwebcamを操作する'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6963101275159965237</id><published>2008-02-28T00:45:00.005+09:00</published><updated>2008-12-10T21:25:34.587+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><category scheme='http://www.blogger.com/atom/ns#' term='gainer'/><title type='text'>Gainer clone  on BreadBoard</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R8WGGQrIzAI/AAAAAAAAAFA/cBkUuhoC_Ok/s1600-h/d9169bc41dafb26b446c3fa0c31d12dc.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R8WGGQrIzAI/AAAAAAAAAFA/cBkUuhoC_Ok/s200/d9169bc41dafb26b446c3fa0c31d12dc.png" alt="" id="BLOGGER_PHOTO_ID_5171687189218118658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;基板をつくる前にはブレッドボードである程度試作するのが最近の一般的な？流儀だとおもうが、ブレッドボード遊びに興じてしまったのでそちらの結果を先に。&lt;br /&gt;&lt;br /&gt;PSoC を使った製品といえば、 iPod やGameboy microが有名だが、PSoCを使った「作品」となると &lt;a href="http://gainer.cc/"&gt;gainer &lt;/a&gt;だろう。gainerはメディアアーティストのためのフィジカルコンピューティングデバイスとして設計されており、 Processing Flash MAX/MSPといった作品作りによく使われる環境に適応するためのライブラリが提供されており、親和性が非常に高い。&lt;br /&gt;&lt;br /&gt;このキット オープンソースなHWであるが、焼かれた基板にパーツをつけて8500円という価格で売られている。8500円という値段は、ほとんど&lt;a href="http://www.triggerdevice.com/items/detail-00000012.html"&gt;手作りに近い状態で作られて会社で売られる&lt;/a&gt;にはまっとうな値段だと思うが、ちょっと一瞬遊んでみるには一瞬躊躇する値段かもしれない。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;どうせブレッドボードで使うのなら、最初っからパーツをブレッドボード上にくんでしまったら安上がりでは？とおもったので手持ちのパーツを使ってやってみた。回路図を見る限り USB-UARTに PSoCがつながれて、 LEDとSwitchが１つづつオマケにつながっているだけだ。LEDはアクティブハイにドライブされており、SWは内部 pulldownでVCCに直結されている。回路図をみながらとりあえずそのままボード上で再現してみた。&lt;br /&gt;&lt;br /&gt;なにも難しいところはないけど、パズルのように配線をおこなって、まあ、これでいいんじゃないか？というところまではたどりついたので晒しておこうとおもう。&lt;br /&gt;&lt;br /&gt;モジュールが秋月なのですべて秋月電子でそろえるとして、トータルコストとしては、&lt;br /&gt;AKI-UM232R  950円&lt;br /&gt;CY8C29466   500円&lt;br /&gt;ブレッドボード EIC-102BJ  700円&lt;br /&gt;&lt;br /&gt;とまあブレッドボードをいれても２０００円強といったところ。&lt;br /&gt;&lt;br /&gt;ブレッドボードには余分があるのでこの上に簡単な回路なら足すことはもちろん可能だ。そのためにベースは片側に寄せてくみ上げてある。&lt;br /&gt;&lt;br /&gt;互換とするにはさらに電流制限抵抗とLEDとタクトスイッチが必要だが、電子工作をするものならこれくらいはパーツ箱から出てくるであろうということで、コストには加算していない。&lt;br /&gt;&lt;br /&gt;これで合計2150円である。PSoCライターがない場合は PSOCのライターであるCY3210-MiniProg1 4000円が必要となるが、この場合にはminiprogにサンプルとして29466がついてくる。&lt;br /&gt;&lt;br /&gt;とりあえずサンプルプログラムが動いたので、満足して作品として完成させるのはまた次回ということで。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6963101275159965237?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6963101275159965237/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6963101275159965237' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6963101275159965237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6963101275159965237'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/gainer-clone-on-breadboard.html' title='Gainer clone  on BreadBoard'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_ZFlW0NdMJdk/R8WGGQrIzAI/AAAAAAAAAFA/cBkUuhoC_Ok/s72-c/d9169bc41dafb26b446c3fa0c31d12dc.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1844942279184347755</id><published>2008-02-27T00:08:00.003+09:00</published><updated>2008-02-27T00:31:08.257+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DoCoMo'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>（メモ）DoCoMo A2502の制御ポートアクセス</title><content type='html'>ずいぶん間があいてしまったけど「&lt;a href="http://hwhack.blogspot.com/2008/02/netbsddocomo-a2502.html"&gt;NetBSDでDoCoMo A2502をつかう&lt;/a&gt;」の続き。&lt;br /&gt;&lt;br /&gt;DoCoMoのA2502は、正しくアタッチするとシリアルポートが３本生成される、ということは前回のエントリーで書いた。最初の一本は通信するためのモデムポートだが、残りの２本は通信以外に利用されている。&lt;br /&gt;&lt;br /&gt;３本目のシリアルポートは通信制御や各種情報を取得するために利用されているようなので、少し中身を見ていたが、まとまったのでメモとしてここに書いておくことにする。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;３本目のシリアルポートの使い方&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;D02HWなどと違って、atコマンドを受理したりはしてくれない。バイナリを送るとバイナリで返事をくれる、という仕様になっているようだ。（コマンドを全部解析したわけではないが、とりあえずアンテナレベルの取得くらいははできる。）&lt;br /&gt;&lt;br /&gt;処理シーケンス&lt;br /&gt;&lt;ul&gt;&lt;li&gt;シリアルポートをオープンする&lt;/li&gt;&lt;li&gt;｛0xcf, 0x18, 0x00, 0xc0, 0xdd, 0x7e｝を書き込む。&lt;/li&gt;&lt;li&gt;12バイトの返事がくるので読む（解析していない）&lt;/li&gt;&lt;li&gt;｛0xcf, 0x00, 0x00, 0x91, 0x86, 0x7e｝を書き込む&lt;/li&gt;&lt;li&gt;14バイトの返事がくるので読む（解析していない）&lt;/li&gt;&lt;/ul&gt;ここまでで準備はおしまい。その後に適切なコマンドを送ると、いろいろな情報を取れる。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;｛0xcf, 0x07, 0x00, 0x99, 0xcb, 0x7e｝を送ると、自分の電話番号などが含まれた51バイトの情報が返ってくる。（電話番号は5から16バイトの間）&lt;/li&gt;&lt;li&gt;｛0xcf, 0x01, 0x00, 0x49, 0x9f, 0x7e｝を送ると、シグナルレベルや、つながっているネットワークのIDが含まれた58バイトの情報が返ってくる（シグナルレベルは7バイト目、ネットワークIDは26から40バイト目）&lt;/li&gt;&lt;/ul&gt;みたいな感じ。ほかにもショートメッセージサービスへのアクセスができたりするようだが、そこはまだ見ていない。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;rubyを用いたサンプルコード&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;というわけで、アンテナレベルと繋がっているネットワークの名前を出力するサンプルコードを載せておく。今回はrubyで書いてみた。シリアルポートのサポートライブラリに&lt;a href="http://rubyforge.org/frs/?group_id=61&amp;amp;release_id=308"&gt;ruby-serial&lt;/a&gt;を使っているので動かす場合にはインストールしておくこと。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;require "serialport"&lt;br /&gt;&lt;br /&gt;# open control serial port 38400/N81&lt;br /&gt;sp = SerialPort.new("/dev/ttyU2", 38400, 8, 1, SerialPort::NONE)&lt;br /&gt;sp.flow_control= SerialPort::NONE&lt;br /&gt;&lt;br /&gt;cmd0   = [0xcf, 0x18, 0x00, 0xc0, 0xdd, 0x7e].pack('C*')&lt;br /&gt;cmd1   = [0xcf, 0x00, 0x00, 0x91, 0x86, 0x7e].pack('C*')&lt;br /&gt;telno  = [0xcf, 0x07, 0x00, 0x99, 0xcb, 0x7e].pack('C*')&lt;br /&gt;antcmd = [0xcf, 0x01, 0x00, 0x49, 0x9f, 0x7e].pack('C*')&lt;br /&gt;cnt = 0&lt;br /&gt;&lt;br /&gt;sp.write(cmd0)&lt;br /&gt;buf = sp.read(12)&lt;br /&gt;sp.write(cmd1)&lt;br /&gt;buf = sp.read(14)&lt;br /&gt;&lt;br /&gt;sp.write(telno)&lt;br /&gt;buf = sp.read(51)&lt;br /&gt;data = buf.unpack('C*')&lt;br /&gt;telno = data[5..16].map!{|c| c.chr}.join&lt;br /&gt;print "tel no:" , telno, "\n"&lt;br /&gt;&lt;br /&gt;while (cnt &amp;lt; 20)&lt;br /&gt;  sp.write(antcmd)&lt;br /&gt;  buf = sp.read(58)&lt;br /&gt;  data = buf.unpack('C*')&lt;br /&gt;  network = data[26..40].map!{|c| c.chr }.join&lt;br /&gt;  print "signal level:" , data[17], " [network:" , network , "]\n"&lt;br /&gt;  cnt+=1&lt;br /&gt;  sleep 1&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;出力は&lt;pre&gt;&lt;br /&gt;$ ruby a2502ant.rb&lt;br /&gt;tel no:080XXXXXXX&lt;br /&gt;signal level:20 [network:]&lt;br /&gt;signal level:20 [network:]&lt;br /&gt;signal level:20 [network:]&lt;br /&gt;signal level:20 [network:]&lt;br /&gt;signal level:20 [network:]&lt;br /&gt;signal level:18 [network:]&lt;br /&gt;signal level:18 [network:NTT DoCoMo]&lt;br /&gt;signal level:19 [network:NTT DoCoMo]&lt;br /&gt;[省略]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;のようになる。アプリケーションを作る場合などにそれなりに使えるかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1844942279184347755?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1844942279184347755/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1844942279184347755' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1844942279184347755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1844942279184347755'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/docomo-a2502.html' title='（メモ）DoCoMo A2502の制御ポートアクセス'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-433012544104728215</id><published>2008-02-17T20:59:00.009+09:00</published><updated>2008-02-19T10:36:51.793+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>（メモ）DUS01まとめ</title><content type='html'>忘れる前にワンセグチューナーDUS-01の挙動についてメモしておく。半分は自分のため、あとの半分は「２４時間ワンセグコミュニティ（？）」のため。Linuxやwindowsで使うときにどうぞ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ハードウェア&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CPU: &lt;a href="http://www.silabs.com/"&gt;Silicon Laboratories&lt;/a&gt; C8051F342&lt;/li&gt;&lt;li&gt;チューナー： sharp VA1A5JZ9902A (参考リンク：&lt;a href="http://ascii24.com/news/i/tech/article/2005/06/02/656188-000.html"&gt;ascii24&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;アンテナ：ロッドアンテナ&lt;/li&gt;&lt;li&gt;インターフェイス： USB1.1&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;シャープの9902Aは１－２世代前のワンセグモジュール。最新版には及ばないが感度が-107dbmは優秀なんじゃないかと思う。googleで探したけど仕様書等は見つからなかった。残念。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;USBデバイス情報&lt;/span&gt;&lt;br /&gt;USBデバイスとしては、こんな感じ。ほかに何をかけばいいのかな。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vendor ID:0x1bc8 , Product ID:0x0001&lt;br /&gt;&lt;/li&gt;&lt;li&gt;endpointは0,1,2,3の４本。&lt;/li&gt;&lt;li&gt;EP1は制御用のバルク転送エンドポイント（読み書き可能）。&lt;/li&gt;&lt;li&gt;EP3はMPEG2TS転送用のアイソクロナス転送エンドポイント（読み込み専用）&lt;/li&gt;&lt;li&gt;EP2は使っているのを見たことないけど、ファームウェアアップデートなどに使うのじゃないかと推測&lt;br /&gt;&lt;/li&gt;&lt;li&gt;起動時にファームウェアロードなどは発生しない。電源を入れれば動く。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;さらに詳しく知りたい人のためにNetBSDのusbgenの出力を載せておく。&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:85%;"&gt;CONFIGURATION descriptor index 0:&lt;br /&gt;bLength=9 bDescriptorType=2 wTotalLength=46 bNumInterface=1&lt;br /&gt;bConfigurationValue=1 iConfiguration=0 bmAttributes=80 bMaxPower=150 mA&lt;br /&gt;&lt;br /&gt;INTERFACE descriptor index 0, alt index 0:&lt;br /&gt;bLength=9 bDescriptorType=4 bInterfaceNumber=0 bAlternateSetting=0&lt;br /&gt;bNumEndpoints=4 bInterfaceClass=0 bInterfaceSubClass=0&lt;br /&gt;bInterfaceProtocol=0 iInterface=0&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor index 0:&lt;br /&gt;bLength=7 bDescriptorType=5 bEndpointAddress=1-out&lt;br /&gt;bmAttributes=2 wMaxPacketSize=64 bInterval=5&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor index 1:&lt;br /&gt;bLength=7 bDescriptorType=5 bEndpointAddress=1-in&lt;br /&gt;bmAttributes=2 wMaxPacketSize=64 bInterval=5&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor index 2:&lt;br /&gt;bLength=7 bDescriptorType=5 bEndpointAddress=2-out&lt;br /&gt;bmAttributes=2 wMaxPacketSize=64 bInterval=5&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor index 3:&lt;br /&gt;bLength=7 bDescriptorType=5 bEndpointAddress=3-in&lt;br /&gt;bmAttributes=1 wMaxPacketSize=188 bInterval=1&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;制御コマンド&lt;/span&gt;&lt;br /&gt;制御コマンドはEP１をつかってやりとりする。今のところ分かっているコマンドはこれだけ。全部推測なので正しいかはわからないけど。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ファームウェアバージョンチェック　(0x9f)  - 現在のファームウェアのバージョン（1.0.0）が返ってくる。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;チャネル設定 (0x10) - これに加えてKHz単位の周波数をくべるとチューナーが設定される。&lt;/li&gt;&lt;li&gt;入力検出(0x11) - 電波が受信できていたら0x1、受信できなければ0x0が返ってくる。&lt;/li&gt;&lt;li&gt;ストリームモードチェック（0x12)　- たぶんMPEG2TSストリームを出しているかしないかをチェック。&lt;/li&gt;&lt;li&gt;ストリームスタート (0x20)  - EP3へのMPEG2TS出力を開始する。&lt;/li&gt;&lt;li&gt;ストリームストップ(0x21) - EP3へのMPEG2TS出力を停止する。&lt;/li&gt;&lt;li&gt;シリアル番号チェック(0x43) - デバイス固有のシリアル番号を返す。&lt;/li&gt;&lt;/ul&gt;（2008/2/18 1:30修正：miroさんありがとうございました。)&lt;br /&gt;&lt;br /&gt;それぞれのコマンドは10byte長で、先頭にコマンドを、引数がないものは0x0で埋めて送る。&lt;br /&gt;チャネルを変えるときのシーケンスは&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ストリームが出ていたら止める&lt;/li&gt;&lt;li&gt;止まったかモードをチェックする&lt;/li&gt;&lt;li&gt;チャネル変更リクエストを出す&lt;/li&gt;&lt;li&gt;ちょっと待つ&lt;/li&gt;&lt;li&gt;入力検出リクエストを出す&lt;/li&gt;&lt;li&gt;返り値をチェックして0x0だったら「ちょっと待つまで戻る」。0x1が出るまでがんばる。（もしくはタイムアウトする）&lt;/li&gt;&lt;li&gt;ストリームを出力する&lt;/li&gt;&lt;/ul&gt;って感じ。チャネル設定コマンドは、{0x10, 0x04, 0x00, A, B, C, 0x00, 0x00, 0x00, 0x00}　というフォーマットで、A,B,CにKHz単位の周波数を指定する。たとえば、521.43MHz(チャンネル21)なら{0x07, 0xf3, 0xb7}を埋め込めば良い。&lt;br /&gt;(2008/2/19修正：チャネル設定コマンドの例の先頭バイトをtypoしていたので修正）&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;出力ストリーム&lt;/span&gt;&lt;br /&gt;EP3からはMPEG2TSもどきが出力される。先頭はMPEG2TSで規定された同期ビット列（0x47）でかつ、パケット長が１８８Byteというのは良いのだが、MPEG2TSとして解釈すると全部エラーになる、という変な状態。きっと、プログラムミスでこうなってしまっているのだろうとおもう。あまりにも不憫なので正しいストリームに治してあげよう。&lt;br /&gt;「先頭の0x47を除いて、他のバイト列に対して0xb5を排他的論理和を取る。」&lt;br /&gt;すると、普通のMPEG2TSになる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;まとめ&lt;/span&gt;&lt;br /&gt;USB的には、「&lt;a href="http://hwhack.blogspot.com/2008/02/netbsd242.html"&gt;USBデバイスとしてのJ200への不満&lt;/a&gt;」、はほぼ解決されているようなデバイスだった。最初はストリームが見えるか少しどきどきしたが、まあすぐにわかってよかった。&lt;br /&gt;まだ入手性もよいみたいだし、ここにある情報を使えば他にも対応ソフトを作れそうな人がいると思うので、いけているデバイスじゃないかと思う。明日もう少し補充を（自分用に）買っておこう。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-433012544104728215?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/433012544104728215/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=433012544104728215' title='35 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/433012544104728215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/433012544104728215'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/dus01.html' title='（メモ）DUS01まとめ'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1661851867497761752</id><published>2008-02-17T19:39:00.006+09:00</published><updated>2008-12-10T21:25:34.915+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDで「24時間ワンセグ野郎」(新デバイス)(3)</title><content type='html'>新デバイスさらに続き。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/R7gQjrx84OI/AAAAAAAAAK8/R4JTBOAbo6M/s1600-h/snapshot20080217194500.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_nwrLM141xU8/R7gQjrx84OI/AAAAAAAAAK8/R4JTBOAbo6M/s200/snapshot20080217194500.jpg" alt="" id="BLOGGER_PHOTO_ID_5167898777641345250" border="0" /&gt;&lt;/a&gt;バイトストリームを眺め続ける人生にもちょっとだけ疲れたので、ここらで絵（と音）でも見てみたい、という願望が大きくなってきた。というわけで、ちょっと真面目に絵と音声を見る部分を書いてみることにした。もし絵とか音声が見えたら、それがちゃんとしたMPEG2TSストリームとして扱えているか？っていう検証になるし。（バイトストリームを検証するためにはちゃんとパーサーと表示系をいちいち書かないといけないから、すぐには対応できないし）&lt;br /&gt;というわけで、新デバイスでも生TSをキャプチャして録画までできることを確認できた。（絵は今とったらこれだった、てだけ、意味はないです）。ワンセグチューナさわっていて初めてまともに絵を見たよ。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/R7gTrrx84PI/AAAAAAAAALE/dALecEo4UAM/s1600-h/dus01.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_nwrLM141xU8/R7gTrrx84PI/AAAAAAAAALE/dALecEo4UAM/s200/dus01.png" alt="" id="BLOGGER_PHOTO_ID_5167902213615182066" border="0" /&gt;&lt;/a&gt;下手に書いちゃって動かないのに買っちゃう人がいたら災難だから「新デバイス」とだけ書いていたけど、これで今まで伏せていた製品名をかける。写真のRockridgesoundのDitune(DUS-01)が最近触っていたデバイス。秋葉原だと３０００円弱で買える＆結構店頭に並んでいるので見たことがある人も多いかもしれない。&lt;br /&gt;外部アンテナはつながらないけど、選択肢の一つとしてはいいかな、と思っている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1661851867497761752?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1661851867497761752/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1661851867497761752' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1661851867497761752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1661851867497761752'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsd243.html' title='NetBSDで「24時間ワンセグ野郎」(新デバイス)(3)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nwrLM141xU8/R7gQjrx84OI/AAAAAAAAAK8/R4JTBOAbo6M/s72-c/snapshot20080217194500.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7929864422839183611</id><published>2008-02-17T17:49:00.003+09:00</published><updated>2008-12-10T21:25:35.069+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDで「24時間ワンセグ野郎」(新デバイス)(2)</title><content type='html'>新デバイスの話再び。&lt;br /&gt;&lt;br /&gt;前回のエントリー（&lt;a href="http://hwhack.blogspot.com/2008/02/netbsd24.html"&gt;NetBSDで「24時間ワンセグ野郎」(新デバイス)&lt;/a&gt;）に、生TSっぽいのが出ているとかいてしまったが、ちょっと寝てから冷静に見直してみると、なんか変だということに気がついた。&lt;br /&gt;&lt;br /&gt;簡単にいえば、「先頭の0x47以降は本来受信したはずのデータ列と異なっている」ようだ。キャプチャされたTSの解析結果も載せてあったので、鋭い人なら一目で気がつくような気もするけど、異様にフラグが多かったり、アダプテーションフィールド長が255だったり、（あそこには含まれていないけど、PIDが0x1fffを超えていたり）、していた。&lt;br /&gt;&lt;br /&gt;また、&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;だいぶ感度が悪そう。ちょっと、置き場所を変えるだけで、MPEG2TSのパケットでTS_ERRORフラグが立ってしまう。あんまり頻度が高いと、TS_ERROR付きでも眺めてみる、みたいな処理に変えないといけないかもしれない。&lt;/li&gt;&lt;/ul&gt;とも書いていたが、これもTS_ERRORビットの値がずれているのが問題だったようだ。値を読み替えてからみてみると、感度はそんなに問題ないみたい。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/R7f4BLx84NI/AAAAAAAAAK0/dMWKnd3f0fo/s1600-h/1seg-tbs.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_nwrLM141xU8/R7f4BLx84NI/AAAAAAAAAK0/dMWKnd3f0fo/s200/1seg-tbs.png" alt="" id="BLOGGER_PHOTO_ID_5167871796656791762" border="0" /&gt;&lt;/a&gt;幸いにもMPEG2TSヘッダは固定長で単純かつ、特定の部分に決まった情報が出やすいという特徴があるので、しばらく眺めていると変換のパターンは見えてくる。もう少し解析しないとだめだけど、今のところ、「各バイト単位で特定の値で排他的論理和をとる」っていう単純なルールでもとに戻るようだ。（コンティニュティカウンタの値が1-&gt;0-&gt;3-&gt;2-&gt;5と進むところで、XORじゃないか、って推測できたのが決め手だった）。&lt;br /&gt;&lt;br /&gt;というわけで、今度こそ生TSだと思われる出力。それっぽくなった。&lt;br /&gt;これで、MPEG2TSパーサーに戻れる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7929864422839183611?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7929864422839183611/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7929864422839183611' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7929864422839183611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7929864422839183611'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsd242_17.html' title='NetBSDで「24時間ワンセグ野郎」(新デバイス)(2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nwrLM141xU8/R7f4BLx84NI/AAAAAAAAAK0/dMWKnd3f0fo/s72-c/1seg-tbs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2687522740204447300</id><published>2008-02-16T14:02:00.005+09:00</published><updated>2008-12-10T21:25:35.446+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDで「24時間ワンセグ野郎」(新デバイス)</title><content type='html'>このエントリーの一行まとめ：　使えるUSBワンセグチューナーは、実はたくさんある、かも？&lt;br /&gt;&lt;br /&gt;本家の&lt;a href="http://mobilehackerz.blogspot.com/2008/02/blog-post_16.html"&gt;昨晩のエントリー&lt;/a&gt;でふれられていた「一部で&lt;a href="http://hwhack.blogspot.com/2008/02/netbsd242.html"&gt;非常に不評なLOG-J200のUSB&lt;/a&gt;（笑）」をおもに専門に扱っている：）わけですが、そこに非常に気になる記述があった。&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;ちゃんとエンドポイントは分かれてるしTSのデータはアイソクロナスで送ってきているし ^^; なんといってもコントロールコマンドがシンプル簡単で使いやすい！(笑) それこそ他OSでいじるベースとしては便利そうな感触ですよ。USBXPressではなく今度はEZ-USBベース、そして実売価格は3000円。探せばいろいろあるものです。&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;しかも入手性がいいようなので注目に値する情報だ。これで、２４時間ワンセグ野郎コミュニティ（？）もさらに盛り上がるに違いない。&lt;br /&gt;と、そのエントリーを読んだのが午前２時半すぎ。それまでは、ARIBの資料を眺めながらワンセグのMPEG2TSストリームの制御情報を処理する部分をつらつらと書いていたのだが、デバイスを触りたい気分がいきなり盛り上がってしまった。私も実は、その辺でみかけるたびにUSBデバイスを買ってあって、そろそろ家があふれそうだったりしているので、そのなかでまだ開けていなかった箱をいくつか取り出してUSBストリームを眺める、という作業に従事してみた。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/R7ZyH7x84LI/AAAAAAAAAKk/MbmEvSH4pEk/s1600-h/oneseg.png"&gt;&lt;img style="margin: 0px auto 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_nwrLM141xU8/R7ZyH7x84LI/AAAAAAAAAKk/MbmEvSH4pEk/s200/oneseg.png" alt="" id="BLOGGER_PHOTO_ID_5167443103086076082" border="0" /&gt;&lt;/a&gt;2-3種類眺めてみると、やっぱりいろいろと特徴が見えてくる、その辺の話はまた今度まとめる機会を探すとして、また新しく「188byte単位の情報転送 &amp;amp; 先頭バイトが0x47」のストリームを吐くチューナーを見つけてしまった。俄然盛り上がったので、&lt;span style="font-weight: bold;"&gt;NetBSD用のデバイスドライバも書いて&lt;/span&gt;みた。（おかげで眠い）&lt;br /&gt;&lt;br /&gt;このデバイスは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CPUは8051ベース(シリコンラボラトリC8051F342)&lt;/li&gt;&lt;li&gt;チューナーはシャープ製&lt;/li&gt;&lt;li&gt;アンテナはロッドアンテナのみ&lt;/li&gt;&lt;li&gt;眩しく光る青色LED付き&lt;/li&gt;&lt;li&gt;３０００円台のお得な値段で入手可能かも&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;というハードウェアで、基板を眺める限り、J200よりは出来がよさそう。挙動としては、&lt;ul&gt;&lt;li&gt;コマンド用のEndpoingとデータ用のEndpointがわかれている&lt;/li&gt;&lt;li&gt;データ用Endpointはアイソクロナス転送で188Byte単位で送ってくる&lt;/li&gt;&lt;li&gt;初期化コマンド等はほとんどいらない。お行儀よくチャネル切り替えをすれば動く&lt;/li&gt;&lt;li&gt;電波が安定するまではストリームを出力しない。チューナーがセットアップされたかどうかを問い合わせてみて0x1がかえってきたら、転送開始、みたいな処理をする。&lt;/li&gt;&lt;/ul&gt;というかんじで、この&lt;a href="http://hwhack.blogspot.com/2008/02/netbsd242.html"&gt;前のエントリに書いた不満&lt;/a&gt;はおおむね解消されているようだ。&lt;br /&gt;&lt;br /&gt;ただ、気になるのが、まだソフトウェアが悪い可能性もあるので何ともいえないけど、だいぶ感度が悪そう。ちょっと、置き場所を変えるだけで、MPEG2TSのパケットでTS_ERRORフラグが立ってしまう。あんまり頻度が高いと、TS_ERROR付きでも眺めてみる、みたいな処理に変えないといけないかもしれない。付属のソフトではそんなに画像が乱れるみたいなことが頻発するわけではないので、もう少し調査が必要。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/R7Z1Hbx84MI/AAAAAAAAAKs/F_9gk_aV5uI/s1600-h/nebsd-1seg.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_nwrLM141xU8/R7Z1Hbx84MI/AAAAAAAAAKs/F_9gk_aV5uI/s200/nebsd-1seg.png" alt="" id="BLOGGER_PHOTO_ID_5167446393031024834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;MPEG2TSのストリームはとれているみたいなので、もう少し調査して詳細をお知らせしたいとおもいます。というわけで、MPEG2TSストリームが出ている証拠も載せておきます。先頭バイトが0x47だけ、ってわけではないので安心。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2687522740204447300?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2687522740204447300/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2687522740204447300' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2687522740204447300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2687522740204447300'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsd24.html' title='NetBSDで「24時間ワンセグ野郎」(新デバイス)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/R7ZyH7x84LI/AAAAAAAAAKk/MbmEvSH4pEk/s72-c/oneseg.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7086189128650561601</id><published>2008-02-15T04:05:00.006+09:00</published><updated>2008-12-10T21:25:35.619+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='Eagle'/><title type='text'>基板CADと基板加工機</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R7SS6QrIy_I/AAAAAAAAAE4/YREWdKRq8BQ/s1600-h/8c2b2ec3156594807005080231b3f5d4.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R7SS6QrIy_I/AAAAAAAAAE4/YREWdKRq8BQ/s200/8c2b2ec3156594807005080231b3f5d4.png" alt="" id="BLOGGER_PHOTO_ID_5166916202106768370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;回路・基板CADとして制限はあるもののフリーで使える Eagleは非常によくできたツールである。&lt;br /&gt;しかし、なぜか操作性があまりにも普通のGUIソフトと違うところは非常に残念だ。&lt;br /&gt;&lt;br /&gt;とはいえダウンロードするだけでサイズ制限はあるものの２層基板をオートルートしてくれるというのは非常に便利である。さらにこの手のソフトに珍しくWindowsのほかに MacOSとLinuxもサポートしている。&lt;br /&gt;&lt;br /&gt;このEagleも新しいバージョンのテストがおこなわれておりメジャーバージョンアップが近いようだ。次のバージョンからは Mac版がX11に依存しなくなるのでそれに期待しつつ、今日は現行の 4.16とベータ版の 4.92のアイコンが微妙に違うという写真をのせておこう。&lt;br /&gt;&lt;br /&gt;これからしばらくはマイコンと同時に基板CADとそれを使ったプリント基板の作成方法の備忘録も載せていこうとおもう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7086189128650561601?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7086189128650561601/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7086189128650561601' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7086189128650561601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7086189128650561601'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/cad.html' title='基板CADと基板加工機'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/R7SS6QrIy_I/AAAAAAAAAE4/YREWdKRq8BQ/s72-c/8c2b2ec3156594807005080231b3f5d4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3376589245743206215</id><published>2008-02-15T00:19:00.006+09:00</published><updated>2008-12-10T21:25:36.024+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>（ワンセグ）電波時計（の特性）</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/R7RdsLx84KI/AAAAAAAAAKc/A6knon6D0JM/s1600-h/TOT-analisys.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_nwrLM141xU8/R7RdsLx84KI/AAAAAAAAAKc/A6knon6D0JM/s320/TOT-analisys.png" alt="" id="BLOGGER_PHOTO_ID_5166857686158729378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;一発芸のつもりだった「&lt;a href="http://hwhack.blogspot.com/2008/02/blog-post.html"&gt;ワンセグ電波時計&lt;/a&gt;」だったが、もう少し詳しく特性を調べてみることにした。&lt;br /&gt;ARIBの仕様書では時刻情報（TOT)のデフォルト送出間隔は５秒と決まっているらしいが、その５秒刻みというのがどのくらい正確なのか？というあたりを知りたくなったからだ。&lt;br /&gt;&lt;br /&gt;前回のエントリーではNTPで同期しているNetBSDの時刻情報と並べて表示していたが、今回はgettimeofday()を使ってマイクロ秒単位でTOTとTOTの間隔を計測してみた。108個（つまり540秒ほど）連続して受信したTOTの間隔の統計的な値を表に示しておく。&lt;br /&gt;&lt;br /&gt;思っていたよりも精度が高いようで、うまくつかえば結構便利かもしれないな、と別の野望も妄想中。簡単な機材で大域時刻同期ができるって結構すごいことなんだよね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3376589245743206215?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3376589245743206215/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3376589245743206215' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3376589245743206215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3376589245743206215'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/blog-post_15.html' title='（ワンセグ）電波時計（の特性）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nwrLM141xU8/R7RdsLx84KI/AAAAAAAAAKc/A6knon6D0JM/s72-c/TOT-analisys.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4128314934622772503</id><published>2008-02-14T16:13:00.003+09:00</published><updated>2008-12-10T21:25:36.159+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>（ワンセグ）電波時計</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/R7PqiLx84JI/AAAAAAAAAKU/8X7r5pkzbCw/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_nwrLM141xU8/R7PqiLx84JI/AAAAAAAAAKU/8X7r5pkzbCw/s200/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" alt="" id="BLOGGER_PHOTO_ID_5166731070522843282" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;ワンセグのストリームを眺めていてふと思いついたので、つくってみた。&lt;br /&gt;「ワンセグのストリームだけを使う時計」略称「ワンセグ電波時計」。&lt;br /&gt;&lt;br /&gt;どのくらいの精度がでるのかな、とおもってNTPで同期しているシステム時間も同時に表示してみたけれど、少なくとも秒単位では合っているみたいだ。更新頻度は5秒おきなので、それくらいの精度しか出ないと思うけど、なんか使えないかしら？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4128314934622772503?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4128314934622772503/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4128314934622772503' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4128314934622772503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4128314934622772503'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/blog-post.html' title='（ワンセグ）電波時計'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nwrLM141xU8/R7PqiLx84JI/AAAAAAAAAKU/8X7r5pkzbCw/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7353353003183243770</id><published>2008-02-14T03:21:00.007+09:00</published><updated>2008-02-14T16:24:08.894+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDで「24時間ワンセグ野郎」(2)</title><content type='html'>さすがに平日はあまり時間が取れないので、あっと驚くような進捗があるわけではないけど、進んでいないというわけでもないので、メモがてらに書いてみることにした。Log-J200のUSBデバイスとしての感想など。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;USBデバイスとしてのLog-J200&lt;/span&gt;&lt;br /&gt;ざっくりいうとLog-J100もUOT-100も同じなんだが、どれもこれもUSBデバイスとしてみたときにはあまりいけているデバイスだとは言い難い。一言でいうなら、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;USBデバイスのファーム設計のセオリーを見直してこい！&lt;/li&gt;&lt;/ul&gt;と、受け側のソフトを書きながら思わずデバイスに突っ込みをいれてしまうような、そんな仕様がいくつもある。たとえば、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;機能とエンドポイントの分離がうまくできてない、とか&lt;/li&gt;&lt;li&gt;コマンドを受理しても返答しない、という動作をするコマンドがある&lt;br /&gt;&lt;/li&gt;&lt;li&gt;なぜかbulk転送になっているMPEG2TSストリームの転送モード、とか&lt;/li&gt;&lt;li&gt;なぜか64Byte長で細切れな転送&lt;/li&gt;&lt;/ul&gt;とか。最初の「エンドポイントの使い方」は、endpoint０でやればよいようなデバイスの制御が、なぜかMPEG2TSストリームをやりとりしているendpoint2にのっている、とか、そのあたりが顕著な例。２つめも問題で、USBのホストコントローラ的には受理したならackを返してほしいと思っているのに、黙ってしまうのでコマンドがストールしたように見えてしまう。必ず受理される、と信じて送らないといけないのはどうかとおもう。&lt;br /&gt;で、性能上問題になるのは３つめと４つめ。MPEG2TSのパケット長は188Byteで、空から約380KBps程度の速度でどんどんと情報が降ってきている。これを受け取るそばからUSBバスの上に流してあげる、というのがUSBワンセグチューナデバイスのお仕事。（たぶん）普通はこんな特性の情報を扱うためには、USBではアイソクロナス転送モードというのを使うことになっている。アイソクロナス転送にするとハンドシェイクやリトライをしないので時間制約に即した転送ができる、ので、次々に発生する事象（音とか映像とか電波とか）を扱うのに向いている。Log-J200（とその仲間たち）はなぜかMPEG2TSストリームの転送にBulkエンドポイントを採用している。Bulkエンドポイントでは転送サイズは64byteまでなので、188Byteの転送をするために少なくとも３回（J200の場合は４回）の転送要求発行しないといけない。&lt;br /&gt;&lt;br /&gt;ちょっと計算してみるとわかるのだが、ワンセグのパケットは約1.2msくらいに一回の周期で受信される。つまり、1.2ms以内に４回のトランザクションを必ず発行するような動作をしていないと取りこぼしてしまう。&lt;br /&gt;いまどきの速いコンピュータにとっては1msなんて無限な時間にみえるかもしれないが、実時間動作が苦手なUNIX系のOSではちゃんとやらないと実際に取りこぼしてしまう場合があった。&lt;br /&gt;&lt;br /&gt;特に今回はugenをつかったユーザーランドアプリケーションとして書いてみているので、そのあたりは結構シビアだなあ、というのが感想。&lt;a href="http://d.hatena.ne.jp/eggman/20080211/1202695667"&gt;eggmanさんのlinuxデバイスドライバの話&lt;/a&gt;をみて、「やっぱりカーネルデバイスドライバのほうがかっこいいし、オーバーヘッド少なくなるからよいだろうなあ。」と思ったのは内緒だ。いつか気が向いたらkernelのデバイスドライバも書いてみよう。&lt;br /&gt;でも、アイソクロナス転送のしてくれていれば、ユーザランドからさわってもこんなことは起こらないので、やっぱり設計に難がある、っていう気がしている。&lt;br /&gt;&lt;br /&gt;ちなみに、内部バッファとかも持っていない設計になっているようで、USBデバイスへのポーリングが遅れるとデータの一部が化ける（nバイトシフトしているように見える＆nバイト足りない）。最初は何で先頭にMPEG2TSの先頭バイト（0x47）が現れない場合があるんだろうか？と悩んでしまったが、USBアナライザの時間計測モードをつかってみたら、アクセス間隔がWindowsでみた場合とくらべて長いかった。&lt;br /&gt;複数のkerenlへのリクエストをまとめるとか、小技を使って解決している。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Log-J200の受信感度&lt;/span&gt;&lt;br /&gt;外付けアンテナがつくのであんまり問題にならないんだけど、受信したMPEG2TSストリームを数字で眺めていると、数パーセントの割合でエラーが出ているみたい。エラーとしては以下の３パターン。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;そもそも受信できていない。MPEG2TSのカウンターを計測していると取れなかったことがわかる&lt;/li&gt;&lt;li&gt;MPEG2TSのトランスポートエラーインジケーターの値が1になっている。つまり、受信時に「このデータ使わないほうがいいじゃない？」と言ってきている&lt;/li&gt;&lt;li&gt;先頭バイトが0x47じゃない。タイミング制約は満たしているはずだとは思うけど、たまに発生する&lt;/li&gt;&lt;/ul&gt;特にトランスポートエラーインジケーターは受信を開始してから２００パケットくらいに全部ついているので、受信機が設定されてから正しいデータ出すまでに300msくらいはかかるってことかな？&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NetBSDの24時間ワンセグ野郎の現状&lt;/span&gt;&lt;br /&gt;とまあ、USBレベルでは取りこぼしもなく普通に受信情報を取り出せている。とりあえず受信データMPEG2TSの状態でファイルに書き出すこともできる。とまあ、そのくらい。いまは画像を眺めるというよりは、受信したストリームを数字で見ながら、ヘッダとかペイロードとかのいろいろな部分のパーサーとダンプ関数を書いてみて、「ほほー」とか言いながらにやけている状態。今日の参考資料はARIB-TR-B14（英語版）とかARIB-STD-B10(英語版）。なぜ英語かというと無料で公開されているから。（&lt;a href="http://www.dibeg.org/aribstd/ARIBSTD-j.htm"&gt;ARIBの英語版配布サイト&lt;/a&gt;）&lt;br /&gt;&lt;br /&gt;というわけで、外堀はほとんど埋まっているような感じですが、&lt;a href="http://mobilehackerz.blogspot.com/"&gt;本家&lt;/a&gt;みたいな作りこみをできるまでには、まだしばらくかかりそうです。&lt;br /&gt;&lt;br /&gt;最後に色気はないけど、動作中のテキスト出力など。ワンセグっていうことでPID=0x1fc8のパケット情報。本当になんかプログラムを書いている、ってい証拠に（なるかな？）。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:08, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:09, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:10, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:11, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:12, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:13, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:14, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:15, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:00, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:01, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:02, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:03, Flags PUSTART TRANSPRIO&lt;br /&gt;== MPEG2TS header (PID:0x1fc8) -:P == Cont count:04, Flags PUSTART TRANSPRIO&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7353353003183243770?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7353353003183243770/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7353353003183243770' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7353353003183243770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7353353003183243770'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsd242.html' title='NetBSDで「24時間ワンセグ野郎」(2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5853873736932456338</id><published>2008-02-12T01:23:00.000+09:00</published><updated>2008-02-12T01:51:29.488+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='24時間ワンセグ野郎'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDで「24時間ワンセグ野郎」(1)</title><content type='html'>&lt;a href="http://mobilehackerz.blogspot.com/"&gt;MobileHackerz再起動日記&lt;/a&gt;で開発が進められている「24時間ワンセグ野郎」だが、ひと月ほど前のエントリーを見たときから「すげえ」素直に感嘆していた。「これはいけてる！」とおもって、その場でUOT-100を６本ほど買ってあった、ということからも（今はすでに入手困難だということを考えて）本当にぐっときたことは推測してもらえると思う。&lt;br /&gt;ちょっと忙しくしていたので出遅れてしまったのだが、これができるということは、別のOS、たとえばNetBSDでも同じようなアプリケーションを構築できるんじゃないかとおもってやってみた、というのがこのエントリーの内容。&lt;br /&gt;この３連休の時間で始めたことなので、本家の完成度には到底およばないけれど、最近一部でブームも盛り上がってきているようなのでちょっと参戦してみようと思う。&lt;br /&gt;&lt;br /&gt;UOT-100を持っているから、といってもそれをそのまま使うのは二番煎じすぎる。本家にもなにか貢献できないかなーとおもって最近どこかで安いワンセグチューナを見かけるたびいくつかを購入してみていた。分解したり、USBのデータストリームを眺めていたりもしたのだが、まだ「これは！」という機種には出会えていない。&lt;br /&gt;今回は、Log-J200をつかってワンセグ野郎をしてみることにする。&lt;br /&gt;Log-J200はUOT-100と似たデバイスで、UOT-100と同様に「生TSをバス上に流している」ので、扱いが簡単だから、というのと、「まだ入手できるから」というのが理由。&lt;br /&gt;&lt;br /&gt;いきなりkernelドライバを書いてもいいのだが、「ugenでラピッドプロトタイピング」という話も書いていたし、今回は&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NetBSD ugenをつかったユーザランドアプリケーションで実装&lt;/li&gt;&lt;li&gt;ハードウェア改修なしに複数デバイスに対応&lt;/li&gt;&lt;li&gt;（できればネットワークサーバ化）&lt;/li&gt;&lt;/ul&gt;という感じでいってみている。&lt;br /&gt;&lt;br /&gt;先に、現状を書いておくと、昨晩から２４時間（当然途中では寝ているしごはんもたべてる）くらい経過したところで、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NetBSDで複数デバイス同時に認識&lt;/li&gt;&lt;li&gt;Windowsデバイスドライバには非依存&lt;br /&gt;&lt;/li&gt;&lt;li&gt;とりあえずチャネルは２チャンネルくらいは変更可能&lt;/li&gt;&lt;li&gt;生TSだと思われるファイルを書きだしている（けど、まだみえない）&lt;/li&gt;&lt;li&gt;MPEG2TSの簡単なヘッダパーサを書いて、それなりにエラーハンドリングをできるようになりつつある&lt;/li&gt;&lt;/ul&gt;くらい。パケットダンプを見ている限り、それなりに正しくMPEG2TSのキャプチャはできているようにみえるので、あともう少しで画像がみえるか？という期待でここまで来ている、というところ。Log-J200は分解が大変（というか分解するとたぶん復元できない）ので、ハードウェアを触らなくてもいいというのは大きな利点じゃなかなと(個人的には）おもっている。&lt;br /&gt;&lt;br /&gt;というわけで、現状報告を先にしておく。ソースをまとめたら公開予定（BSDライセンス）。&lt;br /&gt;次のエントリーで解析した内容を書く予定。&lt;br /&gt;&lt;br /&gt;週末の娯楽としては大変楽しめたし、これからもちょっと楽しめそう。がんばろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5853873736932456338?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5853873736932456338/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5853873736932456338' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5853873736932456338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5853873736932456338'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsd241.html' title='NetBSDで「24時間ワンセグ野郎」(1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2928465300454421806</id><published>2008-02-11T11:31:00.000+09:00</published><updated>2008-02-11T11:35:44.213+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='DoCoMo'/><title type='text'>NetBSDでDoCoMo A2502をつかう(-currentにマージ）</title><content type='html'>「&lt;a href="http://hwhack.blogspot.com/2008/02/netbsddocomo-a2502.html"&gt;NetBSDでDoCoMo A2502をつかう&lt;/a&gt;」で書いたようにNTT DoCoMoの3G/HSDPAモデムFOMA A2502をNetBSDで使えるようにして、patchを本家に送っておいた。&lt;br /&gt;今日（2/11）無事に-currentにマージされたようだ。&lt;br /&gt;&lt;br /&gt;D02HWにつづいてA2502も今日以降のNetBSD-currentを入れれば使えるようになる。&lt;br /&gt;A2502もちょっと解析（アンテナレベルの取得とか）を進めていたので、もう少し進んだらまとめてみようとおもっている。&lt;br /&gt;&lt;br /&gt;今日はお知らせだけで。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2928465300454421806?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2928465300454421806/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2928465300454421806' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2928465300454421806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2928465300454421806'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsddocomo-a2502-current.html' title='NetBSDでDoCoMo A2502をつかう(-currentにマージ）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7407644420116449831</id><published>2008-02-07T03:00:00.000+09:00</published><updated>2008-02-07T04:11:03.648+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>NetBSDでSONY GPS-CS1Kを使う</title><content type='html'>SONYは&lt;a href="http://www.sony.jp/products/Consumer/Peripheral/GPS/GPS-CS1K/"&gt;GPS-CS1K&lt;/a&gt;というGPSロガーを発売している。ずいぶん前（発売直後）に買ってあったのだけど、実はあまり使わずに棚の上のオブジェと化していた。一緒にblogをかいているCUEICHIが&lt;a href="http://hwhack.blogspot.com/2008/01/ruby-on-rails-googlemap.html"&gt;Google Mapと位置情報で遊んでいた&lt;/a&gt;のをみてGPSを持っていることを思い出しGPSを使おうと盛り上がった。&lt;br /&gt;が、なぜかNetBSDでは動かない（OSXでも動かない。。）ので原因を調べてみた。&lt;br /&gt;kerenlからのメッセージと、USBバスアナライザの出力を見る限り&lt;br /&gt;&lt;ul&gt;&lt;li&gt;UR_BBB_GET_MAX_LUNリクエスト受け取ったあとデバイスの挙動がどうも怪しい&lt;/li&gt;&lt;li&gt;しばらくリトライすると復帰する&lt;/li&gt;&lt;/ul&gt;ようだ。リトライのコードを入れてもいいのだが、他のデバイスへの影響が大きそう。あまり美しくはないがNetBSDのumassの例外コード(umass_quirks)を拡張してUR_BBB_GET_MAX_LUNを発行せずに決め打ちでLUNを指定する、というロジックを導入してみることにした。&lt;br /&gt;&lt;br /&gt;その結果、sd０ on umass０として認識されるようになって、mount -t msdos /dev/sd0a /mntでディスクとしてマウントできるようになった。とりあえずpatchはsend-prしてある(&lt;a href="http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=37948"&gt;kern/37948&lt;/a&gt;)。&lt;br /&gt;&lt;br /&gt;NetBSDで動くようにはなったが、GPSロガーをどんなふうに使うかはまだ思案中。&lt;br /&gt;&lt;br /&gt;こんなデバイスをみるたびに、「Windowsで動けばいい、みたいなデバイスの作り方はしないでほしいなー」と思う。で、同時に「Windowsのホストドライバってなにかあってもあきらめずに頑張るなー」とこっそり感心する。ここは純粋に評価してもいいね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7407644420116449831?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7407644420116449831/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7407644420116449831' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7407644420116449831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7407644420116449831'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsdsony-gps-cs1k.html' title='NetBSDでSONY GPS-CS1Kを使う'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5463499538376699384</id><published>2008-02-07T01:23:00.000+09:00</published><updated>2008-12-10T21:25:36.417+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='DoCoMo'/><title type='text'>NetBSDでDoCoMo A2502をつかう</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/R6nwZji_lqI/AAAAAAAAAKM/HwFLa3PIJqs/s1600-h/DSC01181.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_nwrLM141xU8/R6nwZji_lqI/AAAAAAAAAKM/HwFLa3PIJqs/s200/DSC01181.jpg" alt="" id="BLOGGER_PHOTO_ID_5163922769586394786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;別に３Gモデムを攻略するのが趣味ってわけではないが、近くにNTT DoCoMoのHSDPAモデム A2502 (&lt;a href="http://www.nttdocomo.co.jp/product/relate/a2502/index.html"&gt;製品情報&lt;/a&gt;）があったのでどんなものか眺めてみた。結構あっさりとNetBSDで動くようになったので方法を書いておく。&lt;br /&gt;&lt;br /&gt;A2502はAnyData社の製品とのことだが、イーモバイルのD02HW(HAUWEIのE220)みたいにメジャーな製品のOEMというわけではなさそう。検索してもあまり素性がわからないので、とりあえずUSBバスを観測してみたところ、コマンドの系列がこの前書いたD02HWと互換性がありそうだ。というわけで、とりあえずモデムモードになったあとのD02HWと同じように扱ってみたところ通信ができることを確認。&lt;br /&gt;&lt;br /&gt;モデムとしては、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;comポートが３本でてくる。ATコマンドを受理するのは最初の１つだけ。２つめは不明。３つめは網の情報がでているっぽいけど、特に処理するコードは書いていないので見えない。&lt;/li&gt;&lt;li&gt;D02HWみたいにUSBマスストレージがついていたりはしない、普通のモデム&lt;/li&gt;&lt;li&gt;変なコマンドを送らなくても、最初からモデムとして動く&lt;/li&gt;&lt;/ul&gt;なので、D02HWよりは扱いやすい。ただ、不明なvendor specific requestがいくつもあるのでそれがなにかわからないのはちょっと気持ちわるい。&lt;br /&gt;&lt;br /&gt;コード的には、いくつか初期化シーケンスを書いて、uhmodemをD02HWとA2502両用になるようにさらに汎用的なドライバとして整理しておいた。やったことは&lt;br /&gt;&lt;ul&gt;&lt;li&gt;deviceのvendor id, product idの構造体にいくつかの補足情報（comデバイスの数、デバイス種類のフラグ）を持つようにした&lt;/li&gt;&lt;li&gt;シリアルデバイスになるインターフェイスごとにちゃんとendpoint haltをかけるようにした。&lt;/li&gt;&lt;li&gt;いままで決め打ちだったendpoint 番号をusbフレームワーク的に解決するようにした&lt;/li&gt;&lt;li&gt;いままで決め打ちだったデバイス依存リクエストを整理して両方でつかえるようにした&lt;/li&gt;&lt;/ul&gt;というあたり。見直した結果コードは少しきれいになった。新しいデバイスに対応するのがもっと簡単になりそう。もう少しつかってみてから、NetBSD本家にsend-prしておく予定。寝る前にだせるかな。(追記：　done)&lt;br /&gt;&lt;br /&gt;とりあえずpppでつなげてみたところ、DoCoMoの網の挙動はイーモバイルの網とは違うことがわかった。&lt;br /&gt;たとえばRTTの変化。イーモバイルはしばらくパケットを投げているとある段階で急にRTTが短くなるが、DoCoMoの場合はステップ的に減っていく。最終的は二つとも同じくらい(70ms-100ms)で収束するが、途中経過が違うのがおもしろかった。&lt;br /&gt;（追記：　emobileでもう一度RTTを計ってみたところ500ms → ２００ｍｓ程度までしか変化しなかった。挙動がかわったのかもしれない。そういう意味ではDoCoMoの網のほうが良い特性かも？）&lt;br /&gt;&lt;br /&gt;速度は追いこんでいないけど、SSHでscpして10MBくらいのファイルを転送したところ200KB/secくらいでていた。そんなに悪い数字じゃないね。&lt;br /&gt;&lt;br /&gt;追記：　NetBSD-pr &lt;a href="http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=37978"&gt;kern/37978&lt;/a&gt; すぐに試してみたい人はこれを見て手でパッチあててください。最近のcurrentには当たるはず。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5463499538376699384?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5463499538376699384/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5463499538376699384' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5463499538376699384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5463499538376699384'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/02/netbsddocomo-a2502.html' title='NetBSDでDoCoMo A2502をつかう'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_nwrLM141xU8/R6nwZji_lqI/AAAAAAAAAKM/HwFLa3PIJqs/s72-c/DSC01181.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6916038125858719417</id><published>2008-01-28T20:39:00.000+09:00</published><updated>2008-01-28T22:07:02.254+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>ugenでラピッドプロトタイピング(*BSDでUSB）</title><content type='html'>*BSDにはugen（usb generic device）という汎用のUSBデバイスドライバが実装されていて、USBデバイスを刺したときに適切なデバイスドライバが見つからなかったときには、ugenデバイスしてアタッチするようになっている。普通は「なんだugenかよ」と思って「サポートされてないじゃんか」となる（普通じゃない人は「しょうがないからデバイスドライバ書くか」となる）のだが、実はugenとして見えるのはそれはそれで大変意味があることだ。&lt;br /&gt;というわけで、ugenを使ったrapid prototypingについて書いてみようと思う。&lt;br /&gt;&lt;br /&gt;ugenが出来ることは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/dev/ugenN.MMというスペシャルファイルを介したUSBデバイスとのエンドポイントとの通信&lt;/li&gt;&lt;/ul&gt;で、read(), write(), ioctl()をつかって、USBデバイスの概ねほとんどの機能にアクセスできる。USBは「ユニバーサルシリアルバス」なのでread(), write()できれば、適切なアクセス方法をプログラムできれば大体なんでもできるはずだ。&lt;br /&gt;もちろん、ugenもデバイスドライバなので、あるデバイスに適切なデバイスドライバが実装されていてkernelにコンフィグされているときはugenとしてアクセスすることは出来ない。(kernelコンフィグによっては強制的にugenにすることもできる。man ugen参照のこと）。&lt;br /&gt;&lt;br /&gt;ugenで実装することとkernelで実装することの利点・欠点をまとめると、&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ugen利用の利点：&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;kernelで実装しなくてもいいので、開発が楽&lt;/li&gt;&lt;li&gt;kernelに実装しなくていいので、配布や利用が楽&lt;/li&gt;&lt;li&gt;APIがあまり変わらないので、kernelバージョンがあがっても追従しやすい&lt;/li&gt;&lt;li&gt;ugenっぽいデバイスドライバがあるOSなら移植しやすい（かも）&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;ugen利用の欠点：&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;参考になる実装や文書が少ない&lt;br /&gt;&lt;/li&gt;&lt;li&gt;kernelに取り込まれることは無いので、マージはされない&lt;/li&gt;&lt;li&gt;kernelスペースとuserlandのやりとりが多いのでパフォーマンスは期待できないかも&lt;/li&gt;&lt;li&gt;kernel内のほかのフレームワークとの連携は難しい&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;という感じだと理解している。本質的にはkernelで書こうがugen経由で書こうがUSB的にはやることはほとんど変わらないので、kernelをかける人もプロトタイプツールとしてugenというのは検討しても良いんじゃないだろうか。&lt;br /&gt;&lt;br /&gt;というわけで簡単な使い方から。基本的なステップは&lt;br /&gt;&lt;ul&gt;&lt;li&gt;usbctlなどのツールでUSB device descriptorを取得して、エンドポイントの構造をざっくりと理解する。D02HWみたいに何かしたら化けるデバイスもあるので、ugenの-Dオプションを使って全部のconfigurationをdumpしておくと便利。何回もみるので、ファイルに出しておいたり、印刷して脇に置いたりしても良い。usbctlとかusbgenコマンドはpkgsrcのusbutilを入れれば入るはず。&lt;/li&gt;&lt;li&gt;デバイスを刺したときにでたugenのデバイスのugenN.00をO_RDWRでopen()する。これがコントロールエンドポイント(EP0)になる。&lt;/li&gt;&lt;li&gt;開いたEP0に対して、ioctlでUSB_GET_DEVICEINFOを送りつけると、device descriptorが取得できる。取得したusb_device_info構造体にvendor IDとproduct IDが入っているのでこれでデバイスの認識をする。複数のデバイスをサポートしていないなら、お目当てのデバイスがみつからなければexitしてしまえばよい。&lt;/li&gt;&lt;li&gt;お目当てのデバイスがみつかったら、最初に調べておいたエンドポイントを必要な数だけopen()する。openするファイル名は/dev/ugenN.MMのMMがendpoint番号。endpointがINだったらO_RDONLY、OUTだったらO_WRONLYにするのを忘れずに。IN/OUTだったらO_RDWRで良い。&lt;/li&gt;&lt;li&gt;後は開いたファイルディスクリプタに対して、書き込んだり、ioctlを発行すれば、usbのバスに必要なトランザクションが生成される&lt;/li&gt;&lt;/ul&gt;と、こんな感じ。&lt;br /&gt;&lt;br /&gt;デバイスを探索するコードのサンプルを書いてみると、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;#include &amp;lt;/dev/usb/usb.h&amp;gt;&lt;br /&gt;int&lt;br /&gt;XXX_match(int fd) {&lt;br /&gt;  struct usb_device_info udi;&lt;br /&gt;&lt;br /&gt;  /* get device information */&lt;br /&gt;  if (ioctl (fd, USB_GET_DEVICEINFO, &amp;amp;udi) &amp;lt; 0) {&lt;br /&gt;        perror("can't get device information");&lt;br /&gt;        return -1;      &lt;br /&gt;  }&lt;br /&gt;  fprintf(stderr, "device info: VID:%#.4x PID:%#.4x\n", &lt;br /&gt;        udi.udi_vendorNo, udi.udi_productNo);&lt;br /&gt;  /* check the device is XXX */&lt;br /&gt;  if (udi.udi_vendorNo != XXX_VID || udi.udi_productNo != XXX_PID){&lt;br /&gt;        fprintf(stderr, "can't find any NM30 on %s\n", dc-&gt;dev);&lt;br /&gt;        return -1;      &lt;br /&gt;  }&lt;br /&gt;  printf("==== Found a XXX  ====\n");&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;のようになる。&lt;br /&gt;&lt;br /&gt;使ってみていて注意しないといけない点は、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;結構kernelの奥深くをさわっているらしく、お行儀が悪いとすぐにkernelパニックを引き起こす&lt;/li&gt;&lt;/ul&gt;ということ。openしたファイルディスクリプタの始末や、書き込むメッセージのサニタライズは最初からそれなりにお行儀よくしておいたほうがいい。&lt;br /&gt;&lt;br /&gt;長くなったので続きは次回。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6916038125858719417?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6916038125858719417/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6916038125858719417' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6916038125858719417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6916038125858719417'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/ugenbsdusb.html' title='ugenでラピッドプロトタイピング(*BSDでUSB）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5733679267992688986</id><published>2008-01-22T00:12:00.000+09:00</published><updated>2008-01-22T00:22:26.570+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(-currentにマージ）</title><content type='html'>何回かにわたってD02HWをNetBSDで使う話を書いていたが、1/21付けでNetBSD(-current)にマージされた。&lt;br /&gt;基本的に「&lt;a href="http://hwhack.blogspot.com/2008/01/netbsdemobile-d02hw.html"&gt;NetBSDでEmobile D02HWを使う(新デバイスドライバ）&lt;/a&gt;」でsend-prしたものがおおむねそのままマージされたかんじ。cvsで吸い出すだけで使えるようになったはず。&lt;br /&gt;&lt;br /&gt;使う人が出てきたら潜在的な問題とかが出てくるかもしれないけど、一段落。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5733679267992688986?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5733679267992688986/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5733679267992688986' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5733679267992688986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5733679267992688986'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/netbsdemobile-d02hw-current.html' title='NetBSDでEmobile D02HWを使う(-currentにマージ）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4021899519771623355</id><published>2008-01-13T01:29:00.000+09:00</published><updated>2008-12-10T21:25:36.634+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='googlemap'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>Ruby on Rails で googlemapをかっこよく</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R4tn-EomtEI/AAAAAAAAAEw/V8yFdp64L90/s1600-h/%E3%81%93%E3%81%AE%E5%A0%B4%E3%81%A7%E4%B8%80%E8%A8%80.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R4tn-EomtEI/AAAAAAAAAEw/V8yFdp64L90/s200/%E3%81%93%E3%81%AE%E5%A0%B4%E3%81%A7%E4%B8%80%E8%A8%80.jpg" alt="" id="BLOGGER_PHOTO_ID_5155328514549265474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今回はいつものハードウェアとは趣が違って web サービスのテクニックの話である。&lt;br /&gt;&lt;br /&gt;ruby on rails上でgooglemapをつかった表示を行うときにすこし気の利いたインタラクティブな動作をさせるところがトピックである。&lt;br /&gt;&lt;br /&gt;ruby on rails で googlemapを扱うのに使われる pluginとしてym4r/gm というのがある。geocodingもふくめ非常に簡単に使えるのだが、逆に細かいところに手がとどかない。&lt;br /&gt;&lt;br /&gt;事の発端はgooglemapの地図上のマーカをクリックすると吹き出し形式でメッセージが見られるインターフェースを実装したのだが、マウスオーバーで見られるほうがいいのではないかという意見をこのblogの共著のYUO氏から貰ったことであった。&lt;br /&gt;&lt;br /&gt;そこでこの機能を実現するためにgoogleを何時間かしらべたが、googlemapの使い方はわかったものの、railsでの ym4rを使った例は英語サイトもふくめて直接的な回答にはいきあたらず、ym4r開発者のサポートBBSでもほぼ１年ほど放置プレイだったので備忘録もふくめて書いておく。&lt;br /&gt;&lt;br /&gt;googlemap上 でマウスをつかった特別なアクションを使うためにはaddListenerによってリスナを設定する必要がある。しかしながら、 ym4r/gm のコードをそのまま使ってマーカを設定するだけではこのような設定ができない。リスナを設定するためにはリスナになるオブジェクトを変数として代入し、バインドしてやる必要があるためだ。&lt;br /&gt;&lt;br /&gt;declare_init をつかってオブジェクトを変数として宣言しなおしてやる必要がある。そしてこの後で、宣言された変数を使ってリスナを設定するのだが、このときに既存のメソッドは役に立たない。汎用につかえるrecord_initメソッドを使うことにより、 initializeのルーチンの中に自分で設定したjavascriptをそのまま書き込むことができるのでそれを利用することになる。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;書き上げたコードの一部を切り出しておくと以下のようになる。&lt;br /&gt;&lt;br /&gt;ポイントは markerを変数化するときに#{x.id} をつけることによりすべてのマーカで違う変数名を持つようにすることが１つ目である。もう１つのポイントとしては record_init をつかって直接 googlemapを動かすjavascriptのGEvent.addListener メソッドを記述するところである。また、 変数 pで生成している htmlの終端に改行がはいっていると地図のjavascriptのレンダリングがうまくいかないようなのでちゃんと partialなレンダリングをした後にchompすることを忘れないことが大切なようだ。&lt;br /&gt;&lt;br /&gt;さらに今回はlistenerとして mouseover のほかに mouseout を設定することで、マウスがはずれると即座にウインドウが自動で閉じる処理を行っている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;実装例&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;marker = GMarker.new([x.lat,x.lon],&lt;br /&gt;       :title =&gt; " #{x.created_at.strftime("%m/%d-%H:%M")}" )&lt;br /&gt;p = render_to_string(:partial =&gt; 'msg',&lt;br /&gt;             :locals =&gt; { :tag =&gt; tag , :pm =&gt; x  }).chomp&lt;br /&gt;&lt;br /&gt;@map.declare_init(marker,"marker#{x.id}")&lt;br /&gt;@map.overlay_init(marker)&lt;br /&gt;@map.record_init "GEvent.addListener(marker#{x.id},&lt;br /&gt;  'mouseover',&lt;br /&gt;  function(){marker#{x.id}.openInfoWindowHtml(\"#{p}\")}); "&lt;br /&gt;@map.record_init "GEvent.addListener(marker#{x.id},&lt;br /&gt;  'mouseout',&lt;br /&gt;  function(){map.disableInfoWindow();&lt;br /&gt;             map.enableInfoWindow();}); "&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4021899519771623355?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4021899519771623355/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4021899519771623355' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4021899519771623355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4021899519771623355'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/ruby-on-rails-googlemap.html' title='Ruby on Rails で googlemapをかっこよく'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/R4tn-EomtEI/AAAAAAAAAEw/V8yFdp64L90/s72-c/%E3%81%93%E3%81%AE%E5%A0%B4%E3%81%A7%E4%B8%80%E8%A8%80.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6619997830807854434</id><published>2008-01-09T23:04:00.000+09:00</published><updated>2008-01-09T23:39:45.049+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでWatchdog timerを使う（CS5535/CS5536)</title><content type='html'>ちょっと前に&lt;a href="http://hwhack.blogspot.com/2007/12/netbsdwatchdog-timerfor-alix-1.html"&gt;NetBSDでWatchdog timerを使う（for ALIX) (1)&lt;/a&gt; という一連のエントリーを書いたけれど、年が明けたころからNetBSD-currentへの統合作業をやっていた。手元にあるALIXでは普通に動くのだけど、ほかのボードではどうもうまく動かない（watchdog timerをenableすると一瞬でリブートされてしまう）と言うレポートが担当となったcommiterの人からあがってきてその理由を追ってみたので、メモがてらに何が起こっていたかを書いてみることにする。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;元々のコードの仮定：CS5536のMFGPT0はNetBSD kernel以外では使っていない。だから、watchdog timer用のtimerとしてMFGPT0を決めうちで使っても問題無い&lt;/li&gt;&lt;/ul&gt;動かないといわれても動かないボードは手元に無いので、debugの出力をてんこ盛りにしたテスト用のドライバをつくって、何回かやりとりをしてみた。その結果&lt;br /&gt;&lt;ul&gt;&lt;li&gt;何者かがNetBSD kernelがアクセスする前に、MFGPT0を設定して（たぶん、何かの用途に使って）いる。&lt;/li&gt;&lt;/ul&gt;ことがわかった。MFGPTのsetupレジスタはほとんどのビットフィールドがwrite onceレジスタになっていて、一度設定されるとリセットするまで再設定はできない設計になっている。だから誰かが設定してしまうと、その後は必要な設定を上書きすることができないので事実上watchdog timerとしては利用できない。特に問題なのはタイマーの分周器の設定で、分周比が低すぎるとあっというまにタイマーがまわってしまって、watchdogが動く値に到達してしまう、というのがリブートされる理由だった。たぶん問題になったボードではBIOSなどが何かの用途に設定してしまっているのではないかと推測している。&lt;br /&gt;&lt;br /&gt;この問題に対応するためにやったことは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;gcscpcib_attach()のwatchdog timerを設定するところで、gcscpcib_scan_mfgpt()という関数（とりあえず書いた）を使って、その時点で使われていないMFGPTを探して使うことにした&lt;/li&gt;&lt;li&gt;必要なら決めうちで利用するMFGPTを指定できるようにした&lt;/li&gt;&lt;/ul&gt;というあたり。更にマージする前に、もう少しお行儀の良いコードにしようと思って&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MFGPT関連のレジスタの更新ロジックを、仕様書に指定されている「前準備」−「更新」-「後始末」というシーケンスでやるようにした。&lt;/li&gt;&lt;/ul&gt;前準備ではカウンタを止めたり、割り込みを禁止したりする必要があり、後始末では関連フラグをクリアしたりしなければならないらしい。手元のALIXではそんなことをしなくても動いていたんだけど、debugする過程で書いてしまったので正式採用した。更に&lt;br /&gt;&lt;ul&gt;&lt;li&gt;watchdogの間隔を最低値（1秒）にすると運が悪い時にリブートしちゃう問題、が起こらないようにタイマーの精度を1Hzから4Hzにあげた。&lt;/li&gt;&lt;li&gt;define一つでタイマーの精度を指定できるようにした&lt;/li&gt;&lt;li&gt;まともなdebug messageを埋めた&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;あたりを入れ込んだ。&lt;br /&gt;&lt;br /&gt;元々はAMD CS5536用のコードとしてsend-prしたが、CS5536とCS5535はほとんど一緒、ということもあって共用のドライバーとして扱うことにした。で、名前もOpenBSDのglxpcibからgcscpcibという名前に変更。&lt;br /&gt;&lt;br /&gt;というわけでHEADにマージされました。&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/i386/pci/gcscpcib.c"&gt;cvsweb&lt;/a&gt;では明日以降ならみえるんじゃないかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6619997830807854434?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6619997830807854434/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6619997830807854434' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6619997830807854434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6619997830807854434'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/netbsdwatchdog-timercs5535cs5536.html' title='NetBSDでWatchdog timerを使う（CS5535/CS5536)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-7094572355174221198</id><published>2008-01-05T02:13:00.000+09:00</published><updated>2008-01-09T22:48:21.943+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(新デバイスドライバ）</title><content type='html'>NetBSDでD02HWを使うためにいろいろとやった結果、前回のubsaデバイスドライバへのパッチというアプローチではどうも差分が大きくなりすぎる、という結論に達した。新しく別のデバイスドライバとしたほうがなにかと都合がよいので、uhmodem (USB huawei modem)という名前の新しいデバイスドライバをつくってみた。と、いってもubsaとの共有部分も多いのでそのままコピーして変更するのもいまいちな気がしたので、ubsa.cをubsavar.h, ubsa_common.c, ubsa.cの3つに分解して、uhmodem.cからはubsa_common.cを介してubsaの関数を使うことにした。&lt;br /&gt;&lt;br /&gt;とりあえずdmesgを載せておく。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;uhmodem0 at uhub0 port 1 configuration 1 interface 0&lt;br /&gt;uhmodem0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;uhmodem0: mass storage only mode, reattach to enable modem&lt;br /&gt;uhmodem0: at uhub0 port 1 (addr 2) disconnected&lt;br /&gt;uhmodem0 detached&lt;br /&gt;uhmodem0 at uhub0 port 1 configuration 1 interface 0&lt;br /&gt;uhmodem0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;ucom0 at uhmodem0 portno 0: modem&lt;br /&gt;ucom1 at uhmodem0 portno 1: monitor&lt;br /&gt;umass0 at uhub0 port 1 configuration 1 interface 2&lt;br /&gt;umass0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;umass0: using SCSI over Bulk-Only&lt;br /&gt;scsibus0 at umass0: 2 targets, 1 lun per target&lt;br /&gt;cd0 at scsibus0 target 0 lun 0: &lt;huawei, mass="" 31=""&gt; cdrom removable&lt;br /&gt;&lt;/huawei,&gt;&lt;/code&gt;&lt;br /&gt;attach時のメッセージを見てわかるように、uhmodemではD02HW(E220)が提供しているすべての機能(com *2, umass *1)を同時につかえるようになっている。&lt;br /&gt;現状ではumassがつながっても、windowsのデバイスドライバが見えるだけだが、海外のほうでは、あの領域に好きなものを入れれるようなアクティビティもあるようなのでその時に役にたつかもなーくらいな気持ちでいれてみた。&lt;br /&gt;ucom0, ucom1は前者が通信用のttyで、後者がモデムの状況や通信状況をモニターするための監視用ttyだ。ucom0を使っているときでもucom1を同時にアクセスできるので、&lt;a href="http://hwhack.blogspot.com/2008/01/d02hw.html"&gt;メモ：D02HW解析&lt;/a&gt;に書いたDSFLOWRPTメッセージとか電波状態問い合わせ（^ANQUERY）の回答などを受け取れる。ユーザーインターフェイスアプリケーションを書くときには便利なはず。&lt;br /&gt;&lt;br /&gt;というわけで、patchは大きくなったのでここに乗せるのは割愛しておく。すでにNetBSDにはsend-prしてある（&lt;a href="http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=37692"&gt;kern/37692&lt;/a&gt;)ので急ぐ場合はそちらを参照すると良いかも。&lt;br /&gt;&lt;br /&gt;とりあえずやることはおわったかなーーー。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-7094572355174221198?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/7094572355174221198/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=7094572355174221198' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7094572355174221198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/7094572355174221198'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/netbsdemobile-d02hw.html' title='NetBSDでEmobile D02HWを使う(新デバイスドライバ）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5446070399027141160</id><published>2008-01-04T03:52:00.000+09:00</published><updated>2008-01-09T22:49:42.226+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><title type='text'>メモ：D02HW解析</title><content type='html'>イーモバイルのD02HW (Huawei E220のOEM)をNetBSDから使えるように触っている過程で調べたことをメモしておく。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;マスストレージモード(電源投入時)&lt;/span&gt;&lt;br /&gt;普通に認識すると、USB mass strageデバイスに見える。USB class 8(umass), subclass 6(SCSI), proto 80(BBB)。Interface 0: endpoint: 3(in)-4(out)。マウントするとCDROMにみえて、中身にwindows用のユーティリティとデバイスドライバが入っている。役立たず。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;モデムモードへの変換&lt;/span&gt;&lt;br /&gt;Host-to-DeviceでSet Future: DEVICE_REMOTE_WAKEUP, wIndex=0x2で送りつける。すると同じvender ID, product IDのままで別のデバイスに化ける。&lt;br /&gt;(wIndex=0x1にしてdataに0x1を入れて送っても同じ結果になるが、違いは不明）&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;モデムモード（変換後）&lt;/span&gt;&lt;br /&gt;モードがモデムモードになると、インターフェイスが３つに増える。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;インターフェイス１： USB class 255, subclass 255, proto 255。完璧なベンダースペシフィックだが実はシリアル。シリアルデバイスはBELKINのとほとんど同じにみえる（NetBSDだとubsaドライバ）。これがモデムの主インターフェイス。endpoint: 1(intr)-2(in)-2(out)。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;インターフェイス２：USB class 255, subclass 255, proto 255。インターフェイス１と同様にシリアルデバイス。モデムの観測用インターフェイス。endpoint: 5(in)-5(out)。通信しないからか割り込みが無い。&lt;/li&gt;&lt;li&gt;インターフェイス3: USB class 8, subclass 6, proto 80。マスストレージモードのときにインターフェイス１に見えていたUSB mass storage。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;モデムの観測用インターフェイス&lt;/span&gt;&lt;br /&gt;つなげるとATコマンドを受理する。ステートは主インターフェイスの設定を継承している（たとえばate0と主インターフェイスで打ち込んであるとATコマンドにエコーバックしない）。使い道は２つ。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;主インターフェイスで通信をしているときにもATコマンドを受理するので、AT^ANQUERY?（電波強度問い合わせ）などで状態を取得できる&lt;/li&gt;&lt;li&gt;主インターフェイスで通信しているときは定期的（２秒に一回）、^DSFLORRPTという行が出力される。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DSFLORRPT&lt;/span&gt;&lt;br /&gt;DSFLORRPTはこんな感じに出力される。（一行で）&lt;br /&gt;&lt;code&gt;&lt;br /&gt;^DSFLOWRPT:0000007C, 00000000, 00000000, 000000000001B1AE, 00000000004DD9D2, 0000AA50, 000EBA40&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;ざっくりと眺めたところ、意味は最初から[通信時間（秒)], [送信スループット(byte/s)], [受信スループット(byte/s)], [総送信量(byte/s)], [総受信量(byte/s)], [なんかのID], [なんかのID]となっているようだ。時間とデータ量は16進数で表現されている。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;謎のコマンド&lt;/span&gt;&lt;br /&gt;windows PCとD02HWの間のUSBトランザクションを眺めていると、標準的ではない制御トランザクションが観測される。何やっているか不明。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;（準備１）Endpoint:2-inにCLEAR_FEATUREリクエスト、ENDPOINT_HALTを送る&lt;/li&gt;&lt;li&gt;（準備２）Endpoint:2-outにCLEAR_FEATUREリクエスト、ENDPOINT_HALTを送る。&lt;/li&gt;&lt;li&gt;InterfaceにType:Class, bRequest=0x02, wValue=0x1, wIndex=0x0, wLength=0x2, Data[]={0x0, 0x0}を送る&lt;/li&gt;&lt;li&gt;InterfaceにType:Class,  bRequest=0x22, wValue=0x1, wIndex=0x0, wLength=0x0を送る&lt;/li&gt;&lt;li&gt;InterfaceからType:Class, bRequest=0x21, wValue=0x0, wIndex=0x0で7byte読み込む。普通は｛0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x8}が見える。&lt;/li&gt;&lt;li&gt;前のリクエストで取得したバッファの2-3byteを{0x8, 0x7}にして書き戻す。bRequest=0x20&lt;/li&gt;&lt;li&gt;InterfaceにType:Class,  bRequest=0x22, wValue=0x3, wIndex=0x0, wLength=0x0を送る&lt;/li&gt;&lt;/ol&gt;たぶん、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;bRequest=0x20: E220_CLASS_WRITE&lt;/li&gt;&lt;li&gt;ｂRequest=0x21: E220_CLASS_READ&lt;/li&gt;&lt;li&gt;bRequest=0x22: E220_CLASS_SETUP (or CMD)。ｂVlaue=0x1でstart, bValue=0x3でcommitみたいな感じ？&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;じゃないかと推測している。問題は読み書きする7byteの意味がわからない点。NetBSDで適当に実装して発行してみているが、何が変わったかはわからない。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;通信時のUSBトランザクション&lt;/span&gt;&lt;br /&gt;USBのendpointのデータ単位は64byte。TCP/IPで通信をしていると、大体46-48USBパケットがバースト的に送られてくる。モデム側のバッファサイズは3-4KBじゃないかと推測。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;（おまけ）イーモバイル網の挙動&lt;/span&gt;&lt;br /&gt;PPPで接続して普通にpingをうつと、RTTが300-400msくらいでガッカリする。しかし中身ではいろいろと複雑な制御をしているようで、5pps以上の頻度で同一ホストにパケットを送信すると、10-20パケットくらい経過してからRTTが70ms-100msに変化する。&lt;br /&gt;しばらく通信がないとまたリセットされるので、フローごとに細かい制御をしているようだ。カットスルー？でもしてるんかいな。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;とりあえずこのくらい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5446070399027141160?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5446070399027141160/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5446070399027141160' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5446070399027141160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5446070399027141160'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/d02hw.html' title='メモ：D02HW解析'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5963158547028543006</id><published>2008-01-04T02:52:00.000+09:00</published><updated>2008-01-04T03:44:16.568+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(スループット改善）(2)</title><content type='html'>&lt;div&gt;しばらくsys/dev/usbの下を眺めていたが、USB的な律速が他にあるとしても触るにはおおごとになりそうなので、別の部分から攻めることにした。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;「Windowsなら速い」という話でふと思いついたのが「TCPの動作の違い」だった。Windowsはいろいろなパラメータ調整でTCPの挙動を変えているが、それがイーモバイルの網の挙動とうまくあっているのかもしれない。または、専用ドライバがWindowsのパラメータを自分好みに変えているのかも。というわけで、NetBSDのネットワーク部分のパラメータを調整してみることにした。これはkernelにpatchを当てるとかいう話ではなく、sysctlで変えれる範囲でおこなった。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;とりあえず今のところの/etc/sysctl.confを以下に示す。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;net.inet.tcp.mss_ifmtu=1&lt;br /&gt;net.inet.tcp.init_win=8&lt;br /&gt;net.inet.tcp.sack.maxholes=64&lt;br /&gt;net.inet.tcp.sendspace=65536&lt;br /&gt;net.inet.tcp.recvspace=128000&lt;br /&gt;net.inet.udp.recvspace=65536&lt;br /&gt;kern.sbmax=2048000&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;この中で一番意味があるのがtcp.recvspaceだ。emobile網を使っていて思うのは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;遅延はある程度大きいけど、そんなに落ちない。&lt;/li&gt;&lt;/ul&gt;ということだ。そんなネットワークではtcpのバッファサイズをある程度大きくしておかないと性能がでない。主記憶の量とどのくらいのセッション数をさばくつもりなのか？というあたりと要相談だが、たぶんいまのemobile網では128KBくらいあれば良いようにみえる。主記憶に余裕があればもう少し増やしておいてもよいかもしれない。recvspaceの大きさはkern.sbmaxに制限されるのでこちらも大きくしておくべき。&lt;br /&gt;&lt;br /&gt;ここまでで、調子がよければ300KB/sを超えるようになる。気休めに/etc/ppp/peers/emobileの設定を２行ほど変えた。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# disable compressions&lt;br /&gt;novj&lt;br /&gt;##noccp&lt;br /&gt;##nobsdcomp&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;実は並列して他にもいろいろな作業をしていたので、ここに書いただけで性能がそこまで上がるかはちょっと自信がないのだが、結果的には200KB/s - 440KB/sくらいは出るようになった。&lt;br /&gt;調子の良い時はwgetで27MBくらいのmp4ファイルを転送して平均で390KB/sくらい、とそこそこの安定したスループットを見せてくれる。&lt;br /&gt;ただ、現状ではWindowsなら300KB/sでているときにNetBSDでは200KB/sしかでない、という現象が発生する。まだ隠れている設定があるのかもしれない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5963158547028543006?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5963158547028543006/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5963158547028543006' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5963158547028543006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5963158547028543006'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/netbsdemobile-d02hw2.html' title='NetBSDでEmobile D02HWを使う(スループット改善）(2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8365595714055314519</id><published>2008-01-03T13:20:00.000+09:00</published><updated>2008-01-03T14:23:10.538+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>NetBSDでEmobile D02HWを使う(スループット改善）(1)</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;このエントリーの一行まとめ&lt;/span&gt;：HTTP/TCPで29KB/sしかでなかったけど440KB/s(3.4Mbps)まで改善した。うれしい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;最近のエントリーに結構話題にしたように、いろいろとごにょごにょとして、イーモバイルのD02HW(E220)をNetBSDでも普通に使えるようになった。使えないデバイスが使えるようにする作業をしていると、「使えるようになった！」時点でだいぶ達成感がでてしまってそこでゴールに着いてしまった気になりがちだ。今回もデバイスとして認識できない段階から、まがりなりにもPPPでセッションを張って通信できるようになったわけだから、まあそれでいいや、考えてしまっていた。&lt;div&gt;ちょっと間をおいて、実際に使ってみようとおもうと、どうも変な感じがする。windowsのNote PCにつなげて使っているときはすぐに見えるwebサイトなどが見えるのがだいぶ遅い。やっぱりスループットを計測してみるか、と重い腰を上げてやってみるた。&lt;/div&gt;&lt;div&gt;wgetコマンドをつかってHTTP/TCPで、ファイルを転送するときの速度を測ってみると………。（プロトコルオーバヘッドがあるので下部層ではあと10%くらい速いはず）。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Windows  (Panasonic Let's Note R5): 1.8Mbps-2.5MBps (230KB/s-320KB/s)くらい&lt;/li&gt;&lt;li&gt;NetBSD (ALIX 3C): コンスタントに0.225Mbps (29KB/s)&lt;/li&gt;&lt;/ul&gt;うーん、軽く1/10? と少しショックを感じながら改善作業に取り組むことにした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2つの計測系で同一なのは「同じD02HWを使っている」「同じ場所で計測」「ほとんど同じ時間に計測」というところ。あとの計算機環境やソフトウェアは全部違っている。本当はできるだけそろえるべきなんだけど、Let's noteにNetBSDを入れるのもめんどくさいので実作業にうつることにした。とりあえず疑うべきは&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;D02HWの設定&lt;/li&gt;&lt;li&gt;D02HW用のデバイスドライバ&lt;/li&gt;&lt;li&gt;OSのUSBサブシステム&lt;/li&gt;&lt;li&gt;PPPの設定&lt;/li&gt;&lt;li&gt;PCの性能&lt;/li&gt;&lt;/ul&gt;あたり。ターゲットとしているALIX3は小さな組み込みボードといえども、500MHz駆動のAMD LX800で動いている。主記憶も256MBある。経験上これくらいの性能でたかだか数Mbpsのトラフィックを裁けないわけがない。USBホストのチップの問題もなさそう。というわけで、5つ目の「PCの性能」は「ほとんどなさそう」だ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;簡単なところが疑っていこうとおもって、次は「D02HW」の設定を追ってみることにした。といってもモデムとして見えるATコマンドでは無くUSBレベルでの話。USBバスアナライザでトランザクションを眺めていると、ベンダ独自のコマンドを使って設定用のレジスタをさわっているようにみえる。仕様書が無いのでこれが何を意味しているかはわからないが、設定しているということは意味があるのかもしれない？とおもってNetBSDからも同じ操作をする関数を実装してみた（どんな風にするかは後日別のエントリーで書く予定）。うーん？別に変わらない様子。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次は「デバイスドライバ」と「OSのUSBサブシステム」。一緒にみた方が良さそうなので同時に始末することにする。たぶん今回の問題の肝は「いつも同じ29KB/sである」ということだろう。windowsで見ていると、結構短い間隔でスループットが大きく変動しているのを観測できるが、NetBSDだとずっときっちりと29KB/sしかでない。つまりある層までは十分な性能があるのにかかわらずどこかに律速（ボトルネック）となる部分があってそれが原因でこんな状況になっている、と推測できる。こんなときにどこをさわればいいか？というのは、そのデータがデバイスからOSの上(tty)までどうやって流れてくるのかを理解して調べていかないといけない。幸いにも今回はD02HW対応でしばらくUSBのデバイスドライバをさわっていたので、ずいぶん勘がはたらくようになっていた。じーっとコードを眺めていると、USBのデータ処理単位とデバイスの単一のパケットサイズを同じ大きさ扱うようになっていた。たとえばUSB_ATTACH()のなかのエンドポイントディスクリプタを読んで上位のucomデバイスの送受信バッファサイズを設定するところ。&lt;/div&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; if (UE_GET_DIR(ed-&gt;bEndpointAddress) == UE_DIR_IN &amp;amp;&amp;amp;&lt;br /&gt;      UE_GET_XFERTYPE(ed-&gt;bmAttributes) == UE_BULK) {&lt;br /&gt;           uca.bulkin = ed-&gt;bEndpointAddress;&lt;br /&gt;           uca.ibufsize = UGETW(ed-&gt;wMaxPacketSize);&lt;br /&gt; } else if (UE_GET_DIR(ed-&gt;bEndpointAddress) == UE_DIR_OUT &amp;amp;&amp;amp;&lt;br /&gt;      UE_GET_XFERTYPE(ed-&gt;bmAttributes) == UE_BULK) {&lt;br /&gt;            uca.bulkout = ed-&gt;bEndpointAddress;&lt;br /&gt;            uca.obufsize = UGETW(ed-&gt;wMaxPacketSize);&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;単なるシリアルラインならともなく、D02HWは7.2Mbpsの高速シリアルデバイスなのでこれじゃだめだろうという気がする。というわけでその辺のコードをさわる。具体的には、uca（ucom attach arg構造体）のuca.ibufsize / uca.obufsizeをD02HWのパケットサイズ(64Byte)とは独立した大きさにする。試行錯誤の結果、4096Byteくらいがちょうど良い大きさだと判断した。uca構造体を設定する場所で決め打ちで4096を設定しておく。ucomとか関連する関数をチェックしたがそれで問題は無い。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ここまでの作業で、29KB/sec -&gt; 12oKB/secくらいに劇的に改善した。1Mbpsくらいでている計算になる。でもwindowsの1/3くらいでしかないので更に解析と作業を進める。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;（続く）&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8365595714055314519?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8365595714055314519/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8365595714055314519' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8365595714055314519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8365595714055314519'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2008/01/netbsdemobile-d02hw1.html' title='NetBSDでEmobile D02HWを使う(スループット改善）(1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8397930617579850240</id><published>2007-12-26T20:09:00.000+09:00</published><updated>2008-12-10T21:25:36.884+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>Emobile-Wifiルータ</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/R3I5LjvkIeI/AAAAAAAAAJA/K49M_E_N2co/s1600-h/P1000149.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_nwrLM141xU8/R3I5LjvkIeI/AAAAAAAAAJA/K49M_E_N2co/s200/P1000149.JPG" alt="" id="BLOGGER_PHOTO_ID_5148240194773983714" border="0" /&gt;&lt;/a&gt;せっかくそれなりに速い速度のアップリンクを持つイーモバイルのD02HWが使えるようになったので、イーモバイルをアップリンクにする無線アクセスポイントをつくってみた。OSはNetBSD。とりあえず手元にあったusb無線LANアダプタ（バッファローのWLI-U2-SG54HP)をつかっている。ボードはALIX.3C&lt;br /&gt;&lt;br /&gt;やることは普通のルータの設定と大体同じ。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ルータなのでkernelでipフォワードをenableする。kernelコンフィグレーションファイルでoptions GATEWAYと書いておくか、sysctl -w net.inet.ip.forwarding=1としておく。&lt;/li&gt;&lt;li&gt;ipfilterかpfでNATをできるように設定する。pfを使うときはkernelのコンフィグレーションファイルでpseudo-device   pfとpseudo-device   pflogと書いておく。ipfilterはdisableした記憶がなければ使えるはず。あとは/etc/ipf.confとか/etc/pf.confをかいておく。/etc/rc.confにpf=YESなどを書くのを忘れないように。&lt;/li&gt;&lt;li&gt;dhcpdをあげる。/etc/dhcpd.confを設定して、/etc/rc.confにdhcpd=YES dhcpd_flags="無線インターフェイス名"を書いておく。nameserverは自分のwifiインターフェイスのアドレスにしておくとよい。&lt;/li&gt;&lt;li&gt;namedをあげる。/etc/rc.confにnamed=YESとかいておく&lt;/li&gt;&lt;li&gt;pppの設定をする。前のエントリーを参照のこと。&lt;/li&gt;&lt;li&gt;無線インターフェイスの設定をする。/etc/ifconfig.インターフェイス名というファイルに書いておくと便利。たとえば、rum0を使う場合は、ifconfig rum0 media autoselect mode 11g mediaopt hostapなどと打ち込んで、hostapモードで動かす。IPアドレス、SSIDの設定も忘れずに。&lt;/li&gt;&lt;/ul&gt;最低限これだけ設定すると、ルータとして動き出す。実用に使うにはもっといろいろと作り込んでいかないといけないが、この辺からスタートするとよいんじゃないかな。&lt;br /&gt;もう少し時間と（切実な必要性）ができたらがんばる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8397930617579850240?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8397930617579850240/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8397930617579850240' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8397930617579850240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8397930617579850240'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/emobile-wifi.html' title='Emobile-Wifiルータ'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nwrLM141xU8/R3I5LjvkIeI/AAAAAAAAAJA/K49M_E_N2co/s72-c/P1000149.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6488271367914408245</id><published>2007-12-26T19:02:00.000+09:00</published><updated>2008-12-10T21:25:37.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><title type='text'>PSOC miniprog用コネクタ</title><content type='html'>PSOCをつかった回路をつくるときに、miniprogとの接続をどうしようか？っていうのはちょっとだけ悩ましい。普通の5pinのシングルラインのヘッダピンでも用は足りるけれど差し込みが安定しないし、ぼーっとしていると逆差ししてしまうかもしれない。Cypressが指定している純正の受け側のコネクタが手に入れば良いのだが秋葉原をちょっと回った感じでは難しそう。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_nwrLM141xU8/R3IptTvkIbI/AAAAAAAAAIo/YrXKmn2AdcU/s200/P1000150.JPG" alt="" id="BLOGGER_PHOTO_ID_5148223182408524210" border="0" /&gt;最近気に入っているのは、molexのこのコネクタ。秋葉原の「ネジの西川」こと&lt;a href="http://nishikawa.or.tv/"&gt;西川電子部品&lt;/a&gt;の２階のコネクタ売り場で探しているときに見つけたのだが、純正のコネクタとだいぶ近い形をしている。&lt;br /&gt;型番は&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Molex 5045-05A (ストレート)&lt;/li&gt;&lt;li&gt;Molex 5046-05A (L字)&lt;/li&gt;&lt;/ul&gt;とのこと。&lt;br /&gt;&lt;br /&gt;このままでは右の写真のようにロック部分が長くてMiniprogと干渉してしまうのだが、&lt;br /&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://2.bp.blogspot.com/_nwrLM141xU8/R3IosTvkIaI/AAAAAAAAAIg/KL5xqUrAzvI/s200/P1000151.JPG" alt="" id="BLOGGER_PHOTO_ID_5148222065717027234" border="0" /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;適当に切断すると&lt;br /&gt;&lt;div&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://3.bp.blogspot.com/_nwrLM141xU8/R3IptjvkIcI/AAAAAAAAAIw/sG_rdVBmD4A/s200/P1000152.JPG" alt="" id="BLOGGER_PHOTO_ID_5148223186703491522" border="0" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;ぴたりとはまるようになる。&lt;br /&gt;&lt;div&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer;" src="http://4.bp.blogspot.com/_nwrLM141xU8/R3IptzvkIdI/AAAAAAAAAI4/VQFh2xACyZ4/s200/P1000153.JPG" alt="" id="BLOGGER_PHOTO_ID_5148223190998458834" border="0" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;というわけで、秋葉原にアクセスできる人はこーいう方法もある、ということで。写真ではストレートコネクタを例につかったが、L字型のほうが使うことは多いかな。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6488271367914408245?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6488271367914408245/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6488271367914408245' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6488271367914408245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6488271367914408245'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/psoc-miniprog.html' title='PSOC miniprog用コネクタ'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_nwrLM141xU8/R3IptTvkIbI/AAAAAAAAAIo/YrXKmn2AdcU/s72-c/P1000150.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3864229497120070016</id><published>2007-12-26T18:19:00.000+09:00</published><updated>2007-12-26T18:34:32.604+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(設定編)</title><content type='html'>NetBSDのpppdのemobileにつなげる方法を教えてもらったので設定してみた。設定をまとめておく。&lt;br /&gt;(まだ最適化はされていないので冗長な記述などがあるかもしれない）&lt;br /&gt;&lt;br /&gt;設定するファイルは以下の5つ&lt;br /&gt;&lt;ul&gt;&lt;li&gt;/etc/ppp/peers/emobile&lt;/li&gt;&lt;li&gt;/etc/ppp/chat-emobile&lt;/li&gt;&lt;li&gt;/etc/ppp/ip-up&lt;/li&gt;&lt;li&gt;/etc/ppp/ip-down&lt;/li&gt;&lt;li&gt;/etc/ppp/chap-secret&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;これらを設定して、ppp call emobile を実行すればいい感じにPPPセッションが確立してくれる。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/etc/ppp/peers/emobile&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;dtyU0 460800 crtscts&lt;br /&gt;lock&lt;br /&gt;nodetach&lt;br /&gt;hide-password&lt;br /&gt;local&lt;br /&gt;noauth&lt;br /&gt;# dns routing&lt;br /&gt;usepeerdns&lt;br /&gt;defaultroute&lt;br /&gt;noipdefault&lt;br /&gt;# disable compressions&lt;br /&gt;novj&lt;br /&gt;noccp&lt;br /&gt;nobsdcomp&lt;br /&gt;# auth&lt;br /&gt;user "em"&lt;br /&gt;# misc? (xxx)&lt;br /&gt;ipcp-restart 8&lt;br /&gt;ipcp-max-configure 50&lt;br /&gt;ipcp-accept-local&lt;br /&gt;ipcp-accept-remote&lt;br /&gt;# connect script&lt;br /&gt;connect '/usr/sbin/chat -v -f /etc/ppp/chat-emobile -T *99***1#'&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/etc/ppp/chat-emobile&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ABORT "NO CARRIER"&lt;br /&gt;ABORT "NO DIALTONE"&lt;br /&gt;ABORT "ERROR"&lt;br /&gt;ABORT "NO ANSWER"&lt;br /&gt;ABORT "BUSY"&lt;br /&gt;ECHO ON&lt;br /&gt;SAY "Connecting"&lt;br /&gt;TIMEOUT 15&lt;br /&gt;"" "\d\d\dat\r\dat"&lt;br /&gt;TIMEOUT 5&lt;br /&gt;"OK-\Kat-OK" "at"&lt;br /&gt;OK "at&amp;amp;FE1V1X1&amp;amp;D2&amp;amp;C1S0=0"&lt;br /&gt;OK "at+ipr=230400"&lt;br /&gt;SAY "Let's go"&lt;br /&gt;OK "atdt\T"&lt;br /&gt;CONNECT ''&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/etc/ppp/ip-up&lt;/span&gt;　(chmod 0755 /etc/ppp/ip-upしておくこと)&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;~&lt;br /&gt;f [ -f /etc/ppp/resolv.conf ]; then&lt;br /&gt;      chmod 644 /etc/ppp/resolv.conf&lt;br /&gt;      cp /etc/resolv.conf /etc/resolv.conf-&lt;br /&gt;      if [ ${USEPEERDNS:-0} -eq 1 ]; then&lt;br /&gt;              cp /etc/ppp/resolv.conf /etc/resolv.conf&lt;br /&gt;              chmod 644 /etc/resolv.conf&lt;br /&gt;      fi&lt;br /&gt;fi&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/etc/ppp/ip-down &lt;/span&gt;(chmod 0755 /etc/ppp/ip-downしておくこと）&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;#&lt;br /&gt;if [ -f /etc/resolv.conf- -a ${USEPEERDNS:-0} -eq 1 ]; then&lt;br /&gt;      mv /etc/resolv.conf /etc/resolv.conf.old&lt;br /&gt;      cp /etc/resolv.conf- /etc/resolv.conf&lt;br /&gt;      chmod 644 /etc/resolv.conf&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ -f /etc/ppp/resolv.conf ]; then&lt;br /&gt;      mv /etc/ppp/resolv.conf /etc/ppp/resolv.conf-&lt;br /&gt;fi&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;/etc/ppp/chap-secret&lt;/span&gt; (chmod 0600 /etc/ppp/chap-secretしておくこと）&lt;br /&gt;&lt;code&gt;&lt;br /&gt;em     *     em&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3864229497120070016?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3864229497120070016/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3864229497120070016' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3864229497120070016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3864229497120070016'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw.html' title='NetBSDでEmobile D02HWを使う(設定編)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-847855923195309379</id><published>2007-12-26T02:12:00.000+09:00</published><updated>2008-12-10T21:25:38.241+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>USBアナライザとD02HW</title><content type='html'>「NetBSDでD02HWをつかう」では比較的（というかほぼ全部）試行錯誤でデバイスの設定に必要な条件を推測してデバイスドライバへのパッチを作成した。ハードウェアを触るときによく感じることは「見えないものはわからない」ということだ。当たり前のことだが、電気信号は眼にはみえないので、推測するしかなくそれはいつまでも推測のままで推移してしまう。電圧を測るのにテスターが必要で、時間ドメインの波形をみるのにオシロスコープが必要なように、扱う事象を見るための専用の「アナライザ」が必要になることは多い。実はとある目的のためにUSBバスアナライザが手元にあったので、D02HWのデバイスドライバ作成作業を検証してみることにした。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/R3E7oDvkIXI/AAAAAAAAAII/BUEmIe-hB7k/s1600-h/SANY0080.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_nwrLM141xU8/R3E7oDvkIXI/AAAAAAAAAII/BUEmIe-hB7k/s320/SANY0080.JPG" alt="" id="BLOGGER_PHOTO_ID_5147961408446800242" border="0" /&gt;&lt;/a&gt;手元にあるのは&lt;a href="http://www.ellisys.com/"&gt;ellisys&lt;/a&gt;の&lt;a href="http://www.ellisys.com/products/usbex200/index.php"&gt;USB Explorer 200&lt;/a&gt;だ。これは、USB2.0のHighSpeed(480Mbps)に対応したアナライザで、Windowsソフトウェアと組み合わせることでだいたいすべてのUSBイベントを表示してくれる、という便利な逸品である。ソフトウェアは誰でもダウンロードできるようになっていて、USBバスのキャプチャファイルを入手したときに誰でも表示できるのがうれしい（ちなみにキャプチャファイルの拡張子はUFOだ）。&lt;br /&gt;写真でわかるように、アナライザを解析ソフトが入っているPCにつなげて、デバイスとデバイスをつなげるホストの間にはさむようにアナライザを配置する。これで、デバイスとホスト間のデータをインターセプトするという仕組みになっている。&lt;br /&gt;まず、Windowsで動かしてみたときにUSBバスにどんなトランザクションが発生しているかを見てみた。&lt;br /&gt;「&lt;a href="http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw3.html"&gt;NetBSDでEmobile D02HWを使う(3)&lt;/a&gt;」にあるUSBのインターフェイスとエンドポイントの情報を見ながら、どのエンドポイントとホストがどんな通信をしているかを眺めてみる。アナライザは、&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/R3E-4zvkIYI/AAAAAAAAAIQ/KuodqdnRpUo/s1600-h/41a538aac1aaddad7bfddd17060e5f4e.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_nwrLM141xU8/R3E-4zvkIYI/AAAAAAAAAIQ/KuodqdnRpUo/s320/41a538aac1aaddad7bfddd17060e5f4e.png" alt="" id="BLOGGER_PHOTO_ID_5147964994744492418" border="0" /&gt;&lt;/a&gt;たとえばこんな情報が表示されて、トランザクションのタイプと中身のデコード結果をだしてくれるので、それとUSB2.0の仕様書(&lt;a href="http://www.usb.org/developers/docs/"&gt;このへんにある&lt;/a&gt;）を眺めながら追っていく。赤裸々にどんなトランザクションをやりとりしているかを見ていてわかったことは以下の３つ。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NetBSDにつくったパッチは正しい。&lt;/li&gt;&lt;li&gt;ATコマンドいろいろ&lt;/li&gt;&lt;li&gt;D02HWは実はさらに別のインターフェイスをもっている。&lt;/li&gt;&lt;/ul&gt;最初のは、結局あのシーケンスを送らないとデバイスは言うことをきいてくれないみたいだ、ということを追認できたということだ。ちゃんとUSB2.0の仕様書を読み込むと、あのメッセージは&lt;br /&gt;&lt;ul&gt;&lt;li&gt;デバイスへのスタンダードのリクエスト（SET_FEATURE)でHost→Device&lt;/li&gt;&lt;li&gt;リクエストタイプはDEVICE_REMOTE_WAKEUP&lt;/li&gt;&lt;li&gt;wIndexの0x2はendpoint2を意味する&lt;/li&gt;&lt;/ul&gt;ということだった。アナライザでの結果をみるとendpoint２はモデムの主通信用のパイプなので、これで意味がわかってすっきりした。&lt;br /&gt;２つめのATコマンドいろいろはたぶんWindowsとかのモデム定義ファイルをみればわかる情報なので大した追加情報ではない。問題は３つめで、確かに「&lt;a href="http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw3.html"&gt;NetBSDでEmobile D02HWを使う(3)&lt;/a&gt;」では、モデムとして認識されるようになると3つのインターフェイスディスクリプタが見えている。ひとつはモデムでひとつはUSBストレージデバイスだ、ということもわかっていたが、実はなぜもうひとつみえるのか、は謎のまま残っていた。まだ実際にコードを書いて叩いてみたわけではないのだが、USBのBUSトランザクションを見る限り、&lt;br /&gt;&lt;code&gt;&lt;br /&gt;INTERFACE descriptor 1:&lt;br /&gt;bLength=9 bDescriptorType=interface(4) bInterfaceNumber=1 bAlternateSetting=0&lt;br /&gt;bNumEndpoints=2 bInterfaceClass=255 bInterfaceSubClass=255&lt;br /&gt;bInterfaceProtocol=255 iInterface=3(Data Interface)&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=5-in&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=5-out&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;のendpoint5はもう一本のモデム制御用のパイプらしい。まだ憶測だが、endpoint2でデータ通信しながらでもモデムが管理しているHSDPA由来の制御情報などを並列してとれるのではないかと予想している。これを扱うデバイスドライバかくのはどうしたもんか、と悩みがふえてしまった（しばらくはきっとやらないけどね）。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(12/28追記：実験してみたらモデムモードに入った後は３本ともシリアルらしい。２本目をはやすハックをしてみた、あとで詳しく書く予定）&lt;br /&gt;(12/30追記：やっぱり３本目はusb mass strageだとおもうなあ。コードかいてみるか。。）&lt;br /&gt;(1/4追記：usb mass strageでした。）&lt;br /&gt;&lt;br /&gt;というわけで、アナライザを使うとみたいことも見えるけど、まったく気が付いていなかったようなことも見えてしまう、ってことで。今回はおしまい。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-847855923195309379?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/847855923195309379/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=847855923195309379' title='3 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/847855923195309379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/847855923195309379'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/usbd02hw.html' title='USBアナライザとD02HW'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/R3E7oDvkIXI/AAAAAAAAAII/BUEmIe-hB7k/s72-c/SANY0080.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-9020655683396261877</id><published>2007-12-25T16:39:00.001+09:00</published><updated>2008-05-13T15:21:18.399+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(4)</title><content type='html'>Windowsやmacのドライバでは抜き差しせずとも使えるということは、なんらかの方法でこの２つのモードの切り替えができるはずだ。機能の切り替え、はデバイス毎の特有の操作なので一般的な方法は存在しない。USBのバスアナライザとかがあれば、windowsのドライバの挙動などを観察して切り替えるための魔法の言葉を見つけることもできるのだが、休日に家で作業をしていたので手元にそんな便利なものはなかった。&lt;br /&gt;というわけでいろいろと試行錯誤してみることにする。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;試行１：D02HW(E220)のファームウェアの立ち上がりが遅くてうまく処理ができていないのでは無いかと思って、attachルーチンのあちこちにdelayを入れてみる。あちこちにusbd_delay_ms(dev, 500); などと書いてみて、挙動がどう変わるか地道な作業をがんばる（２時間くらい）。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;   /* Find the endpoints */&lt;br /&gt;   usbd_delay_ms(dev, 2000);&lt;br /&gt;   id = usbd_get_interface_descriptor(sc-&gt;sc_iface);&lt;br /&gt;   sc-&gt;sc_iface_number = id-&gt;bInterfaceNumber;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;あたりに2000msくらいのdelayをいれると、認識しない→差し直すと認識→次に刺し直すと認識しない→また差し直すと認識、と安定してツンとデレを繰り返すようになった。しかしディレイを入れるだけではどうもこれ以上は進まないようだ。次の方法を考えないといけない、ネットワークで識者（USBシリアルの偉い人）と相談するととりあえずVENDORリクエストなどで適当な値をおくってデバイスをつつくかくすぐるかしてやるのがいい、と助言をうけた。設計している人も人の子なので別に難しい値ではなく0とか1とか2とかそんな値を送ると動き出すことがあるらしい。&lt;br /&gt;&lt;br /&gt;というわけで、&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/usb/uplcom.c"&gt;sys/dev/usb/uplcom.c&lt;/a&gt;を参考にして実験用にubsa_reset()という関数をでっちあげてみた。&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;static  usbd_status&lt;br /&gt;ubsa_reset(struct ubsa_softc *sc)&lt;br /&gt;{&lt;br /&gt;    usb_device_request_t req;&lt;br /&gt;    usbd_status err;&lt;br /&gt;#define UBSA_SET_REQUEST 0x1&lt;br /&gt;&lt;br /&gt;    req.bmRequestType = UT_WRITE_VENDOR_DEVICE;&lt;br /&gt;    req.bRequest = UBSA_SET_REQUEST;&lt;br /&gt;    USETW(req.wValue, 0);&lt;br /&gt;    USETW(req.wIndex, sc-&gt;sc_iface_number);&lt;br /&gt;    USETW(req.wLength, 0);&lt;br /&gt;&lt;br /&gt;    err = usbd_do_request(sc-&gt;sc_udev, &amp;amp;req, 0);&lt;br /&gt;    if (err) {&lt;br /&gt;            printf("%s: send reset fail\n", __func__);&lt;br /&gt;            return (EIO);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return (0);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;試行2: ubsa_reset()関数をattachの適当な場所においてみて挙動を見る。が、デバイスからお断りのエラーが返ってくるのでどうもうまくいかないらしい。&lt;/li&gt;&lt;li&gt;試行3: bmRequestType を UT_WRITE_DEVICEにしてbRequest = UR_SET_FEATUREにしてやってみることにする。これはUSBの標準機能なので失敗することはないはず。コードは適当に改変する。&lt;/li&gt;&lt;/ul&gt;ここで変化が起こった。なんとリクエストを送りつけると、抜き差ししてもモードの変換が発生せずに常にモデムとして見えない状態になる。「逆行してるじゃん」と思うのは素人だ。なにかアクションが返ってきたと言うことは、その近くに正解が隠れている可能性が高い。試行錯誤を繰り返して問題を追い込んでいくことにする。ここまで７時間近く作業をしていてどうもだれぎみだったのが、ちょっとテンションがあがってきた記憶がある。脳内麻薬でもでていたんじゃないかな。しばらくするとリクエストのwIndexの値を0x2にすると、デバイス側がUSBリセットをかけてきて一度デタッチされ、再度OSがアタッチするときにはモデムに化けている、という挙動をするということが判明。ようやくつねにデレにするマジックワードをゲットできた。&lt;br /&gt;&lt;br /&gt;あとはコードをまとめるだけだが、最終的には、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/*&lt;br /&gt;* Hauwei E220 needs special request to enable modem function&lt;br /&gt;* XXX: is there more smart methods?&lt;br /&gt;*/&lt;br /&gt;Static  usbd_status&lt;br /&gt;ubsa_e220_modechange_request(struct ubsa_softc *sc)&lt;br /&gt;{&lt;br /&gt;#define UBSA_E220_MODE_CHANGE_REQUEST 0x2&lt;br /&gt;      usb_device_request_t req;&lt;br /&gt;      usbd_status err;&lt;br /&gt;&lt;br /&gt;      req.bmRequestType = UT_WRITE_DEVICE;&lt;br /&gt;      req.bRequest = UR_SET_FEATURE;&lt;br /&gt;      USETW(req.wValue, 0x1);&lt;br /&gt;      USETW(req.wIndex, UBSA_E220_MODE_CHANGE_REQUEST);&lt;br /&gt;      USETW(req.wLength, 0);&lt;br /&gt;&lt;br /&gt;      DPRINTF(("%s: send e220 mode change request\n", __func__));&lt;br /&gt;      err = usbd_do_request(sc-&gt;sc_udev, &amp;amp;req, 0);&lt;br /&gt;      if (err) {&lt;br /&gt;              DPRINTF(("%s: E220 mode change fail\n", __func__));&lt;br /&gt;              return (EIO);&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      return (0);&lt;br /&gt;#undef UBSA_E220_MODE_CHANGE_REQUEST&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;みたいな呼び出しをUBSA_ATTACH()の中で&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;      /* Find the endpoints */&lt;br /&gt;      /* Hauwei E220 need special request to change its mode to modem */&lt;br /&gt;      if (sc-&gt;sc_devtype_e220) {&lt;br /&gt;              err = ubsa_e220_modechange_request(sc);&lt;br /&gt;              if (err) {&lt;br /&gt;                      printf("%s: failed to change mode: %s\n",&lt;br /&gt;                              devname, usbd_errstr(err));&lt;br /&gt;                      sc-&gt;sc_dying = 1;&lt;br /&gt;                      goto error;&lt;br /&gt;              }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      id = usbd_get_interface_descriptor(sc-&gt;sc_iface);&lt;br /&gt;      sc-&gt;sc_iface_number = id-&gt;bInterfaceNumber;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;こんなふうに呼び出す実装にしてみた。このカーネルでは、&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ubsa0 at uhub0 port 2&lt;br /&gt;ubsa0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;ubsa0: HUAWEI E220 need to re-attach to enable modem function&lt;br /&gt;ubsa0: at uhub0 port 2 (addr 2) disconnected&lt;br /&gt;ubsa0 detached&lt;br /&gt;ubsa0 at uhub0 port 2&lt;br /&gt;ubsa0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;ucom0 at ubsa0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;みたいに自動的にucom0がアタッチされるようになる。いったんdettachされるのが美しいか？みたいな議論をするともめそうだけど、デバイスの仕様ってことで許してくれないかなーとコッソリ期待している。&lt;br /&gt;&lt;br /&gt;tipでucom0につなげてみると、こんな感じにみえる。userland-PPPでemにもつながったので、たぶんこれでサポートのためのハックは完了。実はまだNetBSDのkernel ppp(pppd)の設定がうまくいかないので、設定方法を教えてくれる人も募集中。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#tip dtyU0&lt;br /&gt;connected&lt;br /&gt;at&lt;br /&gt;OK&lt;br /&gt;atI&lt;br /&gt;Manufacturer: huawei&lt;br /&gt;Model: D02HW&lt;br /&gt;Revision: 11.005.08.00.168&lt;br /&gt;IMEI: 3560600XXXXXXXX&lt;br /&gt;+GCAP: +CGSM,+DS,+ES&lt;br /&gt;&lt;br /&gt;OK&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;というわけで、D02HWを動かせるようになるまでに実際にどんな作業をしたかを書いてみた。この手の情報はできた後のコード解説程度が多いが、作業をした過程とか、どんな事を考えて作業したかとか、どんな失敗をしたか、って情報の方が、自分で同じような作業をするときに役に立つ気がしている。&lt;br /&gt;あと、半年たつと自分でも何やったのか忘れることがあるので備忘録にもなることを期待しながら、できる限りこんな感じの作業記録をとってみたいなあーと考えている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-9020655683396261877?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/9020655683396261877/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=9020655683396261877' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/9020655683396261877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/9020655683396261877'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw4.html' title='NetBSDでEmobile D02HWを使う(4)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1983452281520441508</id><published>2007-12-24T16:52:00.000+09:00</published><updated>2007-12-24T17:13:26.210+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(3)</title><content type='html'>インスタントに「NetBSDでイーモバイルを使う方法」が書いてあるかというとそうでもなくて残念だと思う人もいるかもしれない。今回書いたpatchはすでにNetBSDには&lt;a href="http://www.NetBSD.org/cgi-bin/query-pr-single.pl?number=37600"&gt;送ってある&lt;/a&gt;のだがこれが採用されるかどうかはまだ不明なので、最近の-currentをCVSチェックアウトしただけでは現状では使えない。今回も「どうやってUSBデバイスを動かすようにしたか」というネタが続いているのでその辺に興味があるならおつきあい頂きたい。&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;現状のubsaドライバではどうもうまくD02HW(E220)をアタッチできないので、もう少し先人達の知恵を借りることにした。FreeBSD系のメーリングリストを眺めるとこんな記述があった：「いったん接続して認識に失敗してから、ゆっくりとUSBコネクタを引き抜いてデタッチされた瞬間にもう一度指し直せば認識する（かも）」（意訳）、最初みたときは何のおまじないかと思っていたのだが、再度好意的に解釈し直すと「電気的な接続を切らずに信号線だけ切りはなして再接続するといんじゃない？」と言っているようにも思える。というわけでやってみた。数回トライすると、本当に認識してucom0が生えてきた。なんで？と思うとこの状態ではさっきまで見えなかったエンドポイントが複数見えるようになっており、その中にインタラプトエンドポイントが含まれている。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;usbctlというコマンドでUSBのデバイスの情報を取得してみると、差し直しの前後で全然別物のデバイスになってしまったようにみえる。長いけど抜粋してみるとこんな感じ。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;元々の情報&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DEVICE addr 2&lt;br /&gt;DEVICE descriptor:&lt;br /&gt;bLength=18 bDescriptorType=device(1) bcdUSB=1.10 bDeviceClass=0 bDeviceSubClass=&lt;br /&gt;0&lt;br /&gt;bDeviceProtocol=0 bMaxPacketSize=64 idVendor=0x12d1 idProduct=0x1003 bcdDevice=0&lt;br /&gt;iManufacturer=1(HUAWEI Technologies) iProduct=2(HUAWEI Mobile) iSerialNumber=0()&lt;br /&gt; bNumConfigurations=1&lt;br /&gt;&lt;br /&gt;CONFIGURATION descriptor 0:&lt;br /&gt;bLength=9 bDescriptorType=config(2) wTotalLength=32 bNumInterface=1&lt;br /&gt;bConfigurationValue=1 iConfiguration=0() bmAttributes=a0 bMaxPower=500 mA&lt;br /&gt;&lt;br /&gt;INTERFACE descriptor 0:&lt;br /&gt;bLength=9 bDescriptorType=interface(4) bInterfaceNumber=0 bAlternateSetting=0&lt;br /&gt;bNumEndpoints=2 bInterfaceClass=8 bInterfaceSubClass=6&lt;br /&gt;bInterfaceProtocol=80 iInterface=0()&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=3-in&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=4-out&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;current configuration 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;差しなおした後の情報&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DEVICE addr 2&lt;br /&gt;DEVICE descriptor:&lt;br /&gt;bLength=18 bDescriptorType=device(1) bcdUSB=1.10 bDeviceClass=0 bDeviceSubClass=&lt;br /&gt;0&lt;br /&gt;bDeviceProtocol=0 bMaxPacketSize=64 idVendor=0x12d1 idProduct=0x1003 bcdDevice=0&lt;br /&gt;iManufacturer=1(HUAWEI Technologies) iProduct=2(HUAWEI Mobile) iSerialNumber=0()&lt;br /&gt; bNumConfigurations=1&lt;br /&gt;&lt;br /&gt;CONFIGURATION descriptor 0:&lt;br /&gt;bLength=9 bDescriptorType=config(2) wTotalLength=85 bNumInterface=3&lt;br /&gt;bConfigurationValue=1 iConfiguration=0() bmAttributes=a0 bMaxPower=500 mA&lt;br /&gt;&lt;br /&gt;INTERFACE descriptor 0:&lt;br /&gt;bLength=9 bDescriptorType=interface(4) bInterfaceNumber=0 bAlternateSetting=0&lt;br /&gt;bNumEndpoints=3 bInterfaceClass=255 bInterfaceSubClass=255&lt;br /&gt;bInterfaceProtocol=255 iInterface=3(Data Interface)&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=1-in&lt;br /&gt;bmAttributes=interrupt wMaxPacketSize=16 bInterval=128&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=2-in&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=2-out&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;INTERFACE descriptor 1:&lt;br /&gt;bLength=9 bDescriptorType=interface(4) bInterfaceNumber=1 bAlternateSetting=0&lt;br /&gt;bNumEndpoints=2 bInterfaceClass=255 bInterfaceSubClass=255&lt;br /&gt;bInterfaceProtocol=255 iInterface=3(Data Interface)&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=5-in&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=5-out&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;INTERFACE descriptor 2:&lt;br /&gt;bLength=9 bDescriptorType=interface(4) bInterfaceNumber=2 bAlternateSetting=0&lt;br /&gt;bNumEndpoints=2 bInterfaceClass=8 bInterfaceSubClass=6&lt;br /&gt;bInterfaceProtocol=80 iInterface=0()&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=3-in&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;ENDPOINT descriptor:&lt;br /&gt;bLength=7 bDescriptorType=endpoint(5) bEndpointAddress=4-out&lt;br /&gt;bmAttributes=bulk wMaxPacketSize=64 bInterval=0&lt;br /&gt;&lt;br /&gt;current configuration 1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;つまり、差しなおしたあとのデバイスには元々見えなかったインターフェイスが生成されていて、それがみえると今回の目的であるモデムとして利用できるようになる、ということらしい。裏技みたいな「ゆっくりやさしくぬいて、素早くさす」みたいなことを何回もやるのは大変なので、USBのプロトコル的にうまくできないか？という方針のまま作業をすすめていくことにする。&lt;br /&gt;&lt;br /&gt;続く&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1983452281520441508?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1983452281520441508/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1983452281520441508' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1983452281520441508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1983452281520441508'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw3.html' title='NetBSDでEmobile D02HWを使う(3)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8728834109872537127</id><published>2007-12-24T04:38:00.000+09:00</published><updated>2007-12-24T05:11:16.585+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(2)</title><content type='html'>CS5536を扱った時は十分に詳しい仕様書が入手できて先がみえる作業（つまり作ればできる）だったが、今回のD02HW(E220)に関しては外部の仕様書が存在しないため、いろいろと試行錯誤が必要となる。幸いにも、「ごにょごにょすると動く」とか「不十分だけど動くかも」といった情報があるし、Linuxでは動いているらしいのであまり深刻にならずにやってみることにしよう（ま、楽しみでやっているわけだし）。&lt;br /&gt;前回のエントリでも出したが、この段階では接続するとこんなメッセージがkernelから出力される。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ubsa0 at uhub0 port 2&lt;br /&gt;ubsa0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;usbd_set_config_index: illegal index&lt;br /&gt;ubsa0: failed to set configuration: INVAL&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;問題となっている部分として目につくのが"usbd_set_condig_index: illegal index"の部分だ。ベースとなる&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/usb/ubsa.c"&gt;sys/dev/usb/ubsa.c&lt;/a&gt;を開くと、その部分はUSB_ATTACH(ubsa)の中のこんなコードだった。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; /* Move the device into the configured state. */&lt;br /&gt; err = usbd_set_config_index(dev, UBSA_CONFIG_INDEX, 1);&lt;br /&gt; if (err) {&lt;br /&gt;     printf("%s: failed to set configuration: %s\n",&lt;br /&gt;        devname, usbd_errstr(err));&lt;br /&gt;        sc-&gt;sc_dying = 1;&lt;br /&gt;        goto error;&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;usbd_set_config_index()の実体は&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/usb/usb_subr.c"&gt;sys/deb/usb/usb_subr.c&lt;/a&gt;にあるので見てみると、USBのデバイス的に「そんなINDEXはないよ」ということを意味している。ここでデバイスに頑張れといっても無い袖を振ってくれるわけでもないので、ここはUBSA_CONFIG_INDEXの値があっていないのだろうと考えるのが正しそう。もともとの値は1だったので、とりあえず0にしたkernelを作って試してみる。&lt;br /&gt;&lt;br /&gt;すると別のメッセージが出るようになる。ubsa.cをみると、それなりにコードの先のほうまで進んでいるようだ。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ubsa0 at uhub1 port 2&lt;br /&gt;ubsa0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;ubsa0: Could not find interrupt in&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;該当部分のコードは、さっきと同じUSB_ATTACH(ubsa)の中の、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;if (sc-&gt;sc_intr_number == -1) {&lt;br /&gt; printf("%s: Could not find interrupt in\n", devname);&lt;br /&gt; sc-&gt;sc_dying = 1;&lt;br /&gt; goto error;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;である。ちょっと前の方にもどって追ってみると、USBデバイス(D02HW)からエンドポイントを取得してみたけど必要な割り込み用のエンドポイントをもらえなかった、のであきらめちゃう、ということらしい。割り込み用のエンドポイントがもらえないのは一大事なのでデバイスドライバとしてはあきらめるのは当然だとは思うが、動かしたい人としてはそれでは困る。&lt;br /&gt;可能性としては、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;このデバイスは割り込みエンドポイントがない変なシリアルデバイスである&lt;/li&gt;&lt;li&gt;本来は割り込みポイントがあるが何らかの問題で見えていない&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;のどちらかだが、「ガシガシさしなおしていたら見えたことがある」とかいうWebなどでの報告を信じる限り、どちらかというと後者の可能性が高い。もし前者だったとしたらシリアル通信のドライバとして全然別のロジックが必要になるから偶然で動くなんて考えづらいからだ。つまり、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;残りのコードはおおむねあっていて、うまくデバイスとしてコンフィグレーションできていない&lt;/li&gt;&lt;/ul&gt;じゃないかと予測して次のステップに進むことにした。&lt;br /&gt;&lt;br /&gt;続く&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8728834109872537127?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8728834109872537127/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8728834109872537127' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8728834109872537127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8728834109872537127'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw2.html' title='NetBSDでEmobile D02HWを使う(2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6515876827747722500</id><published>2007-12-22T15:15:00.000+09:00</published><updated>2007-12-24T04:13:44.040+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Emobile'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><title type='text'>NetBSDでEmobile D02HWを使う(1)</title><content type='html'>&lt;a href="http://emobile.jp/"&gt;イーモバイル&lt;/a&gt;の&lt;a href="http://emobile.jp/products/hw/d02hw/"&gt;D02HW&lt;/a&gt;が手元に来たので、&lt;a href="http://www.netbsd.org/"&gt;NetBSD&lt;/a&gt;で動かせるようにしてみた。今回はそのあたりの話を書いてみることにする。&lt;br /&gt;D02HWはD01HWとほとんど同じハードウェアで、&lt;a href="http://www.huawei.com/"&gt;HUAWEI&lt;/a&gt;の&lt;a href="http://www.huawei.com/mobileweb/en/products/view.do?id=282"&gt;E220&lt;/a&gt;のOEM製品である。今回も手をつける前にとりあえずgoogleとかしてみると、動いたとか動かないとかどうも歯切れがわるい。NetBSDの場合ではcurrent-usersという最新版の開発ブランチのkernelに関する話題を扱うメーリングリストがあるのだが、いくつかのスレッドがあった割には実際のコードには反映されていない状態だった。&lt;br /&gt;まあ、手元に実際のデバイスがあるから、と手をつけてみることにした。&lt;br /&gt;&lt;br /&gt;D02HWはUSBのHSDPAモデムだが、モデムの機能の前にデフォルトではUSBストレージデバイスとして認識されるようになっている。たとえば、なんの設定もしていないNetBSDではumassデバイスとして認識・アタッチされて、CDROMとして中身をmountできるようになる。中身はwindows用のデバイスドライバ群で、NetBSDでモデムとして使おうとして思っているときには何の役にもたたない。差し込みのたびにumassとして認識されるのもうるさかったので、まずそのへんをdisableする。umassのdevice driverは&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/usb/umass.c"&gt;sys/dev/usb/umass.c&lt;/a&gt;あたりにある。中身をざっと見てみると特定のデバイス毎の特別な設定を書くためのhookが用意されていて、&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/usb/umass_quirks.c"&gt;sys/dev/usb/umass_quirks.c&lt;/a&gt;に追加できるようになっている。今回は単純にattachされないようにするだけなので、&lt;code class="prettyprint"&gt;Static const struct umass_quirk umass_quirks[] = {&lt;/code&gt;の中に&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;{ { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220 },&lt;br /&gt;   0, 0, 0, 0, 0, NULL, NULL&lt;br /&gt;},&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;というエントリーを追加した。これで、USBのベンダIDがHUAWEIでプロダクトIDがE220のデバイスはUSBストレージデバイスとして認識されなくなる。NetBSDでは、専用のドライバが存在しないデバイスはugen（汎用USBデバイス）としてattachされるので、umassをdisableすると次からはD02HW(E220)はugenとして認識されるようになる。&lt;br /&gt;&lt;br /&gt;このあたりでugenとして認識されたD02HWをユーザーランドからlibusbをつかってなんか操作できないかと、数時間時間を費やしてみたが、得たものは&lt;br /&gt;&lt;ul&gt;&lt;li&gt;NetBSDのlibusbはugenとして認識されたデバイスしか触れないということを認識&lt;/li&gt;&lt;li&gt;libusbを使った基本的なプログラムの書き方と経験&lt;/li&gt;&lt;/ul&gt;だけで、今回のデバイスドライバつくりに特に役に立つことは（その時点では）なかった。今思えば、あの段階でうまくugen&amp;amp;libusbを使うことで不明なUSBのコマンドを探すような場合に役にたつかも、と思えるようになったので、まあ費やした時間は無駄ではなかった（ことにした）。&lt;br /&gt;&lt;br /&gt;と、ここからが本題となる。まずは先人達が到達したところまで追い付かなければならない。ベースとなっているUSBシリアルドライバはubsaドライバ(&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/usb/ubsa.c"&gt;sys/dev/usb/ubsa.c&lt;/a&gt;)なので、このドライバがD02HWのドライバとなるように、&lt;code class="prettyprint"&gt;Static const struct usb_devno ubsa_devs[] = {&lt;/code&gt;に&lt;br /&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;    /* HUAWEI E220 / Emobile D0[12]HW */&lt;br /&gt;    { USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E220 }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;と追加する。この段階でkernelをつくってD02HWを接続すると&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ubsa0 at uhub0 port 2&lt;br /&gt;ubsa0: HUAWEI Technologies HUAWEI Mobile, rev 1.10/0.00, addr 2&lt;br /&gt;usbd_set_config_index: illegal index&lt;br /&gt;ubsa0: failed to set configuration: INVAL&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;と表示される。確かに問題がある、というところで概ねこのデバイスを触る準備が整った気になる。ちょっと一休み。&lt;br /&gt;&lt;br /&gt;具体的な料理の方法は次のエントリーで説明する予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6515876827747722500?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6515876827747722500/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6515876827747722500' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6515876827747722500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6515876827747722500'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdemobile-d02hw1.html' title='NetBSDでEmobile D02HWを使う(1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-872705399248136924</id><published>2007-12-22T04:01:00.000+09:00</published><updated>2007-12-22T04:07:02.532+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>ALIXとNetBSD（補足）</title><content type='html'>そういえば、ALIXボードでNetBSDを動かしているときに不可解なハングアップに陥る状況があった。カーネルを触っている時期だったので、ずいぶん「自分のコードがわるい」んだとおもって問題点を探すために時間をつかってしまった。&lt;br /&gt;ハングアップするのは、「CS5536のMFGPTのIO空間にアクセスしてなにかを書き込んだとき」であったが、どう考えてもそれだけで落ちるとは考えられない、と思えるようになるまでデバグを続けて最後に確認したのが、BIOSの設定。&lt;br /&gt;ALIXのTinybiosには [MFGPT workaround] というメニューがある。これはCS5536のアクセスでマシンがハングアップ＊しないように＊ある機能らしいので、役に立つことはあっても害にはならないだろうと思っていたのが、この機能をdisableすると問題なくMFGPTの空間への書き込みができるようになった。&lt;br /&gt;&lt;br /&gt;もしかしてはまる人がいるかもしれないので、メモとして残しておく。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-872705399248136924?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/872705399248136924/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=872705399248136924' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/872705399248136924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/872705399248136924'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/alixnetbsd.html' title='ALIXとNetBSD（補足）'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4781908029398584476</id><published>2007-12-22T03:17:00.000+09:00</published><updated>2007-12-22T04:01:04.734+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでWatchdog timerを使う（for ALIX) (4)</title><content type='html'>Watchdogタイマとして動かすためにsysmonフレームワークから呼び出される関数は、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;int     glxpcib_wdog_setmode(struct sysmon_wdog *smw);&lt;/li&gt;&lt;li&gt;int     glxpcib_wdog_tickle(struct sysmon_wdog *smw);&lt;/li&gt;&lt;/ul&gt;の２つ。glxpcib_wdog_setmode()はWatchdogタイマのenable/disableや、最大時間を設定の際に呼び出される関数。glxpcib_wdog_tickle()は正常動作時に定期的に呼び出される関数だ。ちなみに&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/sysmon/sysmon_wdog.c"&gt;src/sys/dev/sysmon/sysmon_wdog.c&lt;/a&gt;をみると、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/*&lt;br /&gt;* sysmon_wdog_ktickle:&lt;br /&gt;*&lt;br /&gt;* Kernel watchdog tickle routine.&lt;br /&gt;*/&lt;br /&gt;void&lt;br /&gt;sysmon_wdog_ktickle(void *arg)&lt;br /&gt;{&lt;br /&gt;    [中略]&lt;br /&gt;       callout_reset(&amp;amp;sysmon_wdog_callout,&lt;br /&gt;           WDOG_PERIOD_TO_TICKS(smw-&gt;smw_period) / 2,&lt;br /&gt;           sysmon_wdog_ktickle, NULL);&lt;br /&gt;    }&lt;br /&gt;    mutex_exit(&amp;amp;sysmon_wdog_mtx);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;と書いてあって、基本的には（カーネルモードのwatchdogの場合は）設定した時間の半分の周期でタイマを更新することになっていた。&lt;br /&gt;&lt;br /&gt;今回はこれらの２つの関数を書くにあたって、共通的な要素を行う基本関数として&lt;br /&gt;&lt;ul&gt;&lt;li&gt;glxpcib_wdog_disable（）&lt;/li&gt;&lt;li&gt;glxpcib_wdog_enable()&lt;/li&gt;&lt;li&gt;glxpcib_wdog_reset()&lt;/li&gt;&lt;/ul&gt;の３つを用意した。最初の２つはタイマーの動作を止めたり、動かしたり、カウンターが回りきったときのアクション（この場合はシステムリセット）を止めたり、動かしたりするために利用する。３つめカウンターを０にリセットするために利用する。これらを組み合わせると、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;glxpcib_wdog_setmode()はdisable(), enable(),reset()の組み合わせとタイマ値の設定&lt;br /&gt;&lt;/li&gt;&lt;li&gt;glxpcib_wdog_tickle()はreset()を呼び出す&lt;/li&gt;&lt;/ul&gt;ことで実現できる。sysmon_wdogの時間しては秒単位で、カウンターに設定する値も秒単位なので特に変換のための計算も必要ない。参考までにglxpcib_wdog_setmode()をつけておく。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int&lt;br /&gt;glxpcib_wdog_setmode(struct sysmon_wdog *smw)&lt;br /&gt;{&lt;br /&gt;      struct glxpcib_softc *sc = smw-&gt;smw_cookie;&lt;br /&gt;&lt;br /&gt;      if ((smw-&gt;smw_mode &amp;amp; WDOG_MODE_MASK) == WDOG_MODE_DISARMED) {&lt;br /&gt;              mutex_enter(&amp;amp;sc-&gt;sc_mtx);&lt;br /&gt;              glxpcib_wdog_disable(sc);&lt;br /&gt;              mutex_exit(&amp;amp;sc-&gt;sc_mtx);&lt;br /&gt;              return 0;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      if (smw-&gt;smw_period == WDOG_PERIOD_DEFAULT)&lt;br /&gt;              smw-&gt;smw_period = 32;&lt;br /&gt;      else if (smw-&gt;smw_period &gt; 0xffff) /* too big */&lt;br /&gt;              return EINVAL;&lt;br /&gt;&lt;br /&gt;      mutex_enter(&amp;amp;sc-&gt;sc_mtx);&lt;br /&gt;      glxpcib_wdog_enable(sc);&lt;br /&gt;      glxpcib_wdog_reset(sc);&lt;br /&gt;      mutex_exit(&amp;amp;sc-&gt;sc_mtx);&lt;br /&gt;&lt;br /&gt;      return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;ここまでで、デバイスドライバ部分は全部できあがったのだが、ここではたと気がついたことがある。「これってどうやって正しく動いていることを検証すればいいんだろうか？」と。&lt;br /&gt;Watchdogタイマはシステムが動かなかったときにリセットするために使われるわけだが、任意にシステムを止めたりする方法はあまりしらない（別のHWのデバイスドライバをごにょごにょすればできないこともないがめんどくさい）。しょうがないから、&lt;br /&gt;&lt;ol&gt;&lt;li&gt;printfをいれて関数の呼び出し状態をみてみる&lt;/li&gt;&lt;li&gt;ユーザランドで指定した値と独立してある特定の時間（１０秒）までカウントが進めばリセットするカーネルを作ってみる&lt;/li&gt;&lt;/ol&gt;の２つで対処してみた。（１）で１０秒と設定した場合に５秒ごとに_tickle()が呼び出されて、カウンタが０になっていることがわかる。また（２）では１８秒と設定して９秒後に_tickle()が動けばリセットされないが、２０秒と設定して１０秒後まで_tickle（）が動かないようにするとリセットがかかる、といったようにタイマが正しく動いていてかつリセット動作までつながる、ことを検証できる。&lt;br /&gt;&lt;br /&gt;というわけで、CS5536のMFGPTをつかってWatchdogタイマを動かすデバイスドライバは書けて、正しく動いているっぽいことが分かった。最後に、NetBSDでWatchdogタイマを使うように設定する方法を書いておく。&lt;br /&gt;使うコマンドは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;wdogctl&lt;/li&gt;&lt;/ul&gt;である。詳しいオプションはman wdogctlで見ることをお勧めするが、&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# wdogctl &lt;br /&gt;Available watchdog timers:&lt;br /&gt;        cs5536wdt, 32 second period&lt;br /&gt;# wdogctl -k -p 10 cs5536wdt&lt;br /&gt;# wdogctl&lt;br /&gt;Available watchdog timers:&lt;br /&gt;        cs5536wdt, 10 second period [armed, kernel tickle]&lt;br /&gt;# wdogctl -d&lt;br /&gt;# wdogctl&lt;br /&gt;Available watchdog timers:&lt;br /&gt;        cs5536wdt, 10 second period&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;のように使う。引数なしでwdogctlを呼ぶと使えるタイマの名前とwatchdogが起動する長さが表示される。２行目は10秒でwatchdogがかかるようにkernelがタイマを更新するモードでcs5536wdt(今回つくったタイマ）を用いてwatchdogを実行するように指示する。もう一度引数なしwdogctlを呼ぶと、設定が反映されて動いていることがわかる。&lt;br /&gt;途中でwatchdogタイマを止めたいときは-dオプションをつけてwdogctlを実行すればよい。&lt;br /&gt;&lt;br /&gt;もし、起動時に設定したい場合は/etc/rc.confにwdogctl=YES wdogctl_flags="-k -p 10 cs5536wdt"などとと書いておけば動く。wdogctl_flagsの中身はwdogctlに渡す引数と同じでよい。&lt;br /&gt;&lt;br /&gt;というわけで、PC EnginesのALIXボードが届いてから、2日ほど楽しくカーネル遊びをする時間をとれた。いままでGPIOとかWatchdogとかを使ったことがなかったが、動くようにするために結構深い理解ができたような気がする。でも、次にこの知識が役にたつのはいつだろう（とちょっとだけ不安）。&lt;br /&gt;&lt;br /&gt;さて、次は一番ほしい機能であるI2Cバスのサポートに手をつけたいなーと思っている。&lt;br /&gt;が、まだ何もやっていないので本当にできるのか？いつになるかは？は不明。とりあえずこの３連休は手元にI2Cデバイスもロジックアナライザもないので難しそうだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4781908029398584476?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4781908029398584476/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4781908029398584476' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4781908029398584476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4781908029398584476'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdwatchdog-timerfor-alix-4.html' title='NetBSDでWatchdog timerを使う（for ALIX) (4)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5968831098712763145</id><published>2007-12-22T01:27:00.000+09:00</published><updated>2008-12-10T21:25:38.538+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでWatchdog timerを使う（for ALIX) (3)</title><content type='html'>なんだかデバイスドライバ作成講座みたいになってきて、UNIX系雑誌の原稿を書いているみたいな気分になってきた。まあいいか。もし変なところとか、質問があったらコメントしてもらえれば対応できることもあるかもしれない、ところが雑誌とは違うと納得することにした。あと、タイマのデバイスドライバは操作する場所もすくないし、滅多なことで変なこともおこらないので入門用としてはちょうどいいネタかもしれないので、一度書いておくとあとあと便利かも。&lt;br /&gt;&lt;br /&gt;とりあえず、今回の話は手元にCS5536の&lt;a href="http://www.amd.com/files/connectivitysolutions/geode/geode_lx/33238G_cs5536_db.pdf"&gt;データブック&lt;/a&gt;を置いておくと少しはわかるかもしれない。６５０ページもあるドキュメントであんまり画面上で参照したい大きさじゃない。昔みたいに印刷物でくばってくれないかなあ、とこのデバイスを触っている最中よく思った。MFGPTの仕様はあちこちに分散されているけど、今回一番必要になるのは制御用のレジスタマップと書き込むべき内容が書いてある「6.17 Multi-Function General Purpose Timer Register Descriptions」（ｐ５２７）あたりだ。タイマにしてはできることが多いのでたくさん設定できることがあるけれど、今回つかうのは&lt;ul&gt;&lt;li&gt;6.17.2.4 MFGPT[x] Setup (MFGPT[x]_SETUP)　（ｐ５２２）&lt;/li&gt;&lt;li&gt;6.17.2.3 MFGPT[x] Up Counter (MFGPT[x]_CNT)　（p521)&lt;/li&gt;&lt;li&gt;6.17.2.2 MFGPT[x] Comparator 2 (MFGPT[x]_CMP2) (p520)&lt;/li&gt;&lt;/ul&gt;の３つだけ。上から、タイマのカウンターの動作設定、カウンターの値、カウンターの上限値をそれぞれ設定するレジスタになる。&lt;br /&gt;6.17.2.4をじーっと眺めると、MFGPT0_SETUPレジスタのビット構造の図がある。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/R2vxejvkIWI/AAAAAAAAAIA/VT6SB1rDAwQ/s1600-h/e5e04f5d059f519a21f4e59ffd8e56b7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_nwrLM141xU8/R2vxejvkIWI/AAAAAAAAAIA/VT6SB1rDAwQ/s320/e5e04f5d059f519a21f4e59ffd8e56b7.png" alt="" id="BLOGGER_PHOTO_ID_5146472506494034274" border="0" /&gt;&lt;/a&gt;このレジスタは16bitで各ビットの値を設定するとタイマのカウンタの動作を定義できる。注意しないといけないのは、いくつかのビットは最初の一回しか書き込みできない点で、それ以降はそのビットへの変更は反映されない。たとえば、bit0-3のMFGPT_SCALEはカウンタのプリスケーラーの値を設定するビットフィールドだが一度設定すると途中でプリスケーラーの値を変更できない（らしい）。MFGPT_CLKSELはカウンタのクロックを32KHzか14.328MHzか選択するために使うがこれも同様に最初に設定したら変更できない。&lt;br /&gt;Watchdogタイマはms単位ではあまり使わないだろうということと、比較的長い周期が設定できたほうがいいだろう、という判断でCLKSELでは32KHzを、プリスケーラは32K分周を選択することにした。つまり32KHzを32K分周するためカウンタは1Hzで駆動される。プログラムも簡単になるし、１６ビットカウンタの最大値の６５５３５秒＝約18.2時間までの長周期を設定できる、ようになる。&lt;br /&gt;&lt;br /&gt;初期設定は、glxpcib_attach()の中で行う。レジスタの値を変更するためには、PCIのアドレス空間をアクセスできるようにしておかないといけない、GPIOの時と同様にbus_space_map()を使ってio handleを取得しておく。該当部分のコードはこんな感じ。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt; /* Attach the watchdog timer */&lt;br /&gt; wdtbase = rdmsr(MSR_LBAR_MFGPT) &amp;amp; 0xffff;&lt;br /&gt; if (bus_space_map(sc-&gt;sc_iot, wdtbase, 64, 0, &amp;amp;sc-&gt;sc_ioh)) {&lt;br /&gt;         aprint_error("%s: can't map memory space for WDT",&lt;br /&gt;                       sc-&gt;sc_dev.dv_xname);&lt;br /&gt; } else {&lt;br /&gt;         mutex_init(&amp;amp;sc-&gt;sc_mtx, MUTEX_DEFAULT, IPL_HIGH);&lt;br /&gt;         bus_space_write_2(sc-&gt;sc_iot, sc-&gt;sc_ioh,&lt;br /&gt;             AMD5536_MFGPT0_SETUP,&lt;br /&gt;             AMD5536_MFGPT_CNT_EN | AMD5536_MFGPT_CMP2EV |&lt;br /&gt;             AMD5536_MFGPT_CMP2 | AMD5536_MFGPT_DIV_MASK);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;ここでは、IO空間をマップしてから、MFGPT0_SETUPレジスタに「カウンタを動かす+フルカウンタになったらリセットをする+入力クロック=32KHz+プリスケーラー=32K」を設定するところまでが含まれている。&lt;br /&gt;その後は、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;         sc-&gt;sc_smw.smw_name = "cs5536wdt";&lt;br /&gt;         sc-&gt;sc_smw.smw_cookie = sc;&lt;br /&gt;         sc-&gt;sc_smw.smw_setmode = glxpcib_wdog_setmode;&lt;br /&gt;         sc-&gt;sc_smw.smw_tickle = glxpcib_wdog_tickle;&lt;br /&gt;         sc-&gt;sc_smw.smw_period = 32;&lt;br /&gt;         aprint_normal("%s:  watchdog", sc-&gt;sc_dev.dv_xname);&lt;br /&gt;         wdt = 1;&lt;br /&gt; }&lt;br /&gt; /* Register Watchdog timer to SMW */&lt;br /&gt; if (wdt) {&lt;br /&gt;     if (sysmon_wdog_register(&amp;amp;sc-&gt;sc_smw) != 0)&lt;br /&gt;            aprint_error("%s: can not register wdog\n",&lt;br /&gt;                          sc-&gt;sc_dev.dv_xname);&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;sysmonのフレームワークに必要な設定(smw構造体にいろいろと書く）をして、sysmon_wdog_register()でMFGPT0タイマをsysmonのwatchdogタイマとして登録すれば、attach処理は完了する。&lt;br /&gt;&lt;br /&gt;あとは、sysmonのwdogフレームワークがMFGPT0タイマを制御するための制御関数を記述すれば完了である。記述していないうちは、関数ポインタとしてNULLをいれておけば、カーネルの作成して連携部分のチェックまではできるはず。実際に開発しているときは、周りだけ作って中身がない状態から、すこしづつ中身を埋めていってつくっていた。&lt;br /&gt;&lt;br /&gt;次は、watchdogタイマとしてMFGPTを動かすため操作関数について書いてみる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5968831098712763145?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5968831098712763145/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5968831098712763145' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5968831098712763145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5968831098712763145'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdwatchdog-timerfor-alix-3.html' title='NetBSDでWatchdog timerを使う（for ALIX) (3)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/R2vxejvkIWI/AAAAAAAAAIA/VT6SB1rDAwQ/s72-c/e5e04f5d059f519a21f4e59ffd8e56b7.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8027911443700485712</id><published>2007-12-21T23:33:00.000+09:00</published><updated>2007-12-22T01:05:36.114+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでWatchdog timerを使う（for ALIX) (2)</title><content type='html'>今回扱うWatchdogタイマはハードウェアサポートを前提としたものだ。ハードウェアサポートのWatchdogタイマは、CPUの演算やプログラムとは独立して動いているタイマと、そのタイマが一定の値になるとCPUを強制的にリセットできる機構が組み合わさって実現される。&lt;br /&gt;つまり、今回CS5536でWatchdogタイマを実装するためには、CS5536のMFGPTがある一定の値になるとシステムをリセットするように設定し、かつカーネルやユーザランドが正しく動いている限り一定間隔でタイマの更新を続けるソフトウェアを書くこと、と等価である。&lt;br /&gt;NetBSDのWatchdogタイマサポートは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;デバイスドライバ部分（glxpcib.c)はタイマーの設定と更新のためのデバイス依存の部分&lt;/li&gt;&lt;li&gt;カーネルのsysmonフレームワークがその他残りのデバイス非依存の部分&lt;/li&gt;&lt;/ul&gt;の２層にわかれている。これはハードウェアを扱うデバイスドライバとOSのサービスが協調して動作する機構の一般的な構造だ。ユーザランドへのAPIやサービスの共通的な手続きはデバイスが提供する機能を一般化・抽象化して扱っておき、具体的なデバイスの処理はその抽象的なアクションから呼び出されるデバイス依存のデバイスドライバ部分のコードが対応することになる。基本的にハードウェアデバイスはデバイス毎に設計も扱い方も違うけれど、共通部分をうまく切り出しておけばデバイス依存・非依存部分をきれいに分離できる、というわけだ。&lt;br /&gt;&lt;br /&gt;今回つかうデバイス非依存のサービスはsysmonフレームワークによって提供されている。これは&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/sysmon/"&gt;src/sys/dev/sysmon/&lt;/a&gt;以下で実装されているフレームワークでコンピュータのハードウェアの電源やセンサなどを扱うための一般的な機能を提供している。Watchdogタイマも&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/sysmon/sysmon_wdog.c"&gt;sysmon/sysmon_wdog.c&lt;/a&gt;をつかえば、他の実装のwatchdogと同じユーザランドプログラムと協調できるようになっている。&lt;br /&gt;&lt;br /&gt;と、ここまでで全体の大雑把に構造を理解し（たつもりになっ）てから、デバイス依存の部分をやっつけてしまうことにする。glxpcib.cの中には、デバイス依存つまりCS5536特有な操作を扱う&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MFGPTの初期設定（周波数やプリスケーラーの値）する関数&lt;/li&gt;&lt;li&gt;MFGPTの動作を制御するための関数&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sysmon_wdogとインターフェイスするための関数群&lt;/li&gt;&lt;/ul&gt;を実装をしなければならない。sysmon_wdogから呼び出される関数は&lt;a href="http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/dev/sysmon/sysmonvar.h"&gt;sysmon/sysmonvar.h&lt;/a&gt;の中のsysmon_wdog構造体を参照するとわかる。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;struct sysmon_wdog {&lt;br /&gt;    const char *smw_name;  /* watchdog device name */&lt;br /&gt;&lt;br /&gt;    LIST_ENTRY(sysmon_wdog) smw_list;&lt;br /&gt;&lt;br /&gt;    void *smw_cookie;  /* for watchdog back-end */&lt;br /&gt;    int (*smw_setmode)(struct sysmon_wdog *);&lt;br /&gt;    int (*smw_tickle)(struct sysmon_wdog *);&lt;br /&gt;    u_int smw_period;  /* timer period (in seconds) */&lt;br /&gt;    int smw_mode;   /* timer mode */&lt;br /&gt;    u_int smw_refcnt;  /* references */&lt;br /&gt;    pid_t smw_tickler;  /* last process to tickle */&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;関数ポインタであるsmw_setmode（）とsmw_tickle（）を実装してやれば、sysmon-wdogで扱えるwatchdogタイマになるだろう、という見通しを立てて進めていく。&lt;br /&gt;&lt;br /&gt;次のエントリーでデバイス操作について説明してみる予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8027911443700485712?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8027911443700485712/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8027911443700485712' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8027911443700485712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8027911443700485712'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdwatchdog-timerfor-alix-2.html' title='NetBSDでWatchdog timerを使う（for ALIX) (2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3875890562287686709</id><published>2007-12-21T19:53:00.000+09:00</published><updated>2007-12-21T20:22:18.771+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでWatchdog timerを使う（for ALIX) (1)</title><content type='html'>Watchdogタイマはシステムがハングアップしたときに自動的に復帰するための監視機構だ。原理は簡単で、独立したタイマが動いていて、そのタイマが設定した値に到達するとシステムリセットがかかるようにしておく。システムが正しく動いているときはそのタイマの値を定期的に０にもどし、リセットがかからないように管理する、というものだ。&lt;br /&gt;ALIXで動かすNetBSDでGPIOをサポートするコードを書くついでにwatchdogタイマも生かしてみることにした。最近は組込機器っぽい用途でNetBSDを使うこともあっていつか機会があればwatchdogタイマを使ってみようと思っていたので、ちょうどよい。&lt;br /&gt;AMDのCS5536には、MFGPT（Multi Function General Purpose Timer)というすごい名前のタイマ群が実装されている。そのうちの一つMFGPT0をWatchdogタイマとして使う、というのが元々のOpenBSDのglxpcib.cでの実装だ。問題はNetBSDとOpenBSDではwatchdogタイマを使うためのフレームワークが異なっている点で、そのままでは動かない。そこで、NetBSDが使っているsysmonフレームワークに合わせて書き直すことにした。というわけで、やるべきことは、&lt;br /&gt;&lt;ol&gt;&lt;li&gt;AMD CS5536のMFGPTの仕組みを理解&lt;/li&gt;&lt;li&gt;NetBSD sysmonフレームワークを理解＆sysmon wdogtimerの使い方を理解&lt;br /&gt;&lt;/li&gt;&lt;li&gt;コードを書く&lt;/li&gt;&lt;/ol&gt;ということになる。MFGPT自体はGPIOと同様にCS5536のPCI-ISAブリッジデバイスの一部として実装されているため、glppcib.cの一部として扱えばmatch/attachルーチンは特に必要ない。純粋にデバイスの設定とsysmonフレームワークとの連携がうまくかければ動くだろう、ということでやってみた。&lt;br /&gt;&lt;br /&gt;具体的な話は次のエントリーで。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3875890562287686709?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3875890562287686709/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3875890562287686709' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3875890562287686709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3875890562287686709'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdwatchdog-timerfor-alix-1.html' title='NetBSDでWatchdog timerを使う（for ALIX) (1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-6010112790589203626</id><published>2007-12-21T18:55:00.000+09:00</published><updated>2008-12-10T21:25:39.297+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでGPIOを使う（for ALIX) (4)</title><content type='html'>実はNetBSDでgpioを使おうと思ったのは今回が初めてだったので、どうやればアクセスできるのか？というあたりから調べないといけなかった。Unixということで、とりあえず man -k gpioなどと打ち込んでみると、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;gpio (4) - General Porpose Input/Output&lt;br /&gt;&lt;/li&gt;&lt;li&gt;gpioctl  (8)  - control GPIO device&lt;/li&gt;&lt;li&gt;gpioow (4)  - 1-Wire bus bit-banging through GPIO pin&lt;/li&gt;&lt;/ul&gt;が引っかかった。取り急ぎ動作確認のためのコマンドがほしかったのでgpioctlのmanを読んでみると、これでgpioの各pinの値を制御できるらしい。&lt;a href="http://www.pcengines.ch/pdf/alix2.pdf"&gt;ALIX.2/3のマニュアル&lt;/a&gt;をみるとLED D1-3あたりがGPIOで制御されているとのこと。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nwrLM141xU8/R2uRWTvkITI/AAAAAAAAAHo/6n9PbHXzE7Q/s1600-h/%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2007-12-21+19-10-50.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_nwrLM141xU8/R2uRWTvkITI/AAAAAAAAAHo/6n9PbHXzE7Q/s320/%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2007-12-21+19-10-50.jpg" alt="" id="BLOGGER_PHOTO_ID_5146366811643846962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;LED2,3を操作して点灯すれば、GPIOはまあ動いていることにしても良いだろう、ということでやってみた。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_nwrLM141xU8/R2uSnzvkIUI/AAAAAAAAAHw/6psw9e7bQP4/s1600-h/P1000147.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_nwrLM141xU8/R2uSnzvkIUI/AAAAAAAAAHw/6psw9e7bQP4/s200/P1000147.JPG" alt="" id="BLOGGER_PHOTO_ID_5146368211803185474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_nwrLM141xU8/R2uS1DvkIVI/AAAAAAAAAH4/6tbWz9iUUBQ/s1600-h/P1000146.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_nwrLM141xU8/R2uS1DvkIVI/AAAAAAAAAH4/6tbWz9iUUBQ/s200/P1000146.JPG" alt="" id="BLOGGER_PHOTO_ID_5146368439436452178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# gpioctl&lt;br /&gt;/dev/gpio0: 32pin&lt;br /&gt;# gpioctl -d /dev/gpio0 25 0&lt;br /&gt;pin 25: state 1 -&gt; 0&lt;br /&gt;# gpioctl -d /dev/gpio0 27 0&lt;br /&gt;pin 27: state 1 -&gt; 0&lt;/code&gt;&lt;br /&gt;無事に両方ついてくれた。あとは、必要に応じてgpio(4)のAPIをつかって制御すれば動くだろう、ということで、GPIOサポートは一通り終了。本当はLPCポートに配線されているgpioポートを利用できるか？というあたりを試してみないといけないのだが、実際にgpioを使う気になるまでは放置しておくことにしよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-6010112790589203626?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/6010112790589203626/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=6010112790589203626' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6010112790589203626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/6010112790589203626'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdgpiofor-alix-4.html' title='NetBSDでGPIOを使う（for ALIX) (4)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_nwrLM141xU8/R2uRWTvkITI/AAAAAAAAAHo/6n9PbHXzE7Q/s72-c/%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2007-12-21+19-10-50.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2429249567664995814</id><published>2007-12-21T17:29:00.000+09:00</published><updated>2007-12-21T18:16:14.979+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでGPIOを使う（for ALIX) (3)</title><content type='html'>カーネル関係の移植作業は、カーネルの大きな構造を理解していれば、あとは単純な作業になる。が、「カーネルの大きな構造の理解」は短期間に取得することは比較的難しい気がする。なんか長い間小さい作業を進めているといつかわかっている、みたいな理解の仕方をする人が多いのではないだろうか。少なくとも私はそうだった。&lt;br /&gt;細かい作業の履歴はとっていないので、ここではglxpcib.cの変更点の要点を列挙して注釈をつけてみることにする。もし、万が一カーネルに手を出そうとする人の参考になればうれしいな。ちなみにNetBSDにsend-prしたglxpcib.cとOpenBSDのglxpcib.cとの差分はdiff -uでみたところ393行だった。OpenBSDが383行、NetBSDが484行になったので、純増で101行。結構差分が大きかったことに調べてびっくり。&lt;br /&gt;&lt;br /&gt;やらないといけないことは、大きく分けると&lt;br /&gt;&lt;ol&gt;&lt;li&gt;PCI deviceとして検出してアタッチできるようにする&lt;/li&gt;&lt;li&gt;カーネルの既存のフレームワークと協調できるようする&lt;/li&gt;&lt;li&gt;デバイスとして動くようにする&lt;/li&gt;&lt;/ol&gt;という感じ。１ができるようになるためには、コンパイルが通ってkernelを作成できるようになっていないといけないので、とりあえず中身は空でもいいからkernelを作成できるように外側から攻めていく方が楽だと思う。&lt;br /&gt;&lt;br /&gt;PCIバスは昔のISAなどと比べて、デバイスの検出、リソース管理の部分がよくできているので、OS側で扱うのも非常に簡単だ。PCIデバイスにはPCIコンフィグレーションレジスタがかならず実装されていて、そこにグローバルユニークなベンダーID、プロダクトID、デバイスクラスなどが記録されているのでそれを読めば大体そのPCI空間にいるデバイスがなにかを判断できる。OSではその値を比較して具体的な処理を進めれば間違いは無い。NetBSDでは、hogehoge_match()とhogehoge_attach()という関数を使うのが普通なので、いろいろなPCIデバイスのドライバのコードをみればすぐに理解できると思う。CS5536のデバイス検出のコードは以下のようになる。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;int&lt;br /&gt;glxpcib_match(struct device *parent, struct cfdata *match, void *aux)&lt;br /&gt;{&lt;br /&gt;     struct pci_attach_args *pa = aux;&lt;br /&gt;&lt;br /&gt;     if (PCI_CLASS(pa-&gt;pa_class) != PCI_CLASS_BRIDGE ||&lt;br /&gt;         PCI_SUBCLASS(pa-&gt;pa_class) != PCI_SUBCLASS_BRIDGE_ISA)&lt;br /&gt;             return (0);&lt;br /&gt;&lt;br /&gt;     if (PCI_VENDOR(pa-&gt;pa_id) == PCI_VENDOR_AMD &amp;amp;&amp;amp;&lt;br /&gt;         PCI_PRODUCT(pa-&gt;pa_id) == PCI_PRODUCT_AMD_CS5536_PCIB)&lt;br /&gt;             return (2);     /* supersede pcib(4) */&lt;br /&gt;&lt;br /&gt;     return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;PCI_VENDOR,PCI_PRODUCTなどをみて適切なデバイスを認識できれば処理が進む。NetBSDではベンダーコードなどはsrc/sys/dev/pci/pcidevsというファイルに列挙されている。新しいデバイスを登録するときはそこにエントリーを追加してmake -f Makefile.pcidevsでデータベースを生成しなければならない。&lt;br /&gt;&lt;br /&gt;*_match, *_attachをカーネルのデバイスコンフィギュレーションフェーズに登録するためのマクロとして、&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;CFATTACH_DECL(glxpcib, sizeof(struct glxpcib_softc),&lt;br /&gt;     glxpcib_match, glxpcib_attach, NULL, NULL);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;を使う。最初は、おまじないだとおもってコードの最初の方にかいておくと良いだろう。この辺はPCIデバイスなら全部同じなので特に悩むことはない。デバイス依存のコードは実際にデバイスをアタッチするところから始まる。デバイス毎の情報を保存するsoftc構造体（今回はstruce glxpcib_softc)を設定し、デバイスをアクセスするためのPCI空間の調整やメモリーへのマップを設定して、具体的なデバイスの初期化を行わなければならない。&lt;br /&gt;glxpcib_attach()の中を全部説明すると大変なので、PCIデバイス一般な説明をしておく。OSがPCIのバスの管理をしてくれているので、デバイスドライバは自分が使うメモリ空間にだけ気をつけておけばそれなりに使える。bus_space_map()をつかってそのPCIデバイスのIO空間をメモリにマップし、bus_space_write/read_*()でその空間の読み書きを行うというイメージでデバイスにアクセスできる。&lt;br /&gt;あとは仕様書をみて、必要な機能のレジスタを読んだり書いたりする方法を実装すればいい。&lt;br /&gt;&lt;br /&gt;CS5536はたくさんの機能が１チップにまとまっている。これは物理的な１チップに複数のPCIデバイスが含まれている＝複数のデバイスIDがある、ということを意味しているのだが、各PCIデバイスにも複数の機能が含まれてもいる。今扱っているPCI-ISAブリッジにもPCI-ISAブリッジ以外にGPIOやMFGPT(Multi function General Purpose Timer)などの機能がある。PCI-ISAブリッジとしてmatch/attachをする際にGPIOやMFGPTをつかったWatchdog timerも設定してあげなければ使えるようにならない。&lt;br /&gt;たとえば、GPIOの空間は以下に示す用に、GPIOのIO空間のベースアドレスなどをつかってio handleを取得してそのio handoleをつかって読み書きをする、という感じ。うまく設定できればconfig_found_ioをつかって、gpioバスができたことをOSに通知してあげると、OSのGPIOフレームワークがそれ以降の処理を引き取ってくれる。&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;/* map GPIO I/O space */&lt;br /&gt;sc-&gt;sc_gpio_iot = pa-&gt;pa_iot;&lt;br /&gt;gpiobase = rdmsr(MSR_LBAR_GPIO) &amp;amp; 0xffff;&lt;br /&gt;if (!bus_space_map(sc-&gt;sc_gpio_iot, gpiobase, 0xff, 0,&lt;br /&gt;     &amp;amp;sc-&gt;sc_gpio_ioh)) {&lt;br /&gt;       aprint_normal(", gpio\n");&lt;br /&gt;    [このへんでいろいろ設定]&lt;br /&gt;    gpio = 1;&lt;br /&gt;}&lt;br /&gt;/* Attach GPIO framework */&lt;br /&gt;if (gpio)&lt;br /&gt;  config_found_ia(&amp;amp;sc-&gt;sc_dev, "gpiobus", &amp;amp;gba, gpiobus_print);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;全部うまく動くと、NetBSDがブートするときに&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glxpcib0 at pci0 dev 15 function 0&lt;br /&gt;glxpcib0: Advanced Micro Devices CS5536 PCI-ISA Bridge (rev. 0x03)&lt;br /&gt;timecounter: Timecounter "CS5536" frequency 3579545 Hz quality 1000&lt;br /&gt;glxpcib0:  watchdog, gpio&lt;br /&gt;gpio0 at glxpcib0: 32 pins&lt;br /&gt;gpioow0 at gpio0 pins 6: DATA[6] open-drain pull-up&lt;br /&gt;onewire0 at gpioow0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;という表示が拝めて、うれしい気分になる、というのがこの作業の最初の到達点だ。&lt;br /&gt;パッチはすでにNetBSDにsend-prしてある。kern/37577に全ソースがついているので興味があったら参照してほしい。（ある程度時間がたっていればNetBSDにマージされていることを期待）&lt;br /&gt;&lt;br /&gt;使い方は次回のエントリーで。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-2429249567664995814?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/2429249567664995814/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=2429249567664995814' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2429249567664995814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/2429249567664995814'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdgpiofor-alix-3.html' title='NetBSDでGPIOを使う（for ALIX) (3)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8862174680659254951</id><published>2007-12-21T16:18:00.000+09:00</published><updated>2007-12-21T16:43:48.082+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでGPIOを使う（for ALIX) (2)</title><content type='html'>今回はベースとなるファイルがあるので気を楽にして取り組むことにする。とりあえず手元に用意するものは、&lt;br /&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;OpenBSDのglxpcib.c&lt;/li&gt;&lt;li&gt;NetBSD-currentのhead tree&lt;/li&gt;&lt;li&gt;OpenBSDのsys source tree&lt;/li&gt;&lt;li&gt;AMD CS5536の&lt;a href="http://www.amd.com/files/connectivitysolutions/geode/geode_lx/33238G_cs5536_db.pdf"&gt;データシート&lt;/a&gt;&lt;/li&gt;&lt;li&gt;実機(ALIX)&lt;/li&gt;&lt;/ul&gt;だけ。NetBSD-currentのhead tree、おもむろにopenbsdのglxpcib.cをNetBSDのソースツリーのsrc/sys/arch/i386/pciの下にコピーする。このあたりに新しいファイルを追加したときには、src/sys/arch/i386/conf/files.i386にエントリーを追加する。これをしないとconfigしたときに認識してくれないし依存関係を記述することができない。とりあえず今回は&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# AMD Geode CS5536 PCI-ISA bridge&lt;br /&gt;device glxpcib: isabus, sysmon_wdog, gpiobus&lt;br /&gt;attach glxpcib at pci&lt;br /&gt;file   arch/i386/pci/glxpcib.c         glxpcib&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;と追加。デバイス名はopenbsdと同じglxpcib。sysmon_wdog, gpiobusは後で説明するけれど、NetBSDのwatchdogおよびgpio busの共通部分のフレームワークを使うことを意味している。glxpcibはpciバス上にアタッチされて、ドライバの実体はglxpcib.cである、という意味になる。&lt;br /&gt;&lt;br /&gt;これで、kernelのconfigurationファイルにglxpcibという名前が出てきてもconfigコマンドが処理できるようになる。configファイルには、&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glxpcib* at pci? dev ? function ?      # AMD CS5536 PCI-ISA bridge w/ GPIO and WDT support&lt;br /&gt;gpio* at glxpcib?&lt;br /&gt;isa0    at glxpcib?&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;を追加。pciバス上にglxpcibを生成して、その上にisaバスとgpioバスを生やす、という意味になる。&lt;br /&gt;今回はALIXというconfigファイルをつくってそれで作業することにする。&lt;br /&gt;で、おもむろにsrc/sys/arch/i386/confの下でconfig ALIX; cd ../compile/ALIX; make depend; makeなどと打ち込むとエラーメッセージがばりばりと出てくるので（あたりまえ）、それを見ながら今後の方針を考えて作業をする、というのが移植作業の一般的な進み方（だとおもう）。&lt;br /&gt;&lt;br /&gt;というわけで、glxpcib.cをどうやって調理するかは続きで。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8862174680659254951?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8862174680659254951/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8862174680659254951' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8862174680659254951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8862174680659254951'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdgpiofor-alix-2.html' title='NetBSDでGPIOを使う（for ALIX) (2)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-8355286372231184174</id><published>2007-12-21T15:33:00.000+09:00</published><updated>2007-12-21T15:58:22.516+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>NetBSDでGPIOを使う（for ALIX) (1)</title><content type='html'>PC EnginesのALIXを使いこなすために&lt;a href="http://www.netbsd.org/"&gt;NetBSD&lt;/a&gt; kernelを触っている。ALIXのハードウェア的には実装されているけれどNetBSD-current (4.99.42: 2007/12/20)ではまだ扱えない機能がいくつかあってとりあえずそいつらを見えるようにしよう、とこの２日間ほど作業をしてみた。&lt;div&gt;まだ扱えない機能でサポートしたいなあ、と強く思ったのは、とりあえず&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;GPIO&lt;/li&gt;&lt;li&gt;Watchdog timer&lt;/li&gt;&lt;li&gt;I2C bus&lt;/li&gt;&lt;/ul&gt;の3つだ。カーネルからGPIOが使えたら外付けの回路を触る場合に大変便利だし、watchdogタイマーは組込用途のシステムでは便利だ。I2Cは普通のI2Cセンサーをつなげたり、PSOCなどのマイコンと協調して動くシステムを作る際にきっと役に立つだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;カーネルを触るときにはまず先人達の知恵を検索してみるところから始まる。&lt;a href="http://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt;のグループはAMD Geode/LXシリーズに愛があるので、とりあえずその辺で動いているものが無いかと探してみると案の定&lt;a href="http://www.openbsd.org/cgi-bin/cvsweb/src/sys/arch/i386/pci/glxpcib.c"&gt;src/sys/arch/i386/glxpcib.c&lt;/a&gt;というファイルがあるのを発見した。中身をざっとみると、ALIXで使われているAMD CS5536のPCI-ISA host bridgeのドライバで、GPIOとWatchdog timerをサポートするコードがはいっている。OpenBSDとNetBSDは比較的カーネルのコンパチビリティが高い（部分が多い）ので、とりあえずこのコードをベースに作業を進めることにした。I2Cはそれらが動いてからでいいだろう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;具体的な作業は次のエントリーで。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-8355286372231184174?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/8355286372231184174/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=8355286372231184174' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8355286372231184174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/8355286372231184174'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/netbsdgpiofor-alix-1.html' title='NetBSDでGPIOを使う（for ALIX) (1)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3700277928088727817</id><published>2007-12-20T17:14:00.000+09:00</published><updated>2008-12-10T21:25:39.468+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ALIX'/><title type='text'>ALIX3C.2 (PC Engines)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nwrLM141xU8/R2ok1zvkISI/AAAAAAAAAHg/8I2F2MSuPlw/s1600-h/P1000145.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_nwrLM141xU8/R2ok1zvkISI/AAAAAAAAAHg/8I2F2MSuPlw/s200/P1000145.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5145966031065588002" /&gt;&lt;/a&gt;PC Enginesの&lt;a href="http://www.pcengines.ch/alix.htm"&gt;ALIX3C.2&lt;/a&gt;を&lt;a href="https://www.ytw.co.jp/catalog/product_info.php?cPath=38&amp;amp;products_id=80"&gt;YTW&lt;/a&gt;から買ってみた。これは、AMDのLX800+CS5536が乗った160mm*100mmくらいのワンボードPCで、拡張性が高い（MiniPCI*2, USB2.0*2）割に大変お安い（18000円くらい）というお得なボードだ。&lt;div&gt;最近LX800ベースの機材をつかっていたので、試しに買ってみたのだがなかなかいい感じにうごくので気に入っている。単にOSを入れるだけなら一瞬で動くし、ハードウェア素材として使おうとしてもCS5536などの資料は完璧なものがWebで&lt;a href="http://www.amd.com/jp-ja/ConnectivitySolutions/ProductInformation/0,,50_2330_9863_13022^13054^13083,00.html"&gt;入手できる&lt;/a&gt;ので扱い易い。今はNetBSD-current(4.99.42）のカーネルを拡張して遊んでいる。&lt;/div&gt;&lt;div&gt;1チップマイコンも便利だけど、たとえばネットワークスタックを動かそうとすると大変すぎるのでこのくらいのボードも使えるようになっていると便利。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3700277928088727817?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3700277928088727817/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3700277928088727817' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3700277928088727817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3700277928088727817'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/alix3c2-pc-engines.html' title='ALIX3C.2 (PC Engines)'/><author><name>yuo</name><uri>http://www.blogger.com/profile/05464123564396893177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp3.blogger.com/_nwrLM141xU8/R5YvDzvkIgI/AAAAAAAAAJM/F7J6LguM5kc/S220/%E3%81%8B%E3%82%93%E3%81%AA.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nwrLM141xU8/R2ok1zvkISI/AAAAAAAAAHg/8I2F2MSuPlw/s72-c/P1000145.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1602347118525028375</id><published>2007-12-20T17:04:00.000+09:00</published><updated>2008-12-10T21:25:39.616+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><title type='text'>PSoC SMP(Switch Mode Pomp)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R2oixEomtCI/AAAAAAAAAEI/bFtzisUTc8U/s1600-h/PSOC-SMP.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R2oixEomtCI/AAAAAAAAAEI/bFtzisUTc8U/s200/PSOC-SMP.jpg" alt="" id="BLOGGER_PHOTO_ID_5145963750677197858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;電源電圧を自分で昇圧してくれるSMPの実験をしてみました。&lt;br /&gt;ところでこれって、MCUの機能なのに MCUのための電源作れるって面白い回路だな。&lt;br /&gt;&lt;br /&gt;あまりにも簡単なサンプルそのままの回路で動いたので回路図は無しですが、一瞬はまったところが1箇所だけ。&lt;br /&gt;VCCをSMP経由で与えるので引き回さないんですが、書き込み器はもちろん普通にMiniProgの電源を与えないといけないので、その配線がなくて、なんで書き込めないんだ！と3分ほどはまりました。配線は極力短くとか言われてましたが、思ったよりも動くもんですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1602347118525028375?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1602347118525028375/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1602347118525028375' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1602347118525028375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1602347118525028375'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/psoc-smpswitch-mode-pomp.html' title='PSoC SMP(Switch Mode Pomp)'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/R2oixEomtCI/AAAAAAAAAEI/bFtzisUTc8U/s72-c/PSOC-SMP.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-1901824982504979758</id><published>2007-12-12T12:16:00.000+09:00</published><updated>2008-12-10T21:25:42.109+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='小ネタ'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>キャラクタ型液晶モジュールの電源配線</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R19TWLKhfUI/AAAAAAAAADg/THv8bhNn4mw/s1600-h/%E9%85%8D%E7%B7%9A.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R19TWLKhfUI/AAAAAAAAADg/THv8bhNn4mw/s200/%E9%85%8D%E7%B7%9A.jpg" alt="" id="BLOGGER_PHOTO_ID_5142920939899551042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;秋月などで売られているキャラクタ型液晶モジュールの電源は、なぜか1番、2番でVccとGNDが逆になっているタイプがあります。完成品つくる場合には採用する液晶モジュールによって電源を配置すればいいんですが、実験用の汎用基板だと両方に対応させられたら便利だよなーと思って、どうすればいいか考えてたんですがこれがたぶん一番簡単な方法じゃないかと思います。ピンヘッダ2x3とジャンパを２つ使って組み替えられるようにしました。いつもの手書きの配線図です。クロスしている部分はラップ線などでクロスにジャンプさせておきます。&lt;br /&gt;縦と横でVCC/GNDのピンを入れ替えられます。変則的にジャンパを入れるとショートするので注意しましょう。できあがりはこんな感じになりました。それぞれ、縦・横に使うことで、2種類の液晶を使い分けられます。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R19T_rKhfWI/AAAAAAAAADw/MF58HvNC2Kw/s1600-h/%E3%82%88%E3%81%93.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R19T_rKhfWI/AAAAAAAAADw/MF58HvNC2Kw/s200/%E3%82%88%E3%81%93.jpg" alt="" id="BLOGGER_PHOTO_ID_5142921652864122210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R19T4rKhfVI/AAAAAAAAADo/5RzQkmLWa5A/s1600-h/%E3%81%9F%E3%81%A6.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_ZFlW0NdMJdk/R19T4rKhfVI/AAAAAAAAADo/5RzQkmLWa5A/s200/%E3%81%9F%E3%81%A6.jpg" alt="" id="BLOGGER_PHOTO_ID_5142921532605037906" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-1901824982504979758?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/1901824982504979758/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=1901824982504979758' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1901824982504979758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/1901824982504979758'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/blog-post_12.html' title='キャラクタ型液晶モジュールの電源配線'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/R19TWLKhfUI/AAAAAAAAADg/THv8bhNn4mw/s72-c/%E9%85%8D%E7%B7%9A.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5121969816982460784</id><published>2007-12-11T11:34:00.001+09:00</published><updated>2008-12-10T21:25:42.315+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>USB加速度レコーダ(1)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R19UpLKhfXI/AAAAAAAAAD4/bEzSPpuwzvU/s1600-h/USB%E5%8A%A0%E9%80%9F%E5%BA%A6%E5%9B%9E%E8%B7%AF%E5%9B%B3.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_ZFlW0NdMJdk/R19UpLKhfXI/AAAAAAAAAD4/bEzSPpuwzvU/s200/USB%E5%8A%A0%E9%80%9F%E5%BA%A6%E5%9B%9E%E8%B7%AF%E5%9B%B3.jpg" alt="" id="BLOGGER_PHOTO_ID_5142922365828693362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;まずは回路図です。今回使ったのはstrawberry-linuxのUSB PSOCモジュールです。チップは24794でUSBのFull-speedに対応しています。&lt;br /&gt;簡単にUSBでシリアルやHIDが作れるこころが特徴です。&lt;br /&gt;加速度センサーは秋月電子の KMX52を使った8pinの3軸加速度センサーモジュールです。たぶん簡単に素人が手にはいる3軸加速度センサーとしては最安値だと思います。&lt;br /&gt;あとは、加速度とは関係ないのですがいつもの温度センサーLM35DZも準備します。&lt;br /&gt;&lt;br /&gt;Port０にはアナログ入力の切り替えスイッチがつながっているので、こちらにセンサーを配置します。0,1,2でz,y,x 軸を配置しました。これは 加速度センサーモジュールのピン配置を考えて、ジャンプしない配線を実現するためにZ,Y,Xの順番になっています。&lt;br /&gt;さらに、Port0-3に温度センサをつなぎます。&lt;br /&gt;&lt;br /&gt;センサーとしては以上なのですが、動作状況がわかりにくかったのでPort2-7にLEDを配置して、インジケータとして利用します。&lt;br /&gt;&lt;br /&gt;電源は、USB-PSoCのモジュールから取り出せますのでそちらを使います。&lt;br /&gt;あとはデカップリング用コンデンサなどは適時配置するとよいでしょう。&lt;br /&gt;最近のお気に入りは 2012サイズのチップコンデンサで、これを裏のランド面にランド間をまたぐように&lt;br /&gt;貼り付けています。&lt;br /&gt;http://akizukidenshi.com/catalog/items2.php?q=%22P-00355%22&amp;amp;s=popularity&amp;amp;p=1&amp;amp;r=&amp;amp;page=&lt;br /&gt;&lt;br /&gt;以上でハードウェアの準備が終了です。&lt;br /&gt;&lt;br /&gt;追記：　回路図が貼れてなかったので追加しました orz...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5121969816982460784?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5121969816982460784/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5121969816982460784' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5121969816982460784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5121969816982460784'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/usb1.html' title='USB加速度レコーダ(1)'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ZFlW0NdMJdk/R19UpLKhfXI/AAAAAAAAAD4/bEzSPpuwzvU/s72-c/USB%E5%8A%A0%E9%80%9F%E5%BA%A6%E5%9B%9E%E8%B7%AF%E5%9B%B3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-4457970355196406820</id><published>2007-12-08T00:02:00.000+09:00</published><updated>2008-12-10T21:25:42.567+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>マルチチャンネルレコーダー</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R1liBKkAixI/AAAAAAAAACw/MIQN4tuaExY/s1600-h/%E5%8A%A0%E9%80%9F%E5%BA%A6USB.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R1liBKkAixI/AAAAAAAAACw/MIQN4tuaExY/s200/%E5%8A%A0%E9%80%9F%E5%BA%A6USB.jpg" alt="" id="BLOGGER_PHOTO_ID_5141248221774908178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;3軸加速度センサと温度センサからのデータを収集するために、USB PSoCを使ってシリアルからデータが流れてくるシステムを作ってみました。&lt;br /&gt;&lt;br /&gt;とくに変わった所はないのですが、サンプリングレートを向上させるためにインクリメンタル型ではなく、sigma-delta 型のADコンバータを使っています。&lt;br /&gt;1ポイント4回サンプリングで4chのデータを 32Hzの割り込みで取り出しています。サンプルレートだけなら、128Hzあたりはとれてもおかしくないんですけど、アナログスイッチの切り替えやシリアル通信があるからなのかできても64Hzでそれ以上はちょっと無理な感じですね。&lt;br /&gt;&lt;br /&gt;今日は気力がないので完成品の写真だけですが、また元気なときにプロジェクトともどもアップしていきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-4457970355196406820?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/4457970355196406820/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=4457970355196406820' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4457970355196406820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/4457970355196406820'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/12/blog-post.html' title='マルチチャンネルレコーダー'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/R1liBKkAixI/AAAAAAAAACw/MIQN4tuaExY/s72-c/%E5%8A%A0%E9%80%9F%E5%BA%A6USB.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-5032748250308504848</id><published>2007-11-30T02:49:00.000+09:00</published><updated>2007-11-30T03:53:16.912+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>PSoC温度計を作ってみた（その４）</title><content type='html'>&lt;span style="font-weight: bold;"&gt;コードも載せときます。&lt;br /&gt;プロジェクト全部は&lt;a href="http://hwhack.patapon.org:16080/wiki/index.php?plugin=attach&amp;amp;pcmd=open&amp;amp;file=LCDTEMP443.zip&amp;amp;refer=PSOC%2F%E4%BD%9C%E5%93%81%E5%B1%95%E7%A4%BA"&gt;&lt;br /&gt;こちら&lt;/a&gt;から。&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;code class="prettyprint"&gt;&lt;br /&gt;//---------------------------------------------------&lt;br /&gt;// C main line&lt;br /&gt;//---------------------------------------------------&lt;br /&gt;#include &amp;lt;m8c.h&amp;gt;        // part specific constants and macros&lt;br /&gt;#include "PSoCAPI.h"    // PSoC API definitions for all User Modules&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define ADC    4096.0&lt;br /&gt;#define PGAGAIN   4.0&lt;br /&gt;#define VREF   2.6&lt;br /&gt;#define SUM      50&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void main()&lt;br /&gt;{&lt;br /&gt;   // Insert your main routine code here.&lt;br /&gt;  &lt;br /&gt;   int data , i, j;&lt;br /&gt;   float temp ;&lt;br /&gt;   char  *ostr ;&lt;br /&gt;  &lt;br /&gt;   LCD_1_Init() ;&lt;br /&gt;   LCD_1_Position(0,0) ;&lt;br /&gt;   LCD_1_PrCString("PSoC Thermometer") ;&lt;br /&gt;   M8C_EnableGInt ; // global interrupt enabling macro&lt;br /&gt;&lt;br /&gt;   PGA_1_SetGain(PGA_1_G4_00) ;&lt;br /&gt;   PGA_1_Start(PGA_1_HIGHPOWER) ;&lt;br /&gt;   ADCINC_1_Start(ADCINC_1_HIGHPOWER) ;&lt;br /&gt;   ADCINC_1_GetSamples(0) ;  // read AD convert continuously&lt;br /&gt;   for(;;) {&lt;br /&gt;    temp = 0 ;&lt;br /&gt;    for( i=0; i&amp;lt;SUM; i++) {&lt;br /&gt;     while(ADCINC_1_fIsDataAvailable() == 0 ) ;&lt;br /&gt;     ADCINC_1_iClearFlagGetData() ;&lt;br /&gt;     data = ADCINC_1_iGetData() ;&lt;br /&gt;     temp += (data * VREF * 100 ) / ( ADC * PGAGAIN) ; //calculate AD --&amp;gt; temp&lt;br /&gt;    }&lt;br /&gt;    temp /= SUM ;&lt;br /&gt;   &lt;br /&gt;    ostr = ftoa(temp,&amp;amp;j) ;&lt;br /&gt;    ostr[5] = '\0' ;&lt;br /&gt;   &lt;br /&gt;    LCD_1_Position(1,2) ;&lt;br /&gt;    LCD_1_PrHexInt(data) ;&lt;br /&gt;    LCD_1_Position(1,7) ;&lt;br /&gt;    LCD_1_PrString(ostr) ;  &lt;br /&gt;   }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-5032748250308504848?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/5032748250308504848/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=5032748250308504848' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5032748250308504848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/5032748250308504848'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/11/psoc_8198.html' title='PSoC温度計を作ってみた（その４）'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-3966186365283222926</id><published>2007-11-30T01:45:00.000+09:00</published><updated>2008-12-10T21:25:42.767+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>PSoC温度計を作ってみた（その３）</title><content type='html'>&lt;span style="font-weight: bold;"&gt;コーディングと動作確認、そして完成へ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;プロジェクトファイルをおいておくのでそちらを参照してください。moduleのイニシャライズをしたら、ADコンバータのデータを読み込み計算結果を合計して、平均値を出して表示します。これを繰り返すだけですね。&lt;br /&gt;&lt;br /&gt;ADCINC_1_Start() と PGA_1_Start()でパワー指定をするときに、 HIGH以外を選ぶとAD変換や増幅時の直線性に問題が出て、データがおかしくなることがあるので注意。特に LOWPOWERはわかっていない限り選ばないほうがいいです。&lt;br /&gt;&lt;br /&gt;書き込んだら通電してみてください。液晶の濃さは半固定抵抗でかえられるので、見やすいように調整してください。僕が最初につくったモジュールは動かない！とおもったらとても薄くなっていただけでした。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R07tWxw0TsI/AAAAAAAAACo/Cyu-b0pzll0/s1600-h/%E6%B8%A9%E5%BA%A6%E8%A8%88.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_ZFlW0NdMJdk/R07tWxw0TsI/AAAAAAAAACo/Cyu-b0pzll0/s200/%E6%B8%A9%E5%BA%A6%E8%A8%88.jpg" alt="" id="BLOGGER_PHOTO_ID_5138305200447311554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;あとは、電池駆動するなり、5VのACアダプタを刺せるようにすればそのまま使えます。リファレンスをバンドギャップ電源からとっているので、電源電圧が安定していなくてもかなり正確な温度が出るはずです。&lt;br /&gt;必要パーツがコネクタ類をのぞけば、 液晶表示機と半固定抵抗、温度センサ、PSOCだけというのは面白いとおもいませんか？&lt;br /&gt;&lt;br /&gt;まあ、実際にはこの基板は共著のYUO氏からデカップリングコンデンサが足りないという厳しい突っ込みをうけてしまったわけですが、いちおうこのまま作ってもよほどのことがないかぎり動くとは思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2163145321427576610-3966186365283222926?l=hwhack.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hwhack.blogspot.com/feeds/3966186365283222926/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2163145321427576610&amp;postID=3966186365283222926' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3966186365283222926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2163145321427576610/posts/default/3966186365283222926'/><link rel='alternate' type='text/html' href='http://hwhack.blogspot.com/2007/11/psoc_8941.html' title='PSoC温度計を作ってみた（その３）'/><author><name>CUEICHI</name><uri>http://www.blogger.com/profile/13920255620550186535</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_ZFlW0NdMJdk/R07tWxw0TsI/AAAAAAAAACo/Cyu-b0pzll0/s72-c/%E6%B8%A9%E5%BA%A6%E8%A8%88.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2163145321427576610.post-2011219450066447697</id><published>2007-11-30T01:39:00.000+09:00</published><updated>2008-12-10T21:25:44.074+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PSoC'/><category scheme='http://www.blogger.com/atom/ns#' term='作ってみた'/><title type='text'>PSoC温度計を作ってみた（その２）</title><content type='html'>&lt;span style="font-weight: bold;"&gt;モジュールと論理配線&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;今回必要なのは ADコンバータのADCINCと 増幅用のPGA そして LCD液晶のモジュールです。ADCINCは2nd stageを選びました。それぞれ ADC / Amplifier / Misc. Digital のセクシ
