$30 off During Our Annual Pro Sale. View Details »

NetBSD/evbmips on Linino ONE and USB Serial 2015

adukot
October 25, 2015

NetBSD/evbmips on Linino ONE and USB Serial 2015

adukot

October 25, 2015
Tweet

More Decks by adukot

Other Decks in Technology

Transcript

  1. USBシリアル2015
    @tokudahiroshi

    View Slide

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

    View Slide

  3. 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

    View Slide

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

    View Slide

  5. aitendo

    View Slide

  6. 製品名 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ドングル型に注目が集まる

    View Slide

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

    View Slide

  8. NetBSD/evbmips
    on
    Linino ONE
    @tokudahiroshi

    View Slide

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

    View Slide

  10. スペック
    ● ブレッドボードで使える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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. 最初の四行でつまづく
    ● アットマークデバッグで停止場所を特定
    ● 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)

    View Slide

  19. これがエスパーか

    View Slide

  20. 一進一退
    ● 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

    View Slide

  21. バナーきた
    ● インラインアセンブリとか関数ポインタのアド
    レス表示とかお勉強しつつ
    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

    View Slide

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

    View Slide

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

    View Slide

  24. よし課金しよう

    View Slide

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

    View Slide

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

    View Slide

  27. 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 *





    View Slide

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

    View Slide

  29. つまようじで押す

    View Slide

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

    View Slide