落書き以上、技術メモ以下

気になったことをまとめておきます。

Raspberry Pi Compute ModuleでeMMCの書き換えを実現する回路

RPiのCompute Moduleを使用したボードを作成するのにeMMCの書き換え部分がよくわからなかったのでメモしておく。

前置き

RPiのCompute Moduleには4GBのeMMCが載っている。

しかし、これはRPiのSoCであるBCM2835のSD/eMMCのインターフェースに直接つながっているため、外部から直接このeMMCにアクセスすることはできない。

このeMMCの書き換えについて理解するために、BCM2835のブートシーケンスをまず理解する。

RPiのブートシーケンス

パワーオン時もしくはRUNピンがLowから解放されたときBCM2835はeMMCにアクセスを試みる。

そしてシステムをブートさせるためにbootcode.binというファイルをプライマリパーティション(FAT)から探す。

eMMCへのアクセスができなかった場合、もしくは bootcode.binが見つからなかった場合BCM2835はUSBからブートコードを書かれるのを待つ状態になる。

そのUSBからブートするツールは以下で公開されている。

tools/usbboot at master · raspberrypi/tools · GitHub

Compute ModuleのEMMC_DISABLE_Nピン

EMMC_DISABLE_NピンはBCM2835からeMMCへアクセスすることを禁止するためのピンである。

このピンがGNDに接続している場合、BCM2835はハードウェア的にeMMCにアクセスすることを禁じられる。

つまりブート時にこのピンがGNDに接続されていると、BCM2835がeMMCへのアクセスに失敗しUSBからのブートコード書き込みを待つ状態になるということである。

USBからの書き込み待ち状態になるまでは数秒かかる。

eMMC書き換えの実現

EMMC_DISABLE_NピンをGNDに接続すればUSBからのブートは可能になる。

しかし、USBからブートした後eMMCをストレージとして認識するにはEMMC_DISABLE_NピンをGNDから再び解放しなければならない(GNDのままだとハードウェア的にアクセスができないようになっているから)。

CMIOボードではこれをGPIO47_1V8ピンとMOSFETを利用して、USBからのブート後EMMC_DISABLE_NピンをGNDから解放している。

GPIO47_1V8ピンはブート時1.8Vでプルアップされた入力として動作するが、USBからブートされた後はLowにされる。

つまり、GPIO47_1V8ピンはブート時にHighでUSBからのブート後Lowとなる。

このGPIO47_1V8をMOSFETのゲートとして使用し、EMMC_DISABLE_Nをブート時はLowにUSBブート後は解放するようにしている。

こうすることで、USBからブートした後でeMMCをストレージとして認識できるようにしている。

ついでにCMIOボードではGPIO47_CTL_1V8というピンが用意されていて、通常のeMMCブートの他、セーフモードでのブートなどが選択できる(らしい)。

Compute Moduleを使用したオリジナルのボードでeMMCを書き換えたい場合は上記のような回路で作成する必要がある。

(もちろん書き換えはCMIOでオリジナルボードでは書き換えを行わないという方法もある)

参考

Raspberry Pi Documentation

2015.02.18 追記

USBポート

USBにはホストとスレーブが存在し、一般的にはPCなどがホストとなりUSB機器がスレーブとして動作する。

eMMC書き換え時にはRPiに対してスレーブモードのUSBポートでアクセスしなければならない。

CMIOではホスト用ポート、スレーブ用ポートの2つのポートを用意しており、USBブートの際はスレーブ用ポートを利用してブートするようにしている。(用意しているといってもホスト用、スレーブ用をマルチプレクサで選択するようになっているだけ。スレーブ用のポートが優先して使われるようになっている)

オリジナルのボードを開発する場合にUSBからブートするようにしたい場合は同様にスレーブ用のポートを用意してやる必要がある。

しかし、Ethernetのポートも用意したいと考えた場合、LAN9512のようなUSB-Ethernet接続のICを接続することになる。

BCM2835にはUSBの口が1つしか出ていないため、LAN9512を使用しながらスレーブ用のポートも用意したいと考えた場合は何らかの仕掛けが必要となる。

(例えばCMIOと同様にマルチプレクサで2つのポートに分割し,ホスト用の口の方にLAN9512のアップストリームのポートをつなぎ合わせるなど)