FC2カウンター FPGAの部屋 Spartan3E Starter Kit でマイコンを作る

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

soc-lm32その後12

前回の流れでLatticeMico32のdriversフォルダの下のライブラリを使ってu-bootをブートしようとしたが、フォルダの中に入っていないインクルードファイルがあって、どうもコンパイルできない。多分、システムのジェネレータなどでファイルを生成するのではないだろうか?これ以上はLatticeのツールをインストールする必要があるようだし、とりあえずペンディングにしようかと思う。
今月のDWMでも山際氏がLatticeのデモボード上でMico32を複数使ったマルチコアシステムの記事を書いているし、デモボードを買って試してみても良いかな?とも思ったが、とりあえずはハードを作るほうに戻ろうかと思う。
載せやすいフリーOSがあったら教えてください。なにか、そういうのを載せたいのだが。。。
soc-lm32に自作のDDR SDRAMコントローラを載せた物をほしい方がいるでしょうか?そういう方がいらっしゃれば、やり方及び差分を公開しようかと思います。
  1. 2008年11月18日 20:57 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のその後11(u-bootのコンフィギュレーションの書き換え3)

今日はですます調で書きます。
最初に、”soc-lm32のその後10(u-bootのコンフィギュレーションの書き換え2)”のDDR SDRAMのアドレスは間違っていました。DDR SDRAMの容量は64Mbytes なので、16進のサイズにすると0x04000000です。よって、0x0b000000~はありえず、0x08000000~0x0bffffff になります。
あと、FATAL_ERRORともなったUARTのボーレートの設定ですが、前のままではボーレートが合いませんでした。よくよく見ると、intface.v の414行目の`define old_baud_generator のコメントアウトをはずすと、整数演算になって、ボーレートも合いました。
その次は、bootloaderの修正です。
LatticeMico32 の周辺UARTとTIMERをプロジェクトに入れたので、spike_hw.h のUARTの部分を以下のように修正しました。

/*************************************************************************** * UART0 */
#define UART_LSR_THRE    0x20    // THR Empty (送信バッファempty)(Line Status Register)
#define UART_LSR_DR        0x01    // Receiver data-ready(Line Status Register)
#define UART_LSR_FE        0x08    // Freming Error(Line Status Register)
#define UART_LSR_PE        0x04    // Parity Error(Line Status Register)
#define UART_LSR_OE        0x02    // OverRun Error(Line Status Register)

#define UART_LCR_WLS1_dl5    0x0        // WLS1 = 5bit(Data Length) (Line Controll Register)
#define UART_LCR_WLS1_dl6    0x1        // WLS1 = 6bit(Data Length) (Line Controll Register)
#define UART_LCR_WLS1_dl7    0x2        // WLS1 = 7bit(Data Length) (Line Controll Register)
#define UART_LCR_WLS1_dl8    0x3        // WLS1 = 8bit(Data Length) (Line Controll Register)
#define UART_LCR_STB_1        0x0        // STop Bit is 1bit.(Line Controll Register)
#define UART_LCR_STB_2        0x4        // STop Bit is 1.5 or 2 bits.(Line Controll Register)
#define UART_LCR_PEN_DIS    0x0        // Parity Disable (Line Controll Register)
#define UART_LCR_PEN_ENA    0x8        // Parity Enable (Line Controll Register)
#define UART_LCR_EPS_ODD    0x0        // Parity ODD (Line Controll Register)
#define UART_LCR_EPS_EVEN    0x10    // Parity Even (Line Controll Register)
#define UART_LCR_SP_DIS        0x0        // Stick Parity Disable (Line Controll Register)
#define UART_LCR_SP_ENA        0x20    // Stick Parity Disable (Line Controll Register)
#define UART_LCD_SB_DIS        0x0        // Send Break Disable
#define UART_LCD_SB_AS        0x40     // Assert Break

#define UART_

typedef struct {
   volatile uint32_t rxtx_data;
   volatile uint32_t interrupt_ena;
   volatile uint32_t interrupt_id;
   volatile uint32_t line_ctrl;
   volatile uint32_t modem_ctrl;
   volatile uint32_t line_status;
   volatile uint32_t modem_status;
   volatile uint32_t baud_rate_div;
} uart_t;


当然、SRAM_STARTも0x08000000 に修正しました。

spike_hw.c のuart_init, uart_getchar, uart_putchar を修正しました。

void uart_init()
{
    uart0->line_ctrl = UART_LCR_WLS1_dl8 | UART_LCR_STB_1 | UART_LCR_PEN_DIS | UART_LCR_EPS_ODD | UART_LCR_SP_DIS | UART_LCD_SB_DIS;
}

char uart_getchar()
{   
    while (! (uart0->line_status & UART_LSR_DR)) ;
    return uart0->rxtx_data;
}

void uart_putchar(char c)
{
    while (!(uart0->line_status & UART_LSR_THRE)) ;
    uart0->rxtx_data = c;
}


これで例によって、cygwin でコンパイルしてから、ISEでコンパイル、インプリメントしました。
Teratermを起動して、やってみました。最初はミスっていて、ボーレートがあっていませんでしたが、(最初に書いた原因です old_baud_generator )うまくプロンプトが出るようになりました。
これでu-bootをロードすることが出来ようになったと思いました。
ですが、m コマンドでDDR SDRAMテストもv コマンドでそのデータを見ても大丈夫なのですが、u コマンドでファイルからダウンロードしたときがおかしくなっています。
どうおかしいか確かめるために、8ワードだけのデータを作ってu コマンドで8ワードだけアップロードしてみました。
そうすると、最初の2ワードだけロードできているようなのですが、ほかは書き換わっていないようです。
U-boot_build_8_081115.png

エラーでも出ているんでしょうか?ちなみにボーレートを115200bps から半分にしても同様でした。
今日は飽きてきたので、この辺で終わりにします。
今度はLatticeMico32のdriversフォルダの下のライブラリを使って、動かしてみることにします。それで動かなければ、soc-lm32 のUARTを使うことにして、u-bootのUARTドライバの方を書き換えることにします。
  1. 2008年11月15日 19:34 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のその後10(u-bootのコンフィギュレーションの書き換え2)

”soc-lm32のその後10(u-bootのコンフィギュレーションの書き換え1)”で、soc-lm32 でのu-boot 起動の可能性を探った。今度はhwsetup_pregenerated.h のアドレスマップと思われるものを書き換えて、soc-lm32 で動作するかどうかを調べてみようとした。主なところを下のように書き換えた。
U-boot_build_5_081111.png

ここで、”soc-lm32のその後10(u-bootのコンフィギュレーションの書き換え1)”でMSBconponents.cfg にはタイマーは3つ入っているが、とりあえず1つに減らした。この理由は、soc-lm32のtimer が1つしかなかったためだ。でも、書き直してからよく検証してみるとsoc-lm32のtimerは1つのモジュールに2つ入っていたのだった。失敗したが、とりあえず1つとした。
これでmake u_boot すると、どうも、.text は0x0bfdc000 に割り当てられるようだ。これをどこで変えるかが良くわからないので修正できない。リンカ・スクリプトファイルで指定するのはわかっているが、どこかが動的に作るようで、まだ良くわからない。
U-boot_build_6_081111.png

上のhwsetup_pregenerated.h でDDR SDRAMを0x0b000000 からにマップして、とりあえず出来たu-boot.bin をbootloader からロードしてgo してみようという計画だ。

次に、soc-lm32 のプロジェクトをLatticeMico32 の周辺モジュール、timer と uart_core を使用するように変更した。トップのsystem.v を修正して、timer と uart_core をラップして接続した。DDR SDRAMのアドレスを0x0b000000~に変更した。
これで論理合成したら、”FATAL_ERROR:Xst:Portability/export/Port_Main.h:143:1.17”で止まってしまった。
U-boot_build_7_081111.png

これは”XSTでのFATAL_ERROR:Xst:Portability/export/Port_Main.h:143:1.17”で詳しく解説する。ともかくuart_core.v の下のintface.v を修正したら論理合成が出来るようになった。これでうまくインプリメントすることが出来たので、bootloader 経由でu-boot.bin を転送して起動してみようと思う。
  1. 2008年11月12日 05:51 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のその後10(u-bootのコンフィギュレーションの書き換え1)

さてさて、今回ビルドしたu-boot をそのまま動かそうとすると、LatticeからダウンロードしたMico32のUARTやTimerをsoc-lm32 のUARTやTimerコンポーネントと入れ替える必要がある。(ちなみに、LatticeからダウンロードしたMico32の中のUARTやTimerなどのコンポーネントはsoc-lm32 で使っているUARTやTimerなどと違っている)
ディフォルトのメモリマップは、、”Linux Port to LatticeMico32 System Reference Guide”の20ページを見ると以下のようになっているようだ。(Linux Port to LatticeMico32 System Reference Guideの20ページから転載)

U-Boot 1.2.0 (Oct 15 2007 - 12:00:00) [Theobroma Systems]
LatticeMico32 board configuration:
Device     | Base Address | Additional information
-----------+--------------+---------------------------------
CPU 0      |              | Frequency: 75000000 Hz
Flash 0    | 0x04000000   | Size: 33554432 (32 MB)
DDR SDRAM 0 | 0x08000000  | Size: 67108864 (64 MB)
Timer 0    | 0x80002000   |
Timer 1    | 0x80010000   |
Timer 2    | 0x80012000   |
UART 0     | 0x80000000   | Baud Rate: 115200
LEDs 0     | 0x80004000   |
7Segment 0 | 0x80006000   |
TriSpeedMAC 0 | 0x80008000 |
LM32 configuration options:
Hardware multiplier: enabled
Hardware divider: enabled
Hardware barrel-shifer: enabled
Sign-extension instructions: disabled
Cycle counter CSR: disabled
Instruction cache: enabled
Data cache: enabled
lm32mac version 0x10000 @
0x80008000lm32MAC#0
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
lm32#


これにしたがって、自分のsoc-lm32 のアドレスマップを変更する必要がある。
system.v の115行目あたりで下のようにアドレスマップをしているので、これを変更する。

//---------------------------------------------------------------------------
// Wishbone Interconnect
//---------------------------------------------------------------------------
wb_conbus_top #(
    .s0_addr_w ( 3 ),
    .s0_addr   ( 3'h4 ),        // ddr0
    .s1_addr_w ( 3 ),
    .s1_addr   ( 3'h5 ),        // flash0
    .s27_addr_w( 15 ),
    .s2_addr   ( 15'h0000 ),    // bram0 
    .s3_addr   ( 15'h7000 ),    // uart0
    .s4_addr   ( 15'h7001 ),    // timer0
    .s5_addr   ( 15'h7002 ),    // gpio0
    .s6_addr   ( 15'h7003 ),
    .s7_addr   ( 15'h7004 )


wb_conbus_top.v がWishBone の MasterデバイスとSlaveデバイスを接続するデバイスのようだ。このwb_conbus_top.v は一番上の31ビット目は無視するようだ。
でも、ここで問題が出てきた。前述したすでにビルドされたu-boot のアドレスマップを見ると、UART0が0x80000000 番地にアドレスマップされているが、これの最上位ビットを無視すると、0x00000000 番地にミラーが出てしまう。よって、BRAMと重なってしまうので、このままではだめだ。u-boot のアドレスマップを変える必要がありそうだ。
”soc-lm32のその後9(u-boot)”で検証したように、/lm32linux-20080206/u-boot/board/lattice/ecp250full の中を見ると、7つのファイルがある。
U-boot_build_2_081107.png

このうちのMSBconponents.cfg に搭載するデバイスの構成が書いてるんだと推測している。
U-boot_build_1_081107.png

TRIMODEMACは、MACはボード上にはあるがTRIMODEではないし、後でMACは後でドライバを書く必要があるだろうから、とりあえずコメントアウトする。7SEG-LEDもボード上にないのでこれもコメントアウト。GPIOを追加する。
U-boot_build_3_081107.png

問題はFLASHがLatticeMico32のドライバで使えるかどうかだけども、スパルタン3E スタータキットのパラレルFLASHはTE28F128J3D-75で、LatticeのボードのパラレルFLASHは MX29LV128MBTI-90Q違いは追々検証していくことにして、このままにしておくことにする。とりあえずFLASHは使わない事とする。

次に、アドレスマップが書いてあるのはhwsetup_pregenerated.h のようだ。
U-boot_build_4_081107.png

このアドレスマップを書き換えることにする。

(注)今やっていることは、当て推量に基づいて、いい加減にやっています。まったくこうなるという保障はありません。そうなりそうだけど、やってみようという思いでやっていますので、間違っている可能性が大いにあります。間違っていそうだったら、ご指摘いただけると本当にありがたいです。
  1. 2008年11月08日 05:59 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:0

soc-lm32のその後9(u-boot)

uClinuxは、今のままのモニタプログラムでシリアル経由でダウンロードして、実行しようと思っていたのですが、やはりu-bootを移植したほうが何かと便利なようです。やっと全体が見え始めてきました。
このところUbuntu や Fedora 9 と格闘していまして、どちらも一長一短です。(Ubuntuの方が良いようです)
例えばUbuntu は日本語もスムーズに使えてとてもよいのですが、uClinuxをビルドできませんでした。アップデートも自然にかかるし、とても良いディストリビューションだと思いました。ですが、uClinuxをビルドできないのでは仕方がありません。
Fedora 9 は最初日本語も使えませんでした。”Fedora 9で日本語を入力するには”を見て、やっと日本語が入力できるようになりました。あとは、依存関係が解決できなくてアップデートできません。いろいろ、本当に何日もつぶしてやってみましたが、だめでした。おかげで VMware tools もインストールできません。ですが、とりあえず、唯一、uClinux がビルドできているのでこれを使うことにしました。

Ubuntu や Fedora 9 をいじりながら、買った本を読んでいる。”はじめる組込みLinux H8マイコン×uClinuxで学べるマイコン開発の面白さ”は本当に良い本で、H8の解説から書いてある。マイコンでlinuxを動かしたいという方には最高の1冊といえると思う。これが終わったらH8のボードを買ってuClinux 動かしてみても良いかな?と思った。
”組み込みLINUXシステム構築”は組み込みLINUXの基本的なことが書いてある解説書で特にu-boot の項を参考にした。
いろいろ本を読んだり、ネットで調べたりしながらu-bootのことを学んで、Fedora 9 でビルドできたlm32linux-20080206/u-boot ディレクトリを見ていると、その下のcpu ディレクトリにlm32 ディレクトリがあって、その下にserial.c やleds.c などがあった。まだMakefileを解析していないが、ハードを書き換えないとしたら、この辺を書き換えれば良いのかも?
u-boot_1_081103.png

ボードの構成はu-boot/board/lattice の下に、ecp250, ecp250full, ecp250mini, ecp250nolinux ディレクトリがある。
u-boot_2_081104.png

これは、”Linux Port to LatticeMico32 System Reference Guide”の11ページのBuild System Make Targets のTable 1 のTargetに対応しているのでは?と思った。
u-boot_3_081104.png

とりあえずは、このTarget を修正して適当なTarget のMSBcomponents.cfg ファイルを作り、soc-lm32 のIOをLattice Mic32 のIOに変更してu-bootが動くかどうかを試してみようと思う。


2008/11/05 追加: KEIさんのご指摘によりUbuntuでもう一度、uClinuxをビルドしてみたらビルドすることができました。やはり、これからはUbuntuでやろうと思います。
Ubuntu_uClinux_build_1_081105.png

KEIさん、ご指摘ありがとうございました。また何かありましたら、ぜひ教えてください。よろしくお願いします。
  1. 2008年11月04日 05:09 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:3

soc-lm32のその後8(いろいろなlinuxをインストールしてみる)

どうもFedora 9にVMware toolsがインストールできない。
”VMware ESXiにFedora 9をインストールする(5) ~VMware toolsを導入する””Fedora 9にVMware Toolsをインストールするには”
を見てVMware tools をインストールしてみようとした。しかし、yum コマンドで、kernel-devel をインストールすると、新しいkernel ソースをインストールしてしまい、VMware tools にinclude ファイルのバージョンが違うといわれてしまう。それでは、kernel本体をリプレースしようとしても、依存性チェックでインストールできないといわれてしまう。
なんとか、kernel-2.6.25-14.fc9.src.rpm を見つけてきたが、うまくインストールできていないようだし。。。
手詰まりになってきたので、もう1つVirtual Machine を作って、違うlinux でやってみようと思う。まずは有名なUbuntu から試してみよう。Debian GNUの方がいいでしょうか?

FPGAからは外れてしまうが、VMware Server でいろいろなlinux を試してみるのも楽しいような。。。Windowsを走らせながら、試せるのがお手軽でとても良い。。。
  1. 2008年10月31日 05:52 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:2

soc-lm32のその後7(VMware Server 2.0 のインストール)

DDR SDRAMでプログラムが実行できるようになったので、VMware Server 2.0 をインストールして、Guest OS として Fedora 9 をインストールした。その辺のやり方はバージョンは違うが、”仮想サーバの構築(VMware Server: WindowsXP編)”を見て行った。
VMware_Fedora_install_3_081026.png
上のサイトとは違って、VMware Server 2.0 では、設定はWebブラウザ上から行うようになったようだ。
VMware_Fedora_install_4_081028.png
これでLinuxの環境ができたので、"Building the Linux Port to LatticeMico32 System User Guide Lattice Semiconductor"を見ながらuClinuxをビルドしてみたら、すんなりビルドすることができた。Cygwinではビルドできなかったが、すんなりビルドしてくれたようだ。さすがlinux。。。
VMware_Fedora_install_5_081028.png
上のスナップショットで、imagesディレクトリにvmlinux.img などができているのが見える。
しかし、できたのは良いが、このファイルをWindows に移す方法が今のところわからない。USBメモリをマウントして取り出そうとしたのだが、USBをAuto connect enabled にしているのにConnectしようとするとConnectの設定部分がハイドされていて選択できない。
共有フォルダなどを作ってくれるVMware toolsをインストールしようとして、VMware Serverのマニュアルを見ながらインストールしてみたのだが、どうも、カーネルのCのヘッダファイルのディレクトリがデフォルトは違うようでインストールできない。Fedora9のカーネルのCのヘッダファイルのディレクトリはどこだろう?
VMware_Fedora_install_6_081028.png
いろいろやってだめだったら、Sambaをインストール、起動して共有しようとおもう。

さらに、このビルドできたuClinux はLatticeのボードのMico32用のドライバが付いているはずなので、今のsoc-lm32 の周辺IOとはVerilogソースが違っている。同じ機能を実装しているのかもしれないけど。。。なので、soc-lm32 のtimer や uart のソースやメモリマップをLatticeのボードのMico32にあわせるか?もしくは、uClinuxのドライバを書き換えないと動作しないはず。。。どっちにしようかな?

どうも全体的なuClinuxのブートの様子が良くわからないので、”はじめる組込みLinux H8マイコン×uClinuxで学べるマイコン開発の面白さ”という本も買ってみることにしました。
  1. 2008年10月29日 05:14 |
  2. Spartan3E Starter Kit でマイコンを作る
  3. | トラックバック:0
  4. | コメント:2
»