2010年10月21日
シリアルコンソールをUART0からUART1に変更する(U-boot編)
KZM-A9-DualボードにU-bootとLinuxカーネルを移植しています。
このような場合、同じようなチップを使うもののソースコードを持ってきて改変していくことが多いと思います。今回もチップの供給元から見本となるソースコードをもらって、そこから修正しています。
見本のボードはシリアルコンソールにUART0を使っていましたが、KZM-A9-DualボードではUART1がつながっています。これに関する修正でU-bootに関する部分のことを書きます。
シリアルインタフェースの制御には大昔から8250が有名で、バッファを強化した16550というのもあります。最近のアプリケーションプロセッサでは16550相当のコントローラを何チャネルか内蔵していることが多いです。
U-bootやLinuxカーネルでも8250とその子孫のチップのためのデバイスドライバは用意されているので、自分でゼロから作る必要はありません。
変更しなければならないことは、そのシリアルコントローラのレジスタがマッピングされているベースアドレスとボーレイトのクロックに与えるパラメータくらいのものです。
昔のように実際に8250や16550のチップが基盤の上に載っているならば、使用するチャネルを変更するのはシリアルコントローラのレジスタのベースアドレスの変更だけで済んでしまいます。
今回、私もそれくらいの気持ちでいたのですが、EMMA Mobile EV2のような多機能のアプリケーションプロセッサでは、もっと多くのことを変更する必要がありました。
UART1のピンを選択する
最近のアプリケーションプロセッサは多機能で、全ての機能を同時に使おうとするとピンの数が膨大になってしまいます。そのため複数の機能を同じピンに割り当てている場合があります。UART0は専用のピンがあるのでよいのですが、UART1はGPIOとピンが兼用になっていて、しかもデフォルトではGPIOになっています。そのため明示的にピンの選択を行わなければなりませんでした。
UART1にクロックを供給する
UART0とUART1ではクロックを別々に指定するようになっていました。
UART1を含む機能ブロックのリセットを解除する
おそらく無駄な電力消費をおさえるためだと思うのですが、このアプリケーションプロセッサでは細かい機能ブロック単位にリセットすることができるようになっています。デフォルトではリセットされたままなので、明示的にリセットを解除する必要があります。UART0とUART1は別々にリセットを解除する必要がありました。
16550のレジスタを設定する
ここまで来て、ようやく16550の設定です。でもこれ自体はinclude/configsのヘッダファイルに書くだけです。
EMMA Mobile EV2のチップの仕様書はまだ一般にダウンロードできるようになっていないので、具体的な設定を書くところまではしませんが、おそらく最近のアプリケーションプロセッサはだいたい似たような構成になっているのではないかと思います。
次回はLinuxカーネルでコンソールをUART0からUART1に変更するための修正点を紹介します。