U-Bootを作る
U-Bootのソースを取得する
まず、U-Bootのソースコード一式をXILINXのgithubから取得します。
そのためには、Linux上で
git clone git://github.com/Xilinx/u-boot-xlnx.git
と打ちます。XILINX版U-Bootのソースコード一式がu-boot-xlnxディレクトリにダウンロードされます。約2分くらいでできると思います。
このU-Bootは、UART、EMAC、パラレルFlashROM、EMAC Lite、TEMACなどがサポートされています。残念ながらMMCカード(SDカード)はサポートされていないようです。
U-Bootを作るまえに、U-Boot BSPを作る
XILINX Wikiから、uboot_bsp.tar.gz(10KB)をダウンロードします。
このファイルを展開すると、uboot_bsp\bsp\uboot_v4_00_c\dataというディレクトリに
- uboot_v2_1_0.mld
- uboot_v2_1_0.tcl
という2つのファイルができます。
U-Boot BSPのインストール
このファイルをSDKにインストールします。
U-Boot BSPをインストールするためには、uboot_v4_00_cというフォルダを、C:\xilinx.5\ISE_DS\EDK\sw\lib\bsp\にフォルダごとコピーします。
C:\xilinx.5\ISE_DS\EDK\sw\lib\bsp\uboot_v4_00_c\data\というフォルダに上記の2つのファイルが入ればインストールは完了です。
uboot_v2_1_0.tclの修正
実は、このuboot_v2_1_0.tclにはバグがあるので、そのままではU-Bootのmakeの際に止まってしまいます。uboot_v2_1_0.tclをテキストエディタで開き、673行目と713行目に2か所ある
global flash_memory_bank puts $config_file "#define XILINX_SPI_FLASH_CS\t$flash_memory_bank"
となっている行をコメントアウトし、下記の1行を追加します。
#global flash_memory_bank
#puts $config_file "#define XILINX_SPI_FLASH_CS\t$flash_memory_bank"
puts $config_file "#define XILINX_SPI_FLASH_CS\t0"
こうしないと、U-boot BSPの生成や、Makeで止まってしまいます。
U-Boot BSPの作成
XILINX SDK(Eclipse)のメインメニューで、File→New→Board Support Packageとします。ubootが追加されているのがわかります。Finishを押します。
すると、次のような設定画面が開きます。
このダイアログでは、U-Bootが使うUARTのポートやメモリなどを設定します。とりあえず、stdoutとstdinをRS232Cに設定し、main_memoryをddr3_sdram_*に設定します。
また、ethernetとtimerも設定します。
FlashMemoryは、axi_spi_0に設定します。途中で'flash_memory_bank'というエラーが出て止まってしまう場合は、上で書いたuboot_v2_1_0.tclの修正を行ってください。
OKを押すとビルドが始まります。ビルドが成功すると(ワークスペース)\uboot_bsp_0\microblaze_0\libsrc\uboot_v4_00_c のディレクトリにconfig.mkとxparameters.hという2つのファイルが出来上がっています。
これらのファイルにMicroBlazeのペリフェラルのアドレスや、ボードで使用するペリフェラルの設定が書かれています。この2つのファイルを、本章の最初でgitからダウンロードしてきたu-boot-xlnxフォルダの中の、/board/xilinx/microblaze-generic/フォルダにコピーします。
CONFIG_SYS_FLASH_BASEの設定
gitから取得したU-Bootをビルドするためには、CONFIG_SYS_FLASH_BASEというマクロが設定されている必要があります。
CONFIG_SYS_FLASH_BASEというのは、Linuxのイメージ等が書かれているNOR Flashのアドレスなのですが、特電Artix-7ボードではNOR Flashは使っていないので、この値は使いません。
デフォルトではCONFIG_SYS_FLASH_BASEが設定されていないので、このままではmakeをしたときにエラーで止まってしまいます。
そこで、先のxparameters.hの末尾に、ダミーのアドレスを書いておきます。
#define CONFIG_SYS_FLASH_BASE (0xA0000000)
これでビルドが通るようになります。
U-Bootのカスタマイズ
MicroBlaze用U-BootはSDカードが使えません。したがって、デバッグ用などでLinuxを動作させるには、ネットワークブートを行うのが一番です。TFTPサーバ上にLinuxのカーネルイメージ等を置いておいて、ネットワーク経由でブートイメージを取ってくるというものです。この動作を自動的に行わせるために、U-Bootの設定をいくつか書き換える必要があります。
まず、上記のフォルダ、u-boot-xlnx\include\configs\microblaze-generic.hを開きます。
コンフィグすべき個所は、293行目付近にあります。その箇所を赤で示します。
#define CONFIG_BOOTCOMMAND "tftpboot 0xb8000000 linux.bin.ub;tftpboot 0xb4000000 uramdisk.image.gz;tftpboot 0xb2000000 xil_intc.dtb;fdt addr b2000000 00100000;fdt resize;bootm b8000000 b4000000 b2000000" /* architecture dependent code */ #define CONFIG_SYS_USR_EXCEP /* user exception */ #define CONFIG_SYS_HZ 1000 #define CONFIG_ENV_OVERWRITE /* Allow to overwrite the u-boot environment variables */ #define CONFIG_IPADDR 192.168.1.99 #define CONFIG_SERVERIP 192.168.1.7 #define CONFIG_ETHADDR 02:00:00:00:10:64 #define CONFIG_BOOTP_SERVERIP
- CONFIG_BOOTCOMMAND … U-Bootが自動的に実行するコマンドです。詳しいことは後述します。
- CONFIG_IPADDR … 自身のIPアドレス。
- CONFIG_SERVERIP … LinuxイメージをロードしてくるTFTPサーバのIPアドレス。
- CONFIG_ETHADDR … 自身のMACアドレスです。
U-Bootのビルド
以上の手順でu-boot-xlnx\include\configs\フォルダにconfig.mkとxparameters.hをコピーして、microblaze-generic.hを書き換えたら
cd u-boot-xlnx export BUILD_DIR=$PWD/build make microblaze-generic_config make
と打ちます。
これでビルドが行われ、U-Bootが生成されます。
できあがったファイルは、u-boot-xlnx\buildにu-boot.srecというファイル名で格納されています。
このu-boot.srecをu-boot.txtにリネームしてください。
次のSPI ROMへの書き込みのステップで、拡張子がsrecのままだとうまく書き込めません。
※SRECのままだと、HEXファイル中に書かれたアドレスを解釈してSPI ROMの当該番地に書き込もうとしてしまう。
これで完成です。
まとめ
- SDKにU-Boot BSPをインストールするには、C:\xilinx.5\ISE_DS\EDK\sw\lib\
bsp\uboot_v4_00_c\data\にuboot_v4_00_cフォルダをコピーする。 - uboot_v2_1_0.tclを修正する
- U-Boot BSPをSDKでビルドすると、(ワークスペース)\uboot_bsp_0\microblaze_0\libsrc\uboot_v4_00_c のディレクトリにconfig.mkとxparameters.hという2つのファイルが出来上がるので、これをu-boot-xlnx/board/xilinx/microblaze-generic/フォルダにコピーする。
- xparameters.hの末尾にダミーのCONFIG_SYS_FLASH_BASEを追加する
- microblaze-generic.hをカスタマイズし、CONFIG_BOOTCOMMANDと、CONFIG_IPADDRなどを設定する
- 以下のコマンドでビルドする
cd u-boot-xlnx export BUILD_DIR=$PWD/build make microblaze-generic_config make
- 目的のファイルは、u-boot-xlnx\build\u-boot.srecに出来上がっている
- u-boot.srecをu-boot.txtにリネームする
修正済みのconfig.mkと、xparameters.h、および出来上がったu-boot.srecは下記のリンクからダウンロードできます。
http://www.tokudenkairo.co.jp/art7/uboot-config.zip