2010年6月30日水曜日

mbed NXP LPC1768 base board (beta)

私の手元にもmbedベースボードβ版が到着しました。
logic_starさんありがとうございます。


昨日対応したC328-7640(JPEGシリアルカメラ)を使ったアプリケーションなどを公開する予定です。
お楽しみに。

C328-7640 Camera Module Driver

SparkFunでお馴染みのJPEGシリアルカメラのmbed NXP LPC1768用ドライバを設計実装しました。
サンプルプログラムではmbedローカルファイルシステムにJPEGファイルを書き込むようにしてあります。


http://mbed.org/users/shintamainjp/programs/CameraC328

2010年6月28日月曜日

mbedで困ることありませんか?

mbedはプロトタイピングツールとして素晴らしいのですが、繋ぎたくなるものがほぼ決まっているようなポートなどを見ると、わざわざ配線するのも嫌になってきます。


そんなときに嬉しいのがmbed評価ベースボードです。(現在ベータ評価段階。)
@logic_starさんが設計したもので、それこそ「かゆい所に手が届く」仕様になっています。


ボードにはLCD, microSDカード, USB, LAN(RJ-45)を搭載。


ベースボードにはユニバーサル基板エリアもあります。
基本機能はmbed評価ベースボードでカバーしながら、独自機能をユニバーサル基板エリアに実装するといった使用形態が可能。


裏面は上記のようになっています。
おっと。
バッテリホルダもありますね。
バックアップできそうですね、あれが。

眠っているmbedありませんか?
そんなときはこのmbed評価ベースボードの出番です。


私はベータテストに参加します。
このブログでもベータ版の基板を取り上げて様々なレポートをしたいと考えています。

2010年6月25日金曜日

EDKの評価ライセンスが切れました・・・。


FreeRTOSのサンプルコード(EDK 7.1版)のEDK 12.1へのポーティング作業が終了し、これからデバッグというところでBRAMのサイズ制約にひっかかり、あえなくライセンス切れ。
動かしてみたいのですがこればかりは何ともなりません。

2010年6月22日火曜日

MicroBlaze上でFreeRTOSを動作させるための作業10

BRAMに収まらないのではないかと書きましたが、案の定何やらメッセージが出ています。

/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: region ilmb_cntlr_dlmb_cntlr is full (freertos_0.elf section .bss)
/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: section .heap [00000050 -> 0000044f] overlaps section .text [00000050 -> 00003637]
/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: section .stack [00000450 -> 0000084f] overlaps section .text [00000050 -> 00003637]
/cygdrive/c/Xilinx/12.1/ISE_DS/EDK/gnu/microblaze/nt/bin/../lib/gcc/microblaze-xilinx-elf/4.1.2/../../../../microblaze-xilinx-elf/bin/ld: region ilmb_cntlr_dlmb_cntlr is full (freertos_0.elf section .bss)

ilmb_cntlr_dlmb_cntlr領域とは


LMB(Local Memory Bus)に接続されたメモリコントローラが管理する領域で、実態はBRAMインターフェースコントローラです。
メモリ空間はどういうサイズ設定にしたのかを確認すると


16Kのサイズで設定してあります。

では「これを倍にしてしまえ!」という話になりますが、32KにするとXC3S200では

ERROR:Pack:2310 - Too many comps of type "RAMB16" found to fit this device.
ERROR:Map:237 - The design is too large to fit the device. Please check the
Design Summary section to see which resource requirement for your design
exceeds the resources available in the device. Note that the number of slices
reported may not be reflected accurately as their packing might not have been
completed.

となりデバイスに収まりきりません。

EDK評価ライセンスも後2日と表示が出ています。
あと少しの作業で実機動作確認というところまで辿り着いたのですが困りました。

MicroBlaze上でFreeRTOSを動作させるための作業9

XC3S200のBRAMに収まりきらない気がする・・・。

MicroBlaze上でFreeRTOSを動作させるための作業8

リファレンスが見つからない件は以下のような結果でした。
EDK 7.1からEDK 12.1への乗り換え時に参考になるかもしれません。

./src/port.o: In function `prvSetupTimerInterrupt':
../src/port.c:278: undefined reference to `XTmrCtr_mDisable'
../src/port.c:280: undefined reference to `XTmrCtr_mSetLoadReg'
../src/port.c:281: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:290: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:291: undefined reference to `XIntc_mAckIntr'

「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/port.o: In function `vTaskISRHandler':
../src/port.c:322: undefined reference to `XIntc_mAckIntr'
../src/port.c:328: undefined reference to `XIntc_mAckIntr'

「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/port.o: In function `vTickISR':
../src/port.c:345: undefined reference to `XTmrCtr_mGetControlStatusReg'
../src/port.c:346: undefined reference to `XTmrCtr_mSetControlStatusReg'

「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/serial.o: In function `xSerialPortInitMinimal':
../src/serial.c:96: undefined reference to `XUartLite_mDisableIntr'
../src/serial.c:99: undefined reference to `XIo_In32'
../src/serial.c:100: undefined reference to `XIo_Out32'
../src/serial.c:105: undefined reference to `XUartLite_mEnableIntr'
../src/serial.c:112: undefined reference to `XIntc_mAckIntr'

#include "xio.h"を追加した。
「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/serial.o: In function `xSerialPutChar':
../src/serial.c:145: undefined reference to `XUartLite_mIsTransmitFull'
../src/serial.c:167: undefined reference to `XIo_Out32'

#include "xio.h"を追加した。
「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

./src/serial.o: In function `vSerialISR':
../src/serial.c:190: undefined reference to `XIo_In32'
../src/serial.c:197: undefined reference to `XIo_In32'
../src/serial.c:208: undefined reference to `XIo_Out32'

#include "xio.h"を追加した。
「XXX_mXXX」は「XXX_XXX」にした。命名規則を変更したようだ。

ということでほとんど実質変更なしといった結果でした。
EDKの評価ライセンスは後2日。
うーん。

2010年6月20日日曜日

MicroBlaze上でFreeRTOSを動作させるための作業7

ペリフェラルのベースアドレスや割り込みマスクの定義を今回のハードウェア用に書き直しました。
結果的にコンパイルは通るようになりましたが、幾つかのAPIは名称変更や機能変更があるようです。

./src/port.o: In function `prvSetupTimerInterrupt':
../src/port.c:278: undefined reference to `XTmrCtr_mDisable'
../src/port.c:280: undefined reference to `XTmrCtr_mSetLoadReg'
../src/port.c:281: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:290: undefined reference to `XTmrCtr_mSetControlStatusReg'
../src/port.c:291: undefined reference to `XIntc_mAckIntr'

./src/port.o: In function `vTaskISRHandler':
../src/port.c:322: undefined reference to `XIntc_mAckIntr'
../src/port.c:328: undefined reference to `XIntc_mAckIntr'

./src/port.o: In function `vTickISR':
../src/port.c:345: undefined reference to `XTmrCtr_mGetControlStatusReg'
../src/port.c:346: undefined reference to `XTmrCtr_mSetControlStatusReg'

./src/serial.o: In function `xSerialPortInitMinimal':
../src/serial.c:96: undefined reference to `XUartLite_mDisableIntr'
../src/serial.c:99: undefined reference to `XIo_In32'
../src/serial.c:100: undefined reference to `XIo_Out32'
../src/serial.c:105: undefined reference to `XUartLite_mEnableIntr'
../src/serial.c:112: undefined reference to `XIntc_mAckIntr'

./src/serial.o: In function `xSerialPutChar':
../src/serial.c:145: undefined reference to `XUartLite_mIsTransmitFull'
../src/serial.c:167: undefined reference to `XIo_Out32'

./src/serial.o: In function `vSerialISR':
../src/serial.c:190: undefined reference to `XIo_In32'
../src/serial.c:197: undefined reference to `XIo_In32'
../src/serial.c:208: undefined reference to `XIo_Out32'

それだけではなく「.textと.bssが一杯だ」と警告も出ています。
「あれ?リンカスクリプトなんてどこで作ったっけ?」という感じです。

ポーティングもその辺のケアが必要な段階まで進んできたということですね。

MicroBlaze上でFreeRTOSを動作させるための作業6

Xilinx Software Development Kit 12.1を使ってコンパイルするところまで到達。

../src/port.c: In function ‘vPortYield’:
../src/port.c:257: error: conflicting type qualifiers for ‘uxCriticalNesting’
../src/port.c:89: error: previous definition of ‘uxCriticalNesting’ was here
../src/port.c: In function ‘prvSetupTimerInterrupt’:
../src/port.c:277: warning: implicit declaration of function ‘XTmrCtr_mDisable’
../src/port.c:277: error: ‘XPAR_OPB_TIMER_1_BASEADDR’ undeclared (first use in this function)
../src/port.c:277: error: (Each undeclared identifier is reported only once
../src/port.c:277: error: for each function it appears in.)
../src/port.c:277: error: ‘XPAR_OPB_TIMER_1_DEVICE_ID’ undeclared (first use in this function)
../src/port.c:279: warning: implicit declaration of function ‘XTmrCtr_mSetLoadReg’
../src/port.c:280: warning: implicit declaration of function ‘XTmrCtr_mSetControlStatusReg’
../src/port.c:284: error: ‘XPAR_OPB_INTC_0_BASEADDR’ undeclared (first use in this function)
../src/port.c:285: error: ‘XPAR_OPB_TIMER_1_INTERRUPT_MASK’ undeclared (first use in this function)
../src/port.c:290: warning: implicit declaration of function ‘XIntc_mAckIntr’
../src/port.c: In function ‘vTickISR’:
../src/port.c:344: warning: implicit declaration of function ‘XTmrCtr_mGetControlStatusReg’
../src/port.c:344: error: ‘XPAR_OPB_TIMER_1_BASEADDR’ undeclared (first use in this function)
make: *** [src/port.o] Error 1

こんな風に順調にエラーを出してくれてます。
カーネルソースの部分についてはティックタイマー(とその割り込みコントローラ)のエラーだけです。

2010年6月19日土曜日

MicroBlaze上でFreeRTOSを動作させるための作業5

FreeRTOSのデモプロジェクトにあるMicroBlazeポートで割り込みコントローラがどのように使われているのかを調べました。
system.mhsを見ると以下のようになっています。

BEGIN opb_intc
PARAMETER INSTANCE = opb_intc_0
PARAMETER HW_VER = 1.00.c
PARAMETER C_BASEADDR = 0x41200000
PARAMETER C_HIGHADDR = 0x4120ffff
PARAMETER C_HAS_IPR = 0
BUS_INTERFACE SOPB = mb_opb
PORT Irq = Interrupt
PORT Intr = RS232_Uart_Interrupt & opb_timer_1_Interrupt
END

この事から一つの割り込みコントローラでRS-232CとTimer1の割り込みを制御していることがわかります。そこで「Ports」タブにあるxps_intr_0のIntrを下記のように設定しました。


同時にsystem.mhsからTimerのパラメータも確認しておきます。
BEGIN opb_timer
PARAMETER INSTANCE = opb_timer_1
PARAMETER HW_VER = 1.00.b
PARAMETER C_COUNT_WIDTH = 32
PARAMETER C_ONE_TIMER_ONLY = 1
PARAMETER C_BASEADDR = 0x41c00000
PARAMETER C_HIGHADDR = 0x41c0ffff
BUS_INTERFACE SOPB = mb_opb
PORT OPB_Clk = sys_clk_s
PORT Interrupt = opb_timer_1_Interrupt
END
32ビットカウンタで1つのタイマーを設定しています。

MicroBlaze上でFreeRTOSを動作させるための作業4

ハードウェアコンフィギュレーションのステップを整理します。
Xilinx Platform Studioのバージョンは12.1です。

バスインターフェースを設定します。
バスインターフェース設定画面に対する編集はsystem.mhsに反映されます。


アドレスを設定します。
アドレス設定画面に対する編集はmicroblaze_0/include/xparameters.hに反映されます。


ポートを設定します。
ポート設定画面に対する編集はsystem.mhsに反映されます。


これら3つの設定でひとまずハードウェアコンフィギュレーションとしては完了です。
あとはUCFを設定したりするだけ。
ツールのこの辺りの動作は信頼できそうです。

割り込みハンドラなどは別途設定が必要。
これは別途記載する予定。

MicroBlaze上でFreeRTOSを動作させるための作業3

リファレンス情報の収集。

Embedded System Tools Reference Manual EDK 12.1

MicroBlaze上でFreeRTOSを動作させるための作業2

昨日は手始めに既存のFreeRTOSデモプロジェクトをXilinx Platform Studio 12.1で開いてみました。
このデモプロジェクトはかなり以前のバージョンのツールで作られているようです。
期待通り変換は大失敗し、プロジェクトファイルとして成立しませんでした。
聞くところによるとMicroBlazeのPLB(Processor Local Bus)の仕様もどこかの時点で変更されたとのことです。

適当にホイホイやってもうまくいかなそうなので現状を整理してみました。

まず、デモプロジェクトで使用しているボードはXilinxが提供しているML403というなかなか豪華なボードです。まぁ、使うのはUSARTやGPIO(LED点灯用)、それにプロセッサのタイマーなので気にしなくても良いでしょう。

次に使っているペリフェラルを見てみます。
先日のプロジェクト変換リポートから情報を抽出します。

矢印が付いているものは見つかったハードウェアコアのバージョンが更新されているもの。
?が付いているものは見つからないハードウェアコアです。

lmb_bram_if_cntlr 1.00.b -> 2.10.b
opb_mdm?
opb_v20 1.10.c -> 1.10.d
microblaze 4.00.a -> 7.30.a
opb_uartlite?
opb_gpio?
opb_intc?
opb_timer?
intc 1.00.c -> 2.00.a
tmrctr 1.00.b -> 2.00.a
gpio 2.00.a -> 2.00.a
uartlite 1.00.b -> 2.00.a
bram 1.00.a -> 2.00.a
opbarb 1.02.a -> 1.12.b

opb_xxxという不明なハードウェアコアがあります。
調べたところOPB(On-chip Peripheral Bus)というのはPLB以前のプロセッサ内部バスのようです。
opb_xxxはハードウェアコア(ペリフェラル)とバスの接続モジュール(ブリッジ?)のようです。
既にこの仕様はPLB(Processor Local Bus)に代わったものですので無視して良さそうです。

ハードウェアコアとしてブロックラムも使用しているようです。
以前のMicroBlazeはRAM周辺の扱いも異なっていたのでしょう。
最近のバージョンではプロセッサが使用するラムはプロセッサの作成時に定義するようになっています。
この点からブロックラムのハードウェアコアについても気にすることはなさそうです。

FreeRTOSをMicroBlazeへポーティングするのに必要となるのは
・MicroBlaze本体
・割り込みコントローラ
・カーネルティック用タイマー
・USART
です。

これから考えるとハードウェアとしては
・microblaze 7.30.a
・intc 2.00.a
・tmrctr 2.00.a
・usartlite 2.00.a
だけ用意すれば事足りそうです。


戦略としては
・空のプロジェクトを作成する。
・ハードウェアコアを追加する。
・ハードウェアテストコードを作成する。
・ハードウェア動作を確認する。
・FreeRTOSのコードを移植する。
という方向で行きたいと思います。

こんな感じで調べながらのポーティング。
探偵か何かになった気分でなかなか楽しいです。

2010年6月18日金曜日

Xilinx EDK 12.1のはまりどころ2

Xilinx Platform Studioのバグ。
エラーを出すようなコードは書くなという事のようです。


ちなみにこれらのソースに2バイトコードなどは一切含まれません。
その手のエラーではありません。

こうなったら最後XPSを再起動するまでなんともなりません。
ポーティング時にありがちな「ひとまずザーッとコピーしてエラーが出るところを直していこう。」といった事が事実上不可能。

例えばインクルードしているヘッダファイルがないというようなエラーでもこのような状態になることがあります。
なんだこりゃです。

MicroBlaze上でFreeRTOSを動作させるための作業1

FreeRTOSのデモにあるプロジェクトは随分古いバージョンのEDKで作られているようです。
system.mhsを見るとEDK 7.1となっていますので、2004年頃のポーティングのようです。

考えあぐねても進まないので12.1を使ってプロジェクトをアップデートしてみました。


案の定・・・沢山のコアが見つからないと叫んでいます。(This is from Version_Changes.log)
 The following files will be modified:
  system.mhs
  system.mss

--------------------------------------
 The following changes will be made:
 Core dcm_module 1.00.a will be replaced by 1.00.e

 Driver cpu 1.00.a will be replaced by 1.12.b
--------------------------------------
 The following changes need to be made manually by the user:

 Core lmb_bram_if_cntlr 1.00.b needs to be replaced by 2.10.b
 No core by the name of  opb_mdm was found.
 Please check the mhs file and repository.
 Core opb_v20 1.10.c needs to be replaced by 1.10.d
 Core microblaze 4.00.a needs to be replaced by 7.30.a
 No core by the name of  opb_uartlite was found.
 Please check the mhs file and repository.
 No core by the name of  opb_gpio was found.
 Please check the mhs file and repository.
 No core by the name of  opb_intc was found.
 Please check the mhs file and repository.
 No core by the name of  opb_timer was found.
 Please check the mhs file and repository.
 Driver intc 1.00.c needs to be replaced by 2.00.a
 Driver tmrctr 1.00.b needs to be replaced by 2.00.a
 Driver gpio 2.00.a needs to be replaced by 2.00.a
 Driver uartlite 1.00.b needs to be replaced by 2.00.a
 Driver bram 1.00.a needs to be replaced by 2.00.a
 Driver opbarb 1.02.a needs to be replaced by 1.12.b
この中で特に注意したいのは
No core by the name of opb_mdm was found.
No core by the name of opb_uartlite was found.
No core by the name of opb_gpio was found.
No core by the name of opb_intc was found.
No core by the name of opb_timer was found.
ですかね。
まぁ、まだよく見ていないのでわかりませんが。

MicroBlazeが動作し始めたので調子に乗って進める予定。
カーネルソースの中から使っているコアと用途を整理して一つずつポートするのが良いでしょう。

評価用ライセンスは後6日。

2010年6月17日木曜日

DIGILENTのSPARTAN-3 starter kitでビットストリームを流してもdoneしない件の解決編

先日のビットストリームを流してもdoneしない件は凡ミスでした。
ボードのFPGAコンフィギュレーションモードの設定を間違っていました。
ビットストリームを流し込むのですから正しくは以下赤枠の設定です。


つまらないコードですが以下で動作を確認。
#include "xparameters.h"
#include "xgpio_l.h"

int main(void)
{
    int num = 0x55;
    while (1) {
        XGpio_WriteReg(XPAR_LED_BASEADDR, 0, num & 0xff);
    }
}


LED点灯。
GPIOはUCFで8個並んだLEDに割り当てています。

これにGPIOの入力を組み合わせてみます。

#include "xparameters.h"
#include "xgpio_l.h"

int main(void)
{
    int val;
    while (1) {
        val = XGpio_ReadReg(XPAR_TGLSW_BASEADDR, 0);
        XGpio_WriteReg(XPAR_LED_BASEADDR, 0, val);
    }
}

入力GPIOはボード右下にあるスライドスイッチに割り当ててあります。
これでスライドスイッチの状態に合わせてLEDが点灯するデモの出来上がりです。

さて次はOSの搭載ですかね。
えーと、EDKの評価ライセンスは後7日です。
遊びながらなのでかなり厳しいです。

2010年6月13日日曜日

B055 : mbed NXP LPC1768 webcam (Board outline)

ボード外形を部品を載せて検討。


有機ELディスプレイが載っているとんがったボード。
カメラとGPSはコネクタで外に伸ばす?

2010年6月12日土曜日

DIGILENTのSPARTAN-3 starter kitでビットストリームを流してもdoneしない

EDKを使ってMicroBlazeを動作させるための準備。
エンベデッドシステム開発のテキストを参考に、まずはTestApp_Memory_microblaze_0を動作させる。


・・・doneしない。

ビットストリーム作成までの手順にバグがありそうだ。
EDK 12.1からはDigilent社製のSpartan-3 Starter BoardがBSPから外れている。
仕方が無いのでデバイスの選択から作成している。

これはあちこち追うことになりそう。

Xilinx EDK 12.1のはまりどころ1

くだらないこと。

どうやって次に進むんだー?
How do I get the next stage?


答え
Answer

ダイアログを手動で大きくすると下側にボタンが出てくる。
The buttons will appear under the dialog when you expand the dialog manually.


うーん。
Uh...

2010年6月9日水曜日

B056 : Capture422!

こんな装置も考えています。


Capture422!はRS-422伝送路を流れるコマンドをキャプチャすることのできる装置です。
単にキャプチャするだけでなく、PCと接続してPC側にデータを送信したり、PCと連携してプロトコル解析を行ったりすることができます。
操作はロータリーエンコーダとスイッチで簡単に行うことができます。
単体でも動作可能でキャプチャしたデータをSDカードに保存することができます。

B055 : mbed NXP LPC1768 webcam

LCDのバックライト用としてステップアップDC-DCコンバータを選定。


よく使われていて現在でもDigikeyから入手可能なものを選定した。

B055 : mbed NXP LPC1768 webcam

mbed NXP LPC1768を使ったwebcamプロジェクトの検討。

On board
* RJ45
* SD card
* Color LCD
* Flash ROM
* Button

Outside
* GPS
* Jpeg serial camera


このカメラシステムはmbed NXP LPC1768を使ったカメラシステムで、搭載されたネットワークインターフェースを使ってウェブに画像を配信したり、Twitterにつぶやいたりすることができます。
また、有機LCDには現在の画像を表示でき、ボタン操作でSDカードに画像を保存する事もできます。
GPSを搭載していますので現在位置を報告する事も可能。
大容量フラッシュロムは用途に応じて様々にお使い頂けます。

と、こんな具合の基板を作ろうか思案中。

検討して楽しんでいるだけなので実際に作るかどうかは未定。
作るならサクッと作らないとすぐにLCDが入手難になります。
安定的に安く仕入れる方法はないかなぁ。


今日は関連してコネクタのライブラリを作った。