とあるエンジニアの備忘log
2015年10月19日月曜日
ELCE 2015 in Dublin
今年も [Embedded Linux Conference Europe](http://events.linuxfoundation.org/events/embedded-linux-conference-europe) に行ってきました。 今年の開催地はアイルランドの首都ダブリンでした。 会場の外の景色は、近年の ELCE で一番美しかったと思います。斜めの円筒形に見えるのか会場。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGCmTfG0ddMSfzl1akUuYRIKmmdO25nQC8OB5g6DBtR3FCPVrOdzbkVZ4rYKkZtwQuHHS7lbAaX5sWdQsQ8YO3YAWHTZCrsf30azIc5Nak26oSK3ElhvdPvVXpvX3fxXmiW6CgZIRufyU/s1600/dublin.jpg) 会場の Convention Centre Dublin。ユニークな形です。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh0uc4RGw4fRls0n4v_XZjAjDatW6aOq7VCKmPbpBHYTpEICvwqS8sHJv3IT8kmC4cHa2r25EdWg_cJQ4-8q-W-lkwoqkTPMaJYJLHs-UOLv8-iS_G4zcUBOTZ6P7DE2-W0YrU3eBsxgg/s1600/ccd.jpg) [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAf7fjtnzu3vbMFTBVr7k_IdU-jKBOzULNXjFFG5nlJfnjcenEzNI1swrLIrjSde0Nk4cpzRJwd-RBEaBVykbWhAiJnUvnqmassVcWUFUieTVEAcZ3INPKGSQRZ7tg6n6p8RS3vf6HXAw/s1600/welcome.jpg) アイルランドのシンボルカラーの緑に合わせてか、今年のテーマカラーは緑のようです。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXxT7X3OHjl3A9bfH4bLjYod0Eqvft9mnoeOg_i-32S6ACtzfPXylqjbsr34PMV5752tep1RmikAyCDWsK9riW_nQavuECSuVZ1KPaG0jkeSRfn0FOl5aBZddm2XWO3pmpuujtjLbAqDs/s1600/opening.jpg) 今年も [U-boot Mini Summit](http://www.denx.de/wiki/U-Boot/SummitELCE2015) やってました。内容がマニアック過ぎて、 BoF (Birds of a Feather)の様相を呈していましたが。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0PmMhazteaZSsJUav1IwWVMDkgJdQLMWTUzIXg5paB7XcJYss-XO1UTRpxo7QQTxLLqjxhLRroJGpu27imk_i59Y9O0_Ymh5mYGWeHeXDZXd8GJ5yXKzPuNtLvOU4M9hK8wTJPkgZ-LE/s1600/uboot_summit2015.jpg) 夜はパブで U-boot メンバーの飲み会。 [](http://3.bp.blogspot.com/-XGCzolTLiZQ/VhLwg7NHcfI/AAAAAAAASsE/FwzmwnoJccs/s1600/uboot_guinness_summit2015.jpg) アイルランドと言えば、このビール。個人的にはあまり好きな味ではないんですが(黒ビール自体も)。「カァァー」というのどごしがなくて、「へな〜」としてます。アサヒスーパードライの方がはるかに美味しいぞ。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEs8pAB6vuaFMyLP5qGN8CN_E0TXjbMuEcBc72yRYrj5GT7S7ODc4PW_XsB-4E9D1TMcoRLzgV3je-OnhxZz_WeB1wBYDrP4_MzZ3g_GG5bTKdX35AP65hGTEc6Gzzh9R1gw8wAqTGmdo/s1600/guinness.jpg) I2C サブシステムのメンテナーによるのプレゼン。これ見て、自分のドライバにも Slave モード実装してみるか。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ1tLMEdSdB87_OGLkS92pmPqbQGfbrwrwwP_WNegfoEURv_pIYio28sMeT1BeqKDCshZ3i2aeECDPnMjjDQdzg9IGQOXEQxoQ_udaAGlo8YSaqTqHNBRafhhvYSAS5pgQJZgsIhZRwhs/s1600/i2c_slave.jpg) 2日目は Linus も登場。"いつもの" 2人 (スキューバダイビング仲間)によるチャット。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg49MP5OVP-gK-yBb41sa9BZ_hIyRuaeuIpV3ffcWWLngRk5VVfdKxklIrvd9zuIr9_clNy0il9YcVgUKO68aUniEjq7OW0PjUNS8U2DGmMIF4OTn5t6FXz7I4Elnfz1mlWBbQ3BldNAm8/s1600/linus_chat.jpg) Closing Game。Rock, Paper, Scissors, Lizard, Spock。勝ったのかどうかわからん。。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0kgfOjt0_wGi3f3cK79ZIIC08R8Di8YzQWFowQiMp5N9yW8Xw49s3RpXan3hSPvmrfgZiY9D92HDV04l7irccGFRs8ughK0M0Z4WGExMe_re3nEfTFPyUgaIPlPozqoKxWehLKYqRb38/s1600/closing_game.jpg) Guinness Storehouse というところで、Reception Event。Guinness のできるまでを見学しながら、どんどん上に上がっていきます。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj41dSeg6fclgVtC9aKCXIzNcQk7-rfD3gnygmf8OvgGpBoIeX7TvCsoGBep_X9b2_xuGmd-kJY7RVAkS3stBJSwnUZ6KXjrh9rKBSfD5rAf9QlPSPgS2YS4pR4E8zzNGQ2vL2w3CDfzUg/s1600/guinness_house.jpg) 最上階がバーになっています。 [](http://4.bp.blogspot.com/-D0nhpTGSzYo/VhWa2lyijNI/AAAAAAAASts/K0EZROK_fOc/s1600/closing_reception.jpg) 自分で Guinness を注ぎます。 [](http://1.bp.blogspot.com/-Ghvop4_WhI0/VhWavxO0enI/AAAAAAAAStI/4QOwG2Ykr40/s1600/serve_beer.jpg) 今年の T シャツ。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbH7HSHFnoR4slSgeqVc3URfcqX6hdqNv4cBfp3xkyxe8nJszsqpaLwerdwtkV-HMhu_cSvxvS6C679q4dD7tOyaxyW8OANf6IpPSOa5ythRiYqpBjakndvF84xLMSsuBcDSgQKHllLj0/s1600/elce_shirt2015.jpg)
2015年6月6日土曜日
LinuxCon Japan 2015
6月3-5日に LinuxCon Japan 2015 に行ってきました。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLDizobXv6tYTeN_6QNNfiQL89jEmBkxy-i1IUaPWt6QeebLlpioEdG9aIq9200YRpIYh4Q0JVyw5LlxWTjezWHmk-fSVgkUAK-JzMRtxfJqxDCqeI7PJ2jqtAry58w2jMP4vl2ZQLZ4Q/s1600/lcj2015_keynote.jpg) [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk3Hat53x6klA-UCj1EVDM8bdWFPjKOVSkaI_vCW1TuoTVhI3pAnHBRnonvPOjqHoyLFkavsR3KXzYZb0YbfPKAeJ5zz3en-KfBzczyWS2dq3VMgDRwUJj0-_MwBz24ghEcrNDyiwZ29I/s1600/lcj2015.jpg) 興味深いプレゼンもいろいろと聞けました。 以下は SH2 互換チップをオープンソースな RTL で再実装し、 Xilinx の安い FPGA で動かして、 Linux まで走らせました、というもの。 セガサターンにも使われた SH2 ですが、パテント切れで面白いことができるようになってて、 FPGA にも入る規模です。 個人的には 10年前に出た 1チップ MSX も思い出して、ノスタルジックな気持ちになりました。SuperH を設計したアーキテクトが Hitachi 退職後にやっていて、なかなか楽しそうな内容です。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFUoo8K2Z7AhqSs_yJWTye0l0wwNLyO-RZUmqWEHUCy1xezHg1RWD7VmzzYdgIKh5qzgge3h6Wm0sBH3V0CmBJvL-9CuueXZj-qq3xrHTB84M6i4R65G2L9MW2PV87vDHRL4jklB-4nxM/s1600/sh2.jpg) Linux 以外の話題では git の内部設計についての解説とか。 Junio C Hamano さんの入門本にも書いてたので、だいたい知ってる内容ですが。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_-BQgzNX90WQXbaeUPlQIOM76BGn7nL9B8BFPpHtxNzCCRskGxx2YMS2uaresMQ7aff9G2i9Jiac6cXW6NJYJ8t9wMktLfkH7r4H_O5VwjD2vPNOnCTM6XZeUbTCY6SkAMvDx-J5mB_A/s1600/git.jpg) 夜は当然のごとく飲み。 [](http://4.bp.blogspot.com/-sdapUJsg2CU/VXBvMAS5wFI/AAAAAAAAQlQ/e9lVBhBJI8g/s1600/beercon2015.jpg) 今年の Tシャツ。 [](http://2.bp.blogspot.com/-xlLQ4AvQLkU/VW5I80WoU_I/AAAAAAAAQig/71RwMgwxZi0/s1600/lcj2015_shirt.jpg) さらに Booth Crawl でも Tシャツ貰ったり、プレゼンでいろいろ質問したら Raspberry Pi の Tシャツも貰えた。 Xen (右下) のTシャツは普段使いできそうなデザインです。さすがに Fujitsu のは部屋着にしか使えん。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjo3qp8u-mGMJedl6lyAejBwws7gKQzpTqGoYsynpLG-antDhZPNm7fCfdTn7PeWjpt83zNA9MxP8_gASLbUlKuMOMzzUMkSEUydrj-7cicf1Dp9IN7nb7UvVzy0FmuQvBpkqLBinx3reo/s1600/lcj2015_shirts3.jpg) 自分にとっては、プレゼンを聞きに行くだけではなくて、 普段メーリングリストでやり取りしている人とのオフ会としての意味もあるカンファレンスです。 友人と再会したり、新たに友達もできたり、非常に有意義な時間でした。
2015年5月31日日曜日
自分的 Ubuntu 14.04 LTS を入れて最初にやること
先日、PC を新調したので、Ubuntu 14.04 LTS 入れました。 最新のインストールイメージは 14.04.2 になっていました。LTS だと安心感があります。 とりあえず、自分好みの設定を、何かあった時のために、未来の自分のためにメモっておきます。(半年前の自分は、もはや他人ですので。。) #### マシン名を決める #### 設定とは直接関係ないのですが、最初にやらなくてはいけないこと、それは PC に名前をつけることです。 インストーラーが、masahiro-All-Series みたいにデフォルトで名前をつけてくれるが、これは味気ない。 自分の場合は、 Linux デスクトップ、Linux ノート、Windows デスクトップ, 実験用の板コン、VirtualBox 上の仮想PC など、いくつもの PC が稼働しており、PC も数年おきに新調するので、名前を毎回考えなくてもいいように、機械的なネーミングスキームが必要です。 しかも人間(自分)にとって覚えやすいものでなくてはならない。 そこで、 自宅のPC には昔から Sesame Street のキャラクター名をつけることにしている。 歴代愛機には elmo, cookie, bigbird, oscar, ernie, zoe, bert みたいな感じで名前をつけていた。 今回は "grover" と名付けることにした。 まだまだキャラクターがいるので、当面名前に困ることはないだろう。 自宅の LAN で勝手にやっているだけなので、権利関係で怒られることもないでしょう。 ちなみに、会社で自分が管理している PC は beagle, poodle, spitz, pug のように犬種名を付けて行っています。 ちなみにちなみに、Debian の コードネームは Toy Story のキャラクター名を付けて行っていますね。 #### パッケージのインストール #### `sudo apt-get install` でパッケージをインストールしていく - synaptic - apt-file - gnome-session-flashback # 以下 Unity やめる参照 - gnome-tweak-tool # swap Ctrl and Caps Lock - emacs - emacs-goodies-el # for color-theme - git - gitk - git-email # for git send-email - cvs subversion git-svn # 最近使わないのでいらないか - ccache - fcitx-mozc # 以下 「日本語変換設定」参照 - emacs-mozc - global - chromium-browser - indent - manpages-ja # for 日本語 man - libncurses5-dev # for Linux make menuconfig - virtualbox - virtualbox-guest-additions - ckermit - nkf - libc6:i386 libcurses5:i386 libstdc++6:i386 # for 32bit programs - ssh # ssh server - device-tree-compiler # dtc for building U-Boot - gimp - u-boot-tools # for mkimage - texlive-full #### Unityを やめる #### $ sudo apt-get install gnome-session-flashback でインストールした後、いったんログアウトし、 GNOME Flashback (Metacity) でログインし直す。 #### Ctrlキー入れ替えなど #### $ sudo apt-get install gnome-tweak-tool として 「システムツール」 -> 「設定」 -> 「Tweak Tool」 を開き、 「タイピング」 -> 「Ctrl キーの位置」 で 「Ctrl と Caps Lock を入れ替える」 を選択。 いったんログアウトする。 #### 日本語変換設定 #### 13.10 から ibus がクソになっているので fcitx を使います。 自分は昔から IME の ON は Henkan キー、 OFF は Muhenkan キーでやりたい人なのです。 トグル方式だと、今 ON なのか OFFなのかを認識していないといけないので、無意識にできない。 それと初めて買ってもらった PC が Mac だった (まだ 日本語 OS が漢字トークと呼ばれていた時代ですが。。) ので、指がそれに慣れてしまっています。 $ sudo apt-get install fcitx-mozc としたあと、「システムツール」-> 「システム設定」 -> 「言語サポート」 を開き、 「キーボード入力に使うIMシステム」が fcitx になっているのを確認。 「システムツール」-> 「設定」 -> 「Fcitx 設定」を開く。 「入力メソッド」タブは - キーボード-日本語 - Mozc になっているのを確認。(たぶん最初からそうなっている。) 「全体の設定]タブで「拡張オプションの表示」にチェックを入れる。 「入力メソッドをオンに」と「入力メソッドをオフに」という設定が出てくるので、それぞれ 「Henkanmode」, 「Muhenkan」 を設定する。 「入力メソッドのオンオフ」というところにデフォルトに 「Ctrl+Space」というのが入っているが、これは消す。(Escapeを押す)。 消しておかないと emacs で「Ctrl+Space」 (region選択開始)が使えない。 さらに、 iBus のインジケータを消すために、 「システムツール」-> 「システム設定」 -> 「テキスト入力」 を開き、 「メニューバーに現在の入力ソースを表示」のチェックを外す。 anthy は消してしまっていいので $ sudo apt-get remove anthy とする。 ibus を消そうとすると $ sudo apt-get remove ibus 以下のパッケージは「削除」されます: ibus ibus-pinyin ibus-table ubuntu-desktop unity-control-center unity-control-center-signon webaccounts-extension-common xul-ext-webaccounts アップグレード: 0 個、新規インストール: 0 個、削除: 8 個、保留: 13 個。 この操作後に 8,334 kB のディスク容量が解放されます。 続行しますか? [Y/n] と出てきて、依存関係でいろいろ消えてしまいそうだ。例えば、 unity-control-center が消されると、 「システムツール」-> 「システム設定」 のメニューがなくなって、影響が出そうなので、 ibus はとりあえず残しておくこととする。 #### 日本語ディレクトリを英語に #### 「ダウンロード」、「テンプレート」、「デスクトップ」、「ドキュメント」、「ビデオ」、「ピクチャ」、「ミュージック」、「公開」 というディレクトリを英語にする。 $ LANG=C xdg-user-dirs-gtk-update #### リポジトリを clone #### `~/ref` 以下に自分の興味のあるプロジェクトのリポジトリを reference として clone してくる。 git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git clone --reference linux --branch stable git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git clone git://git.denx.de/u-boot.git git clone --reference u-boot git://git.pengutronix.de/git/barebox.git git clone git://git.buildroot.net/buildroot git clone git://ozlabs.org/home/jk/git/patchwork #### emacs を目にやさしくする #### エディタはおそらく最も長時間向かうプログラムかもしれません。 しかしながら、 emacs のデフォルトの白のバックグラウンドは眩しすぎる。 そこで solarized にします。 $ sudo apt-get install emacs-goodies-el で color theme を使えるようにしておき $ git clone git://github.com/altercation/solarized.git ~/ref/solarized で solarized を取得。 `~/.emacs` に以下を追加。 (load-file "~/ref/solarized/emacs-colors-solarized/color-theme-solarized.el") (when (require 'color-theme-solarized) (color-theme-solarized-light)) #### スペルチェッカー #### aspell が入っていなければ、以下でインストール。 $ sudo apt-get install aspell `~/.aspell.conf` に以下の一行追加。 lang en_US nano から起動するために、 `~/.nanorc` に以下を追加。Ctrl-t で起動できる。 set speller "aspell -x -c" emacs は `M-x ispell-buffer` で起動できる。 #### ssh X forwading #### X で ssh を乗り越えさせる。 ssh クライアント (Xサーバー)側の設定: `/etc/ssh/ssh_config` を開き ForwardX11 no を ForwardX11 yes に変更。 ssh サーバー (Xクライアント)側の設定 (`sudo apt-get install ssh` でインストール必要): `/etc/ssh/sshd_config` を開き ForwardX11 yes になっていることを確認。(Ubuntuの場合、たぶんデフォルトでそうなっている。) #### postfix #### 自分は2段階認証を使っているので、Gmail 経由で postfix から送信するのはこちらがわかりやすかった。 [http://blog.bgbgbg.net/archives/2834](http://blog.bgbgbg.net/archives/2834) #### dot ファイル復元 #### ホームディレクトリの dot ファイルを別 PC から復元する。 - .profile - .bashrc - .bash_aliases - .aspell.conf # aspell - .aspell.en.pws # aspell 辞書 - .gitconfig # git - .emacs # emacs - .nanorc # nano - .kermrc # kermit - .buildman # U-Boot buildman - .patman # U-Boot patman
2014年12月26日金曜日
Linux の NAND の Bad Block 管理まとめ
Linux の MTD/NAND framework で、Bad Block の管理がどうなっているか、まとめてみた。 ### Bad Block と Bad Block Mark について ### NAND チップは、出荷時にある一定割合まで、不良ブロックを含んでいいことになっている。 ベンダーは、不良ブロックには、そのことがわかるように Bad Block Mark (以下 BBMと略す)というマークを付けて出荷する。 ベンダーによって若干仕様にブレがあるが、だいたい各ブロックの先頭ページの冗長領域 (以下 OOB = out of band と略す)の先頭に `0xFF` ではない値が書かれる。 また、消去と書き込みを繰り返すうちに、正常ブロックが不良化することもある。 その時にも BBM をつける。 当然ながら、BBM がついているブロックは使ってはいけない。 また、消去すると BBM も消えてしまうので、消去もしてはいけない(これ非常に重要)。 そのブロックが不良かどうかを調べるために、OOB の BBM を読みにいくと確実なのだが、かなり効率が悪いので、実際には Bad Block Table (以下 BBT と略す)を作って管理している。 各ブロックが不良かどうかを調べるには、理屈的には 3 つの方法があることになる。 - 各ブロックの OOB にある BBM を読む。もっとも効率が悪い。 - NAND Flash 上に構築される BBT (以下 flash based BBT と記す) を読む。 - Linux のメモリ上に構築される BBT (memory BBT と記す) を読む。 memory BBT が1次キャッシュで、 flash based BBT が2次キャッシュみたいなイメージで捉えてもいいかもしれない。 ### flash based BBT について ### flash based BBT は最初の一回だけ構築すればよく、その後は Bad Block が増えるごとに更新されていく。 BBT がどこに置かれるかについては、何パターンかあって、ドライバから指定できる。 チップの先頭に置くか、最後尾に置くかで 2通りある。 (`NAND_BBT_LASTBLOCK` フラグで決まる) NAND パッケージ上では 1つに見えても、内部的には複数のシリコンダイで構成されている場合があり、その場合には、全ダイ分の BBT を一箇所にまとめて置くか、ダイごとにテーブルを分けるかでも 2 通りある。 (`NAND_BBT_PERCHIP` フラグで決まる) トータル 2 x 2 = 4 通りの配置方法があり(もっと言うと任意のブロック上に BBT を置く `NAND_BBT_ABSPAGE` というフラグもある)、しかも BBT にも、メインとミラーがあるので結構ややこしい。 BBT はダイごとにテーブルを分けて、最後尾に置くのが普通なので、2 ダイ構成の NAND Flash の場合、通常以下の様な感じで BBT が置かれる。 |---------------------| | | | | | | | chip0 Data Area | | | | | |---------------------| | chip0 BBT | |---------------------| | | | | | | | chip1 Data Area | | | | | |---------------------| | chip1 BBT | |---------------------| ### memory BBT について ### memory BBT は Linux の起動時(正確に言うと NAND ドライバが `module_init` されたとき)に毎回作る。 (ただし `NAND_SKIP_BBTSCAN` フラグがセットされていると memory BBT は作成しない。) ややこしいので、フローチャートで説明すると以下のようになる。 |------------------------| | NAND_SKIP_BBTSCAN flag |---(ON)---> 何もしない |------------------------| | (OFF) | |----------------------| | NAND_BBT_NO_OOB flag |---(OFF)---> 全ブロック巡回して BBM を読み出し、 memory BBT を構築 |----------------------| | (ON) | |--------------------------| | flash based BBT exists ? |---(YES)---> flash based BBT を読みだして memory BBT を構築 |--------------------------| | (NO) | 全ブロック巡回して BBM を読み、memory BBT を構築して flash based BBT に書き込む。 実際に、とあるブロックがBad Block かどうかを問い合わせる場合には |---------------------| | memory BBT exists ? |---(YES)---> memory BBT を読み出す |---------------------| | (NO) | そのブロックの OOB の BBM を読む memory BBT は、各ブロックにつき 2bit の情報を持っている。 - `BBT_BLOCK_GOOD` (`0x00`): 正常ブロック - `BBT_BLOCK_WORN` (`0x01`): 使用しているうちに、正常ブロックから不良ブロックに変化したもの - `BBT_BLOCK_RESERVED` (`0x2`): flash based BBT が置かれているブロック - `BBT_BLOCK_FACTORY_BAD` (`0x3`): 最初から不良ブロックだったもの ### 実際の関数実装 (BBT 構築編) ### `nand_scan_tail()` 関数は (`NAND_SKIP_BBTSCAN` フラグがセットされていなければ) `chip->scan_bbt` を呼び出して、 memory BBT を作成する。 以下は関数呼び出しの概略 chip>scan_bbt (= nand_default_bbt: overridable) |-- nand_create_badblock_pattern `-- nand_scan_bbt |-- nand_memory_bbt | `-- create_bbt | |-- scan_block_fast | `-- bbt_mark_entry |-- verify_bbt_descr |-- read_abs_bbts | `-- scan_read |-- search_read_bbts | `-- search_bbt | `-- scan_read |-- check_create | |-- create_bbt | |-- read_abs_bbt | | `-- read_bbt | `-- write_bbt | |-- nand_erase_nand | `-- scan_write_bbt |-- mark_bbt_region `-- nand_update_bbt 各関数の詳細 int nand_default_bbt(struct mtd_info *mtd) `chip->scan_bbt` のデフォルト。 `NAND_BBT_USE_FLASH` フラグが立っていれば、flash based BBT を記述する BBT Descriptor (BBT をどこに置くとか、ID文字列とか、BBT の仕様を記述したもの)を メイン (`chip->bbt_td`) とミラー(`chip->bbt_md`)と 2つ分セットする。 `nand_scan_bbt` を呼び出して、BBT を scan する。 static int nand_create_badblock_pattern(struct nand_chip *this) 各ブロックの OOB の BBM を scan するときの、仕様を記述した BBT Descriptor を `chip->badblock_pattern` にセットする。 int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) `chip->bbt_td` がセットされていなければ(`NAND_BBT_USE_FLASH` がオフの時)、 `nand_memory_bbt` を呼び出して、各ブロックの OOB から BBM を読みだす。 セットされていれば、 flash based BBT が存在するか確認し、あればそれを使う。 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) `create_bbt` の Wrapper。 static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd, int chip) `chip->badblock_pattern` に基づいて 各ブロックの OOB にアクセスして BBM を読みだし、 memory BBT を作る。 通常は、各ブロックの先頭ページの OOB だけを見るが、 `NAND_BBT_SCAN2NDPAGE` フラグが立っていると、2ページ目も見る。 `NAND_BBT_SCANLASTPAGE` フラグが立っていると、ブロックの最終ページを見る。 OOB に BBM が付いているブロックには、 memory BBT 上では `BBT_BLOCK_FACTORY_BAD` とマークされる。 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, loff_t offs, uint8_t *buf, int numpages) `offs` 位置(ページ先頭を指している)から `numpages` ページ分の OOB を調べ、1 つでも BBM が付いていたら `1` を、 正常ブロックなら `0` を、その他のエラーならば、負の値を返す。 `buf` は temporary buffer で、 OOB を格納するのに十分な長さがないといけない。 static inline void bbt_mark_entry(struct nand_chip *chip, int block, uint8_t mark) memory BBT の先頭から `block` ブロック目のエントリーに対して、 `mark` をつける。 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd) BBT descriptor table `bd` の sanity check static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md) BBT Descriptor に `NAND_BBT_ABSPAGE` フラグが立っているときのみ呼び出される。 `NAND_BBT_VERSION` フラグが立っているときは、 `td->pages[0]` に BBT 位置が指定されているので、 そのページから BBT のバージョンを読みだして、 `td->version[0]` にセットする。 `md` が存在すれば、ミラーに対しても同じことをする。 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs, size_t len, struct nand_bbt_descr *td) BBT マーカーを含む領域を `buf` に読み出す。 `td` に `NAND_BBT_NO_OOB` フラグが立っているときは、 `offs` から マーカーの長さ (4 byte) さらにバージョン情報がある場合は、もう 1 byte 読み出す。 `NAND_BBT_NO_OOB` フラグが立っていない場合は、`offs` 位置の1ページ分(MAIN + OOB)を読み出す。 static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md) BBT Descriptor に `NAND_BBT_ABSPAGE` フラグが立っていないときのみ呼び出される。 `search_bbt` の wrapper。 `td` (メイン)、および `md` (ミラー)が存在すれば `md` についても `search_bbt` を呼び出す。 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) flash based BBT を探し、見つかると `td->pages[i]` に BBT の先頭のページ番号を格納する。 `NAND_BBT_VERSION` フラグが立っていれば `td->version[i]` にバージョン番号をつめる。 `NAND_BBT_PERCHIP` フラグが立っていれば、チップ単位で BBT を探す。 `NAND_BBT_LASTBLOCK` フラグが立っていれば、最終ブロックから前方に向かって、立っていなければ、先頭ブロックから後方に向かって探す。 int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td) `buf` に BBT の マーカー (通常は `'B'`, `'b'`, `'t'`, `'0'` の4文字, ミラーは `'1'`, `'t'`, `'b'`, `'B'` の 4文字) が含まれているかを調べる。 含まれていれば `0` 含まれていなければ `-1` を返す。 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) flash based BBT の読み出し、更新、新規作成をする。 `td`, `md` ともにまだ存在しない場合は、`create_bbt` を呼び出して、各ブロックの OOB から BBM を読みだして memory BBT を作る。 ただし、 `NAND_BBT_CREATE` フラグが立っていない もしくは `NAND_BBT_CREATE_EMPTY` フラグが立っていない場合は、 memory BBT は全ブロック `BBT_BLOCK_GOOD` になる。 少なくともどちらか存在する場合は、より新しいバージョンを持つ方の flash based BBT を読みだして memory BBT を作る。 int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) flash based BBT を読み出し、memory BBT へ書き込む。 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, struct nand_bbt_descr *td, int offs) NAND の `page` ページ位置の flash based BBT を読み出し、memory BBT の `offs` 位置から `num` エントリー分を書き込む。 `NAND_BBT_NO_OOB` フラグが立っている場合は、 先頭ページの最初は BBTマーカーとバージョン情報なので、その部分はスキップする。 `NAND_BBT_NO_OOB` フラグが立っていない場合は、先頭バイトから読む。 flash based BBT の各エントリーのビット数は td->options で指定される。 All 1 が `BBT_BLOCK_GOOD` に対応。 `td->reserved_block_code` に `0` 以外が指定されているときは、 `BBT_BLOCK_RESERVED` に対応。 All 0 が `BBT_BLOCK_FACTORY_BAD`、 それ以外は `BBT_BLOCK_WORN` に対応する。 static int write_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md, int chipsel) memory BBT を flash based BBT へ書き込む。 `NAND_BBT_LASTBLOCK` フラグが立っていない場合は、先頭ブロックから後方に向かって、 立っている場合は、最終ブロックから前方に向かって、bad block ではなく、ミラーでも使われていないブロックを探す。 見つかると、そのブロックを一旦消去し、 `scan_write_bbt` を呼び出して memory BBT の内容を書き込む。 void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) BBT が置かれているブロックに `BBT_BLOCK_RESERVED` マークをつける。 `NAND_BBT_ABSPAGE` フラグが立っていない場合は、 `td->maxblocks` ブロック分、マークをつける。 基本的に memory BBT のみの更新だが、 `td->reserved_block_code` に `0` 以外が指定されていると、 `nand_update_bbt` を呼び出して flash based BBT も更新する。 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs) flash based BBT のバージョンをインクリメントし、 `write_bbt` を呼び出して、更新する。 `chip->md` が存在すれば、ミラーに対しても同じことをする。 `NAND_BBT_PERCHIP` フラグが立っている場合は、 `offs` 位置のブロックが属する BBT のみが更新される。 ### 実際の関数実装 (Bad Block 問い合わせ編) ### mtd_block_isbad `-- mtd->_block_isbad (=nand_block_isbad) `-- nand_block_checkbad |-- chip->block_bad (=nand_block_bad:overridable) `-- nand_isbad_bbt 各関数詳細 int mtd_block_isbad(struct mtd_info *mtd, loff_t ofs) MTD layer の bad block 判定関数。 オフセット位置 `ofs` のブロックが bad block なら `1`、正常ブロックなら `0`、エラーの場合は負の値を返す。 `mtd->_block_isbad` がなければ 0 を返し、存在すれば呼び出す。 int nand_block_isbad(struct mtd_info *mtd, loff_t offs) `mtd_block_isbad` の NAND layer 実装。`nand_block_checkbad` の wrapper。 int nand_block_checkbad(struct mtd_info *mtd, loff_t ofs, int getchip, int allowbbt) memory BBT があればそれを読み、なければ `chip->block_bad` をコールして、直接 NAND chip の OOB を読む。 static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) OOB に直接アクセスして BBM を読み、 `0xFF` でなければ 1 を返す。 (TODO: `NAND_CMD_READOOB` のような低レベルコマンドだけでなく、 `chip->ecc.read_oob` に対応すべき??) int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) memory BBT にアクセスして Bad Block なら `1` を、正常ブロックなら `0` を返す。 `allowbbt` が `0` でないならば、 `BBT_BLOCK_RESERVED` (BBT を格納しているブロック) は正常ブロックとして扱い、 `allowbbt` が `1` ならば、 `BBT_BLOCK_RESERVED` は不良ブロックとして扱う。 ### 実際の関数実装 (BBMをつけるとき) ### mtd_block_markbad `-- mtd->_block_markbad (=nand_block_markbad) |-- nand_block_isbad `-- nand_block_markbad_lowlevel |-- nand_erase_nand |-- chip->block_markbad (=nand_default_block_markbad) `-- nand_markbad_bbt |-- bbt_mark_entry `-- nand_update_bbt `-- write_bbt 各関数詳細 int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs) MTD layer 関数。`ofs` の位置のブロックに BBM をつける。 static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs) `mtd_block_markbad` の NAND layer 実装。 `nand_block_isbad` を呼び出して、`ofs` が bad block か調べ、すでに bad block なら何もしない。 bad block でないなら `nand_block_markbad_lowlevel` を呼び出して、マークをつける。 static int nand_block_markbad_lowlevel(struct mtd_info *mtd, loff_t ofs) `NAND_BBT_NO_OOB_BBM` フラグが立っていない場合は、いったんそのブロックを消去し、OOB 領域に BBM をつける。 さらに `chip->bbt` が存在すれば `nand_markbad_bbt` を呼び出して、memory BBT と flash based BBT を更新する。 (`chip->bbt` が存在しなくても flash based BBT は更新すべきでは?バグ??) int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) `ofs` 位置のブロックの先頭ページ の OOB に BBM (0x00) をつける。 `NAND_BBT_SCAN2NDPAGE` フラグが立っていると、2ページ目にも BBM をつける。 ただし、`NAND_BBT_SCANLASTPAGE` フラグが立っている場合は、ブロック内最終ページに BBM をつける。 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) `bbt_mark_entry` を呼び出して memory BBT に `BBT_BLOCK_WORN` マークをつける。 `NAND_BBT_USE_FLASH` フラグが立っている場合には、`nand_update_bbt` を呼び出して、flash based BBT も更新する。
2014年11月20日木曜日
Google からの贈り物
先月のある日、 Google の Open Source Programs Office というところからメールが来まして。 読んでみると、 オープンソースで優れた仕事をしている人を表彰していて、あなたの仕事がそれに値すると認められました。 ついては、記念品と賞金を送りたい。 というような内容でした。 「お金あげます」という類のスパムは頻繁に来るのですが(特にオープンソースに参加しているとよくスパムが来る)、金額がまっとうな額な上に、 メールの内容が、自分のやったきたことに合致するので、本物のようです。 とりあえず、住所等をフォームから送信して、待つこと数週間。 本当に来ました! 予想外にでかい FeDex の箱を開けると、中から出てきたのは、、、 [](http://4.bp.blogspot.com/-jHvUJsHxOnQ/VGy9y9GB_tI/AAAAAAAANHU/aobPS-5vNX0/s1600/google_blanket.jpg) 暖かそうな、ブランケットのようです。 あまりにも実用的な品なので、かえって拍子抜けしてしまいました。(笑) プリペイドのクレジットカードも送られてきました。 賞金があらかじめチャージされていて、その分だけ使えるようです。 ただただ、自分の趣味でパッチを送り続けてきたのですが、このように認めてもらえるのは嬉しいものです。 このブランケットを使って、もっとパッチ送ってこい、という暗黙のメッセージなんでしょうか? これからの季節、夜な夜なキーボードに向かっていると体が冷えるので、ありががたく使わせていただきます。
2014年10月24日金曜日
ELCE 2014 & U-Boot Mini Summit in Düsseldorf
[昨年](/2013/10/elce-2013-u-boot-mini-summit-in.html)に引き続き、今年も [Embedded Linux Conference Europe](http://events.linuxfoundation.org/events/embedded-linux-conference-europe) と [U-Boot Mini Summit](http://www.denx.de/wiki/U-Boot/MiniSummitELCE2014) に行ってきました。 今年の開催地はドイツのデュッセルドルフでした。 最寄り駅。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvU2vUZ2dgEpz-wuYUUsTvIumWtBxsELBegJ4y75WZvcHSZzTirnBWhdycpE8coBahgIKOAn7QWILl7GxXzM5YwR0PzjEJdQcvl10kM0GG6URs7p9g7Icdqc1w9B5yuEtBmX88MEGnPYk/s1600/bahnhof.jpg) 会場までの道。のどかです。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUQH8TMoT8LSkCRlhMiuVHgahULjnx-gKpoS8dtJI12ruY8YBLQ5BnyBlt1XLzbmBGagEdcHgcL3co6xvnkkmcfdxjfpSqPI0FLQU4p9hgUWB0sCjzn3MwV3K07XUmXCaimjm2rKXL-8Q/s1600/strasse.jpg) 会場の Congress Centre Düsseldorf [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZQts4lTwctbF1jByHv61IZVZ87B_yfJLE9qBeXYFHwoxMX5s-7avzL4zSL2OUSrAhf93TH7ebQmPpKhgQA8PTlmgOyEQ_lzxA7NoV1GqQTxWqluXG-0GqXHuhp2ptgtqD-AHo9Wx3TOo/s1600/ccd.jpg) [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDtLsiM2sHt1SFff9dpk1v5BCLJZ3zGcRNubdaywjsXJrrNh2kQ-USOFtg3ZrmeD41vB_wKk3veNz8zkU3h2Voe6du3Q6C3qEi871JjeZGkf9PGejCAMu8Jy1A0UzBx1x8L1cgAExe5rQ/s1600/willkommen.jpg) メインのホール。もうすぐ始まります。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPKVf935Z5oz8ohCp0Ig1mSVs1tmbX9UHbkbzrNqLv8vF6qPK-snusFuaMCdpFTkuDA9ne_DXG3pA2QhQeen3MUJErtMSoWUsUZe6nlrI5l0NR3WbWpbeAWlntbFixASSHdLq4TgQaMjg/s1600/haupthalle.jpg) こちらは [U-Boot Mini Summit 2014](http://www.denx.de/wiki/U-Boot/MiniSummitELCE2014) の会場。14:30 からは自分のプレゼンです。ドキドキ。。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilphpMhijvWI1raCipv8tB-qRiKrUWPjPUUy1l3GR60uJvJcqv6vLRbxwYAQtyTE7_yRAKBTI9MGhh2NLpDsdxni9wROcq3ShU1ybPXyYGHWYNN3_Ik9KeZoe5MLmfMmLo6AbNYXwTzs8/s1600/uboot_summit2014.jpg) [ELCE2014](http://events.linuxfoundation.org/events/embedded-linux-conference-europe) の ARCHIVE ページにプレゼンしているところが載っていた。(なんだかビミョーな表情) [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0_rAhLrcAWGYxbXr97UfwmSbRe6YI8F_bjpN-OpWFNlIqnbKaa-GUwerqOZa5iqmLOO9VTYl6pv6r7bdZZ6czZOAt_qfaJAbthklSZ2lVlEkx5QLhBLTwXZDkfJXQydGoNE8AUmmxcUc/s1600/my_talk.jpg) プレゼンもなんとか無事に終えて、ホッ。 スライドは[こちら](http://www.denx.de/wiki/U-Boot/MiniSummitELCE2014)からダウンロード可能。 最後に集合写真。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoos58upKdKkAZoaaFFLL_TJH7W_K7ajNKR-h4_mVvQ_Uy7aogS9ZV1FT6cqifT1rMdcn2KnA6ob6cvv_qVvdPJgpfuN84mx0YirUey0MzEionCMmt8HMHACp4Pmhc9sW8o5qkUBfkFQw/s1600/U-Boot-Mini-Summit-2014.jpg) 夜は Füchschen というビアレストランで飲み会。「地球の歩き方」に載っていたので、結構有名なお店なんでしょうか。 [](http://3.bp.blogspot.com/-24yopBmKYuA/VEJ99dSgiLI/AAAAAAAAMTE/VqQMGbOw-zM/s1600/uboot_beer_summit2014.jpg) 3 日目のステージには Linus が登場。 [](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMpV0FxTfzMAhF0O2t21PpAnE8foXjLOxNLcx3NSCQSBuypENbIuoL0tWsQPOapKcVldQF59ATgSr9emaNxroRsAMzmuSJXgT9BC4XNd0RYyP5cDAfYa61QVODq9s364i2KxVIKch0xVI/s1600/linus_elce2014.jpg) 去年(左)は「XL サイズしか残ってません!」と言われてしまったが、今年(右)はちゃんと MサイズのTシャツがもらえました。 [](http://3.bp.blogspot.com/-5v0pDM_PuEE/VEKFiIfyqeI/AAAAAAAAMTw/SWAGetnc7sY/s1600/elce_shirts.jpg) U-Boot の発展に貢献したということで、 DENX から素敵な贈り物を頂きました。一応 USBメモリとしても使えます。 [](http://1.bp.blogspot.com/-wqV3CcFKuPM/VEWo94kbeQI/AAAAAAAAMUo/eZGI-hKrcYo/s1600/denx_usb_memory.jpg)
2014年7月15日火曜日
U-Boot と Linux Kernel のメインラインで Zynq を動かす 2014年7月版
本日 U-Boot 2014.07 がリリースされました。 [前回](/2014/05/u-boot-linux-kernel-zynq-201404.html)から U-Boot の方のやり方が少し変わったので、今回もまとめておきます。 具体的には、 v2014.04 で動かなくなっていた DTB を使った U-Boot のブートシーケンスが動くようになっていたり、 煩雑な工程のいくつかが不要になっています。 使用するのは、 - U-Boot 2014.07 - Linux Kernel 3.15 - Zynq ZC706 ボード とします。 ### STEP0: DTC (Device Tree Compiler) の準備 ##### Input Files Required - None ##### Output Files Produced - `dtc`: Device Tree Compiler ##### Task Description U-Boot を Device Tree 付きでビルドするには version 1.4 以降の DTC が必要になる。 ディストリビューションに標準で用意されている DTC では不足するかもしれないのでバージョンを確認。 $ dtc -v Version: DTC 1.3.0 バージョンが 1.4.0 よりも古い場合は、自分でビルドします。 $ git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git でソースを取ってきて $ make $ make install でビルドとインストールができる。 `$(HOME)/bin` の下に `dtc` が入るので PATH を通しておく。 ### STEP1: U-Boot のビルド ##### Input Files Required - `dtc` - ARM Cross Compiler - `ps7_init.c`: ISE / Vivado で "Export Hardware for SDK" を実行すると出力される - `ps7_init.h`: ISE / Vivado で "Export Hardware for SDK" を実行すると出力される ##### Output Files Produced - `u-boot-dtb.bin`: U-Boot の RAWバイナリと u-boot をコンフィグレーションする DTB を連結したもの - `u-boot-dtb.img`: `u-boot-dtb.bin` に uImage ヘッダーをつけたもの - `spl/u-boot-spl.bin`: U-Boot SPLの RAWバイナリ - `tools/mkimage`: U-Boot で扱うイメージを生成するツール。 ##### Task Description $ git clone git://git.denx.de/u-boot.git $ cd u-boot $ git checkout v2014.07 でソース取得して、v2014.07 タグをチェックアウト。 (何かあっても自分で対処できる人は masterブランチでやってもOK) あとで、Kernel を TFTP でダウンロードしたいので、`include/configs/zynq-common.h` を開いて、適当なところに #define CONFIG_IPADDR 192.168.11.2 #define CONFIG_SERVERIP 192.168.11.1 #define CONFIG_ETHADDR 00:0a:35:00:01:22 の3行を足す。 `CONFIG_IPADDR` は Zynqボードに割り振る IPアドレス、 `CONFIG_SERVERIP` は TFTP サーバーのアドレスに合わせて下さい。 MACアドレスは、(他のネットワーク機器と被らなければ)適当でいい。 TFTP サーバーがなくても、動かすことはできるので、ない人は上記はスキップして下さい。 さらに、 `ps7_init.c`, `ps7_init.h` を U-Boot の `board/xilinx/zynq` ディレクトリにコピーする。 このファイルが、 FSBL の代わりをするための、肝になるファイルです。 あとは $ make zynq_zc70x_config $ make CROSS_COMPILE=arm-linux-gnueabi- DEVICE_TREE=zynq-zc706 のようにして、コンフィグレーションとビルドをする。 もしくは $ make zynq_zc70x_config all CROSS_COMPILE=arm-linux-gnueabi- DEVICE_TREE=zynq-zc706 のように 1行で、コンフィグレーションとビルドを同時にすることもできる。 `ps7_init.c` と `ps7_init.h` が warning を出しますが、気にしなくてもOK。 気になる人は、関数のプロトタイプの引数部に `void` を足してください。 ### STEP2: Linux Kernel のビルド ##### Input Files Required - ARM Cross Compiler ##### Output Files Produced - `arch/arm/boot/zImage`: Kernel Image - `arch/arm/boot/dts/zynq-zc706.dtb`: Kernel をコンフィグレーションする DTB (Device Tree Blob) (従来、 U-Boot から Kernel を起動するときは `arch/arm/boot/uImage` を使っていたが、これは使わない。) ##### Task Description $ git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $ cd linux $ git checkout v3.15 でソース取得して、v3.15 タグをチェックアウト。 (何かあっても自分で対処できる人は masterブランチでやってもOK) 以下のようにして ARMv7 Multi な設定にする。 $ make ARCH=arm multi_v7_defconfig ここで $ make ARCH=arm menuconfig をして、少々設定をいじる。 Device Drivers ---> Block devices ---> [*] RAM block device support (16384) Default RAM disk size (kbytes) のようにたどり、 `RAM block device support` にチェックを入れ、 `Default RAM disk size` を `16384` に設定する。 もう一つ Device Drivers ---> Character devices ---> [ ] Legacy (BSD) PTY support のようにたどり、`Legacy (BSD) PTY support` のチェックを外す。 あとは $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- でビルド。 ### STEP3: Ramdisk のダウンロード ##### Input Files Required - None ##### Output Files Produced - `arm_ramdisk.image.gz`: Kernel がマウントする init ramdisk (を gzip 圧縮したもの) ##### Task Description [こちら](http://www.wiki.xilinx.com/Build+and+Modify+a+Rootfs) から arm_ramdisk.image.gz をダウンロードする。 ### STEP4: ITB (Image Tree Blob) の生成 ##### Input Files Required - `linux/arch/arm/boot/zImage` - `arm_ramdisk.image.gz` - `linux/arch/arm/boot/dts/zynq-zc706.dtb` - `u-boot/tools/mkimage` カレントディレクトリから見て、上記の配置になっているとする。 ##### Output Files Produced - `fit.itb`: U-Boot から Kernel を起動するためのイメージ ##### Task Description Kernel Image, Ramdisk, DTB (Device Tree Blob) を一つにまとめた ITB というのを作ります。 ITB を作るには、 ITS(Image Tree Source) を記述して、 `mkimage` に食わせます。 以下の内容を `fit.its` というファイルに記述する。 /dts-v1/; / { description = "Kernel, ramdisk and FDT blob"; #address-cells = <1>; images { kernel@1 { description = "Linux Kernel 3.15 configured with multi_v7_defconfig"; data = /incbin/("linux/arch/arm/boot/zImage"); type = "kernel"; arch = "arm"; os = "linux"; compression = "none"; load = <0x00008000>; entry = <0x00008000>; hash@1 { algo = "md5"; }; }; ramdisk@1 { description = "Ramdisk for Zynq"; data = /incbin/("arm_ramdisk.image.gz"); type = "ramdisk"; arch = "arm"; os = "linux"; compression = "gzip"; load = <0x00000000>; entry = <0x00000000>; hash@1 { algo = "sha1"; }; }; fdt@1 { description = "FDT for ZC706"; data = /incbin/("linux/arch/arm/boot/dts/zynq-zc706.dtb"); type = "flat_dt"; arch = "arm"; compression = "none"; hash@1 { algo = "crc32"; }; }; }; configurations { default = "config@1"; config@1 { description = "Zynq ZC706 Configuration"; kernel = "kernel@1"; ramdisk = "ramdisk@1"; fdt = "fdt@1"; }; }; }; あとは以下のようにすれば、`fit.itb` ができる。 $ u-boot/tools/mkimage -f fit.its fit.itb ### STEP5: JTAG (Slave Boot) から U-Boot と Linux を起動する ##### Input Files Required - `u-boot-dtb.bin`: STEP1 で作成したもの - `fit.itb`: STEP4 で作成したもの - `xmd`: ISE / Vivado のインストールディレクトリに入っている - `ps7_init.tcl`: ISE / Vivado から "Export Hardware for SDK" を実行すると出力される - `stub.tcl`: Xilinx のページからダウンロードできる `ug873-design-files.zip` の中に入っている - `fpga.bit`: ISE / Vivado で生成した FPGA bit file (Optional) ##### Task Description `fit.itb` を TFTP の公開ディレクトリに置く。(TFTP 環境のない人はスキップして下さい) Zynq ボードのブートモードの選択スイッチを JTAG に合わせて電源入れる。JTAG でボードと接続し、XMD を開く。 $ xmd XMD のプロンプトから以下を実行する。(FPGA は必要なければダウンロードしなくても良い) XMD% connect arm hw ;# Open JTAG connection XMD% rst -slcr ;# Reset the whole system XMD% fpga -f fpga.bit ;# Download FPGA bit file (Optional) XMD% source ps7_init.tcl XMD% ps7_init ;# Initialize DDR, IO pins, etc. XMD% ps7_post_config ;# Enable level shifter XMD% source stub.tcl ;# start CPU1 XMD% targets 64 ;# connect to CPU0 XMD% dow -data u-boot-dtb.bin 0x04000000 ;# Download u-boot to address 0x04000000 XMD% con 0x04000000 ;# start CPU0 from address 0x04000000 なお、毎回これを打ち込むのも面倒ですので、 `foo.tcl` に書いておきましょう。 XMD% source foo.tcl で XMD から読み込むか、シェルから $ xmd -tcl foo.tcl とすればよいです。 U-Boot のプロンプトが出た後、放っておくと、自動的に TFTPサーバーから `fit.itb` をダウンロードして、 Linux が起動する。 TFTP サーバーがない場合は、`con 0x04000000` の前に XMD% dow -data fit.itb 0x02000000 とすれば、 JTAG 経由で `fit.itb` をダウンロードできるので(時間かかりますが、、) あとは U-Boot のプロンプトから > bootm 2000000 と入力して Linux を起動させる。 ### STEP6: SDカード用のブートイメージを作成する ##### Input Files Required - `u-boot/spl/u-boot-spl.bin`: STEP1 で作成したもの ##### Output Files Produced - `boot.bin` ##### Task Description `bootgen` を使わずに `boot.bin` を作成する方法を紹介します。 u-boot-xlnx のコードを取ってきます。 git clone git://github.com/Xilinx/u-boot-xlnx.git `tools` ディレクトリの下に `zynq-boot-bin.py` という Python スクリプトが 入っているので、これを `~/bin` かどこか適当な PATH にコピーする。 あとは zynq-boot-bin.py -o boot.bin -u u-boot/spl/u-boot-spl.bin とすれば、 `boot.bin` ができます。 BIF ファイルを記述しなくてもいい分、こちらの方が簡単だと思います。 ### Step7: SDカードから U-Boot と Linux Kernel を起動する ##### Input Files Required - `boot.bin`: STEP6 または STEP6B で作成したもの - `u-boot-dtb.img`: STEP1 で作成したもの - `fit.itb`: STEP4 で作成したもの ##### Task Description FAT でフォーマットしたSDカードに `boot.bin`, `u-boot-dtb.img`, `fit.itb` をコピー。 SDカードを Zynq ボードに挿し、ブートモードの選択スイッチを SD カードに合わせて電源入れる。 ### 補足 U-Boot の起動時に以下の Warning メッセージが出ると思いますが、気にしなくていいです。 Warning: Your board does not use generic board. Please read doc/README.generic-board and take action. Boards not upgraded by the late 2014 may break or be removed. これは開発者向けの情報です。次回のリリースでは修正されているはず。 消したい人は `include/configs/zynq-common.h` に #define CONFIG_SYS_GENERIC_BOARD を足す。
新しい投稿
前の投稿
ホーム
登録:
投稿 (Atom)