Slide 1

Slide 1 text

USBシリアル2015 @tokudahiroshi

Slide 2

Slide 2 text

USBシリアルケーブル2013 ● おなじみ秋月のシリアルケーブル ● 安心と信頼のFTDI ● 1,580円 ● BeagleBone Blackだとばっちり ● ケーブル長1.8m ● ジャンパーケーブル必要 ● http://akizukidenshi.com/catalog/g/gM-05840/

Slide 3

Slide 3 text

USBシリアルケーブル2014 ● 新たな選択、千石のシリアルケーブル ● PL2303 ● 880円 ● ジャンパーケーブル不要 ● ケーブル長1m ● Windowsドライバは工夫が必要 ● PL2303_Prolific_DriverInstaller_v1.5.0.zip ● http://www.sengoku.co.jp/mod/sgk_cart/detai l.php?code=EEHD-4HJ7

Slide 4

Slide 4 text

USBシリアルケーブル2015 ● さらなる低価格 ● 配線が面倒なのでUSBシリアルごと保管したい ● 板を買いすぎとか言われても困る ● 特定用途の使い勝手 ● そもそもシリアルポートはどこなのか ● 信号が出ているかどうかわかるだけで嬉しい ● 速度があってないだけなのか判断できる ● 自作ドライバが動いているか確認したいなど ● はんだ付けはちょっとね

Slide 5

Slide 5 text

aitendo

Slide 6

Slide 6 text

製品名 M2303-UAM5P U2S-340G U2TL340-5P(現行品?) U2U-CP2102-5P チップ PL2303 CH340 CP2102 価格 500円 500円 600円 オンボードLED TX, RX区別あり TX, RX区別あり TX, RX区別なし Windows対応 癖あり 標準 標準 NetBSD uplcom uchcom(要パッチ) uslsa (私的)総合評価 △ ◎ ○ USBシリアルケーブル2015 ● USBドングル型に注目が集まる

Slide 7

Slide 7 text

製品が結構入れ替わる のでチップ名で覚えて おくと良いですね

Slide 8

Slide 8 text

NetBSD/evbmips on Linino ONE @tokudahiroshi

Slide 9

Slide 9 text

Maker faire 2014 Tokyo ● 小さいMIPSマシン! ● 勢いで買える値段 ● キャラクタがいい感じ ● 時は2014/11/24のこと https://twitter.com/tokudahiroshi/status/536789022987661312

Slide 10

Slide 10 text

スペック ● ブレッドボードで使えるArduino YUN ● ATmega32u4 16MHz (Arduino) ● Atheros AR9331 400MHz MIPS 24k SoC (Linux) ● IEEE802.11b/g/n AP or router ● 64MB DDR2 RAM ● 16MB Flash Memory ● オプションでRJ45, USB, microSD

Slide 11

Slide 11 text

ブート回り ● ブートローダはu-boot ● u-boot 1.1.4-linino-gdd727126 ● ブートローダに入るには(覚えておこう!) (1) WiFi Reset buttonを押す (2) 母艦でUSBシリアルが認識されるのを待つ (3) Teratermなどで接続 (4) Linino Reboot buttonを押す (5) linino> プロンプトにすばやく“lin”と入力 ● エコーバックされないので注意

Slide 12

Slide 12 text

さて外部からカーネルを読ませるか ● 標準だとRJ45もUSBもmicroSDもない ● つまりマトモな外部インタフェースがない ● tftpbootも使えるしRJ45のオプション買うか… ● え?! 日本では買えないの... (当時) ● ていうか$25って高っ!

Slide 13

Slide 13 text

なんとかならないのか ● ブートローダのhelpを改めて見ると ● ん? loadbというコマンドがあるぞ ● load binary file over serial line (kermit mode) ● これだ! ● シリアル経由でカーネルを転送! いけます! ● 2014年にkermitを使うとは思わなかった (大学時代) ● Wikipediaでkermitの項目を思わず読みふける ● かなり削ったカーネルでもロードに5分かかります ● 待ち時間中のゲームがはかどりました

Slide 14

Slide 14 text

まずは一文字出力 ● シリアルポートのアドレスをググる ● どうやら0x18020000らしい ● いつものu-bootでテスト ● mmコマンドでアドレスに直接“@”を書き込む ● “@”はサンプルで何でもよい ● “@”のASCIIコードは0x40 ● linino> mm.l 18020000 18020000: 00000230 ? 00000040 18020004: 00004388 ? ● あれ? 表示されないな...

Slide 15

Slide 15 text

仕様書を読まずにやってみる ● 最初の値を見る ● 18020000: 00000230 ● 法則をみつける ● 230のうち30はなんだろう? ASCIIコードは“0”か… ● あれこれ試して変化を見ると230のうち2は不変ぽいぞ ● それっぽく動く ● 頭の2はかえずにASCIIコード0x40を書いてみるか ● linino> mm.l 18020000 18020000: 00000230 ? 00000240 @18020004: 00004388 ?

Slide 16

Slide 16 text

それをプログラムからやればドライバ ● アットマークを出力しつづける原型 ● atput lui t0, 0x1802 li t1, 0x240 sh t1, 2(t0) j atput ● もうちょっと改善 ● ASCIIコードは4バイト目だけに書けばよい sb t1, 3(t0) ● ステータスレジスタをみてTX_BUSYかどうかを チェックしてからレジスタに書く

Slide 17

Slide 17 text

MIPSアセンブリ ● MIPSアセンブリをはじめてさわる ● やって気づいたビッグエンディアン ● 遅延スロットとか知らない初心者 ● 偶然にも熱血アセンブラ入門が手元に ● これは買っておくべき

Slide 18

Slide 18 text

最初の四行でつまづく ● アットマークデバッグで停止場所を特定 ● mfc0 v0, MIPS_COP_0_STATUS ● and v0, MIPS_SR_BEV ● mtc0 v0, MIPS_COP_0_STATUS # Disable interrupts ● COP0_SYNC ● さっぱりわからん ● Twitterでぼやいていると、なぜか西村さんからメールが ● u-bootでは初期化処理で”0x10000004”をCOP_0に ● https://github.com/pepe2k/u-boot_mod/blob/master/u-boo t/cpu/mips/start.S ● 真似たら進んだ(1/26)

Slide 19

Slide 19 text

これがエスパーか

Slide 20

Slide 20 text

一進一退 ● 1/30 Cの世界にようこそ ● 2/2 printfが動く ● 2/3 UART0がcomではないことを知る ● つまり独自にドライバを書かねばならない... ● 2/7 freqがとれるようになる ● 2/10 行き詰ってDEBUGをONにしてみるか...  ● 2/13 DEBUG ONでinit_main.cに入る ● そして2/15

Slide 21

Slide 21 text

バナーきた ● インラインアセンブリとか関数ポインタのアド レス表示とかお勉強しつつ Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 The NetBSD Foundation, Inc. All rights reserved. Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. NetBSD 7.99.1 (DB120) #130: Sat Feb 14 18:07:39 UTC 2015 root@aug:/usr/obj/sys/arch/evbmips/compile/DB120 Atheros AR9331 total memory = 128 MB avail memory = 123 MB

Slide 22

Slide 22 text

dbに落ちたら入力作るマン ● 入力ができると ● カーネルデバッガに指示を与えて色々な情報がとれるよう になるので嬉しい ● 入力ルーチンgetcを作る(ロジックは簡単) ● UART0_CSにRX_BUSYがセットされるまで待つ ● UART0_DATAレジスタのUART_RX_CSRがONならば URAT0_DATAレジスタの下位1バイトを入力文字として 取り出す ● UART0_DATAレジスタにUART_RX_CSRをONにし、下 位1バイトを0にしたものを書き込む

Slide 23

Slide 23 text

しかし、行き詰る ● 先に進まないのには理由がある ● 技術力不足 ● イライラによる判断力低下 ● うっかりや思い込み ● ではどうするか ● いったん離れる ● イライラの原因を見つめなおす ● カーネルロードに5分はやっぱりつらい

Slide 24

Slide 24 text

よし課金しよう

Slide 25

Slide 25 text

課金したら ● dogRJ45買って来たら動くようになる ● tftpboot最高です ● 動かない原因も判明 ● comドライバのルーチンを中途半端に呼んでいた ● シリアルドライバを実装 ● mips/adm5120/dev/uart.c をお手本に ● わずか350行という短さ ● 先の入出力ロジックを移植して、割り込みをONにす る程度の差分で実装完了

Slide 26

Slide 26 text

いきなり全部作らなくていい ● シリアル関連の実装は移植の進行に合わせて作 ればよい模様 ① printfを動作させるための表示 (putc) ② カーネルデバッガを使うための入力 (getc) ③ 割り込みベースの入出力

Slide 27

Slide 27 text

uartドライバ ● デバイス認識 ● uart_probe * ● uart_attach * ● 原始的な入出力 ● uart_cnattach ● uart_cnputc * ● uart_cngetc * ● uart_cnpollc ● TTYデバイスとして必要 ● uart_open ● uart_close ● uart_read ● uart_write ● uart_poll ● uart_ioctl ● uart_param ● uart_tty ● uart_start ● uart_stop ● uart_intr * ① ② ③ ③ ③

Slide 28

Slide 28 text

RJ45最高! しかし問題が... ● 覚えてますか? ブートローダに入るには ● 基板上の二つのボタンをそれぞれ押す必要がある ● しかしRJ45モジュールをつけると押しにくい ● というか押せない ● どうするか? この下にボタンがある

Slide 29

Slide 29 text

つまようじで押す

Slide 30

Slide 30 text

まとめ ● 移植はやっぱり楽しい ● のんびりやれるのがNetBSDらしいところ ● エスパーすごいなー ● 教訓 ● 短いドライバを見つけてきてパクるとラク ● アツくなったら気分転換 ● ある程度進んだら課金もアリ ● Twitterこわい