NetBSD/evbmips on Linino ONE and USB Serial 2015

Afc04724f6f4d641f60ef315a692cc07?s=47 adukot
October 25, 2015

NetBSD/evbmips on Linino ONE and USB Serial 2015

Afc04724f6f4d641f60ef315a692cc07?s=128

adukot

October 25, 2015
Tweet

Transcript

  1. 2.

    USBシリアルケーブル2013 • おなじみ秋月のシリアルケーブル • 安心と信頼のFTDI • 1,580円 • BeagleBone Blackだとばっちり

    • ケーブル長1.8m • ジャンパーケーブル必要 • http://akizukidenshi.com/catalog/g/gM-05840/
  2. 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
  3. 4.

    USBシリアルケーブル2015 • さらなる低価格 • 配線が面倒なのでUSBシリアルごと保管したい • 板を買いすぎとか言われても困る • 特定用途の使い勝手 •

    そもそもシリアルポートはどこなのか • 信号が出ているかどうかわかるだけで嬉しい • 速度があってないだけなのか判断できる • 自作ドライバが動いているか確認したいなど • はんだ付けはちょっとね
  4. 5.
  5. 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ドングル型に注目が集まる
  6. 9.

    Maker faire 2014 Tokyo • 小さいMIPSマシン! • 勢いで買える値段 • キャラクタがいい感じ

    • 時は2014/11/24のこと https://twitter.com/tokudahiroshi/status/536789022987661312
  7. 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
  8. 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”と入力 • エコーバックされないので注意
  9. 13.

    なんとかならないのか • ブートローダのhelpを改めて見ると • ん? loadbというコマンドがあるぞ • load binary file

    over serial line (kermit mode) • これだ! • シリアル経由でカーネルを転送! いけます! • 2014年にkermitを使うとは思わなかった (大学時代) • Wikipediaでkermitの項目を思わず読みふける • かなり削ったカーネルでもロードに5分かかります • 待ち時間中のゲームがはかどりました
  10. 14.

    まずは一文字出力 • シリアルポートのアドレスをググる • どうやら0x18020000らしい • いつものu-bootでテスト • mmコマンドでアドレスに直接“@”を書き込む •

    “@”はサンプルで何でもよい • “@”のASCIIコードは0x40 • linino> mm.l 18020000 18020000: 00000230 ? 00000040 18020004: 00004388 ? • あれ? 表示されないな...
  11. 15.

    仕様書を読まずにやってみる • 最初の値を見る • 18020000: 00000230 • 法則をみつける • 230のうち30はなんだろう? ASCIIコードは“0”か…

    • あれこれ試して変化を見ると230のうち2は不変ぽいぞ • それっぽく動く • 頭の2はかえずにASCIIコード0x40を書いてみるか • linino> mm.l 18020000 18020000: 00000230 ? 00000240 @18020004: 00004388 ?
  12. 16.

    それをプログラムからやればドライバ • アットマークを出力しつづける原型 • atput lui t0, 0x1802 li t1,

    0x240 sh t1, 2(t0) j atput • もうちょっと改善 • ASCIIコードは4バイト目だけに書けばよい sb t1, 3(t0) • ステータスレジスタをみてTX_BUSYかどうかを チェックしてからレジスタに書く
  13. 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)
  14. 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
  15. 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
  16. 22.

    dbに落ちたら入力作るマン • 入力ができると • カーネルデバッガに指示を与えて色々な情報がとれるよう になるので嬉しい • 入力ルーチンgetcを作る(ロジックは簡単) • UART0_CSにRX_BUSYがセットされるまで待つ

    • UART0_DATAレジスタのUART_RX_CSRがONならば URAT0_DATAレジスタの下位1バイトを入力文字として 取り出す • UART0_DATAレジスタにUART_RX_CSRをONにし、下 位1バイトを0にしたものを書き込む
  17. 23.

    しかし、行き詰る • 先に進まないのには理由がある • 技術力不足 • イライラによる判断力低下 • うっかりや思い込み •

    ではどうするか • いったん離れる • イライラの原因を見つめなおす • カーネルロードに5分はやっぱりつらい
  18. 25.

    課金したら • dogRJ45買って来たら動くようになる • tftpboot最高です • 動かない原因も判明 • comドライバのルーチンを中途半端に呼んでいた •

    シリアルドライバを実装 • mips/adm5120/dev/uart.c をお手本に • わずか350行という短さ • 先の入出力ロジックを移植して、割り込みをONにす る程度の差分で実装完了
  19. 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 * ① ② ③ ③ ③
  20. 30.

    まとめ • 移植はやっぱり楽しい • のんびりやれるのがNetBSDらしいところ • エスパーすごいなー • 教訓 •

    短いドライバを見つけてきてパクるとラク • アツくなったら気分転換 • ある程度進んだら課金もアリ • Twitterこわい