FrontPage

2014/08/17からのアクセス回数 1736

残念ながら、SAM7-LA2ボードのgccでのコンパイル環境が整えられなかったので、FM3でU-Boot, uCLinuxの構築を 試すことにしました。

開発環境を整える

ツールとソース

CMSISをダウンロードします。

ねむいさんの例題おきばから「MB9BF618T(FRK-FM3-GARBAGEBOARD Compatible Circuit)」のLED-Blink & UARTをダウンロードしました。

makefileの変更

さすがねむいさんの例題は、きれいな構成になっています。スタートアップ関数は、CMSISを使っています。

  • CMSIS/Device/SPANSION/MB9BF61xT/Sources/Templates/startup/gcc/startup_mb9bf61xt.s

私の環境に合わせるために、修正したのは以下の変数です。

# Toolchain prefix (i.e arm-none-eabi -> arm-none-eabi-gcc.exe)
TCHAIN  = arm-none-eabi

# OpenOCD prefix
OCD             = /usr/local/bin/openocd

# Select SWD Writer
WRITER  = VERSALOON

# Development Tools based on GNU Compiler Collection
DEVTOOL = SOURCERY

REMOVAL = rm
# Check BuildTools
TOOLDIR = ~/local/arm/CodeSourcery/

# Set UNIX-Like tools (Coreutils)
MAKEDIR = /opt/local/bin/

# Set Flasher and Debugger
OCDIR   = /usr/local/share/openocd/scripts/

WSHELL  = sh
MSGECHO = echo
GDBDIR  = $(TOOLDIR)/arm/bin
INSIGHT = 

openocd.cfgの変更

fm3.cfgは、DVDとねむいさんの両方を見比べながら、以下の様にしてlib/openocdディレクトリに入れました。

openocd.cfgは、以下の様にしました。

# OpenOCD fm3.cfg with Flash proc

set CHIPNAME mb9bfxx6
set CPUTAPID 0x4ba00477

source [find interface/vsllink.cfg]
source [find target/fm3.cfg]

proc flash_program {ELF_FILENAME} {
     halt
     flash probe 0
     flash write_image erase $ELF_FILENAME
     #flash write_bank 0 $ELF_FILENAME 0x0
     echo "flash program complete. reset and run"
     resume
     exit
}

init
halt

fm3のドライバーの追加

私のVersaloon対応openocdではfm3のドライバーがないので、以下の手順でfm3のドライバーを追加しました。

  • InterfaceのDVDからOpenOCD/cq-source.zipを解凍し、cq-source/cdclink/openocd/openocd_patchのfm3.cをVersaloon対応openocdのsrc/flash/nor/にコピーします
  • src/flash/nor/drivers.cに以下の2カ所を追加します。
    extern struct flash_driver fm3_flash;
    

flash_driversに以下を追加

static struct flash_driver *flash_drivers[] = {
の最後のNULLの前に以下を追加
        &fm3_flash,
        NULL,
};
  • src/flash/nor/Makefileのam__objects_1にfm3.loを追加
    am__objects_1 = aduc702x.lo at91sam3.lo at91sam7.lo avrf.lo cfi.lo \
            ecos.lo em357.lo faux.lo lpc2000.lo lpc288x.lo lpc2900.lo \
            non_cfi.lo ocl.lo pic32mx.lo stmsmi.lo stellaris.lo stm32x.lo \
            stm32f2xxx.lo str7x.lo str9x.lo str9xpec.lo tms470.lo \
            virtual.lo fm3.lo
    
    CFLAGSの-Werrorを外す
    CFLAGS = -g -O2 -Wall -Wstrict-prototypes -Wformat-security -Wshadow -Wextra -Wno-unused-parameter -Wbad-function-cast -Wcast-align -Wredundant-decls
    

LEDチカチカを試す

ねむいさんのmain.cを以下の様に修正して、LEDを点滅するだけのシンプルなもので動作確認をしました。

main.c

/********************************************************************************/
/*!
@filemain.c
@author         Nemui Trinomius (http://nemuisan.blog.bai.ne.jp)
    @version        W.I.P
    @date           2013.07.10
@brief          KickStart program For MB9BF618T JunkBoard!@n

    @section HISTORY
201.07.10Vx.xx See Whatnew.txt.

    @section LICENSE
BSD License. See Copyright.txt
*/
/********************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "hw_config.h"

/* Defines -------------------------------------------------------------------*/

/* Variables -----------------------------------------------------------------*/

/* Constants -----------------------------------------------------------------*/

/* Function prototypes -------------------------------------------------------*/

/* Functions -----------------------------------------------------------------*/
/**************************************************************************/
/**
  * @brief  This function handles SysTick Handler.
  * @param  : None
  * @retval : None
  */
/**************************************************************************/
void SysTick_Handler(void)
{
/* every 1mSec for _delay_ms() */
TimingDelay_Decrement();

/* another function See hw_config.h !*/
Cyclic_Exec();

#ifdefined(USE_ADS7843)
static uint16_t cnt=0;
/* every 100 mSec */
if( cnt++ >= 100 ) {
cnt = 0;
scaned_tc =1;
}
#endif

}

/**************************************************************************/
/*! 
    @briefMain Function
@paramnone
    @retvalnone
*/
/**************************************************************************/
int main(void)
{

#if defined(USE_SEMIHOSTING)
initialise_monitor_handles();
#endif

/* Set 1mSec Timer */
SysTickInit(INTERVAL);

/* Initialise GPIO for the LED. */
FM3_GPIO->PDORF_f.P3 =0;/* Set Clr(at first)*/
FM3_GPIO->PFRF_f.P3 =0;/* Use PF3 as GPIO*/
FM3_GPIO->DDRF_f.P3 =1;/* Mode Output  */
FM3_GPIO->PZRF_f.P3 =1;/* Port Tristate  */

while (1)/* loop forever */
{
/* Invert Pin */
FM3_GPIO->PDORF_f.P3 = ~FM3_GPIO->PDORF_f.P3;
/* wait 500mSec a.k.a. _delay_us(500*1000); */
_delay_ms(500);
}
}

/* End Of File ---------------------------------------------------------------*/

動作確認

makeを実行して、正常に終了したら、openocdを使ってROMにプログラムを書き込みます。

$ make
$ openocd -s lib/openocd -f openocd.cfg -c "flash_program main.elf"

正常に書き込みができたら、以下の様にLM3のLEDが点滅します。

FM3_led.png

デバッガの設定

プログラムのデバッグは、 arm/LED点灯の作成とデバッグ に従ってデバッグを設定します。

デバッグのコンフィグタブのInitialize commands以下の様に変更し、Run Commandsは空のままにしてください。

target remote localhost:3333
set remote hardware-breakpoint-limit 6
monitor reset halt
load
monitor reset init
thbreak main

MacOSXでは、VersaloonのCDCがOSのドライバーに取られしまうため、一時的にそれをいったん止めます。

$ sudo kextunload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDC.kext

元に戻すには、

$ sudo kextload /System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBCDC.kext

最初にTerminalでプロジェクトのあるディレクトリに移動して、openocdを起動します。

$ openocd -s lib/openocd -f openocd.cfg 
Open On-Chip Debugger 0.5.0-dev-00783-g0123985-dirty (2014-08-17-11:36)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.berlios.de/doc/doxygen/bugs.html
Warn : must select a transport.
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
trst_only separate trst_push_pull
500 kHz
cortex_m3 reset_config sysresetreq
Error: Fail to receive usb data, error string is Operation timed out.
Info : Versaloon(0x15)by Simon(compiled on Jan 29 2011)
Info : USB_TO_XXX abilities: 0x0000024F:0x010001EF:0xC0000007
Info : clock speed 500 kHz
Info : JTAG tap: mb9bfxx6.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Info : mb9bfxx6.cpu: hardware has 6 breakpoints, 4 watchpoints

これで、EclipseのDebug ConfigurationsからZylin Embedded debug(Native)のFM_Sample Debugを選択しデバッガを起動します。

おまけ

ARM-USB-TINY

fm3のドライバーがないので苦肉の策で、最新のopenocdをインストールしてARM-USB-TINYを使うようにしたら上手く認識できました。

最新のopenocdは、すごいですね。

使ったopenocd.cfgは以下の通りです。

adapter_khz 500
interface ft2232

set CHIPNAME mb9bfxx6
set CPUTAPID 0x4ba00477

source [find interface/olimex-jtag-tiny.cfg]
source [find target/fm3.cfg]

proc flash_program {ELF_FILENAME} {
     halt
     flash probe 0
     flash write_image erase $ELF_FILENAME
     #flash write_bank 0 $ELF_FILENAME 0x0
     echo "flash program complete. reset and run"
     resume
     exit
}

init
halt

気づいた点

FLASH USB DIRECT Programmerをダウンロードしたが、手元のWindows XPではUSBのドライバーが上手く認識できない

コメント

選択肢 投票
おもしろかった 1  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。

スパム防止に画像の文字列も入力してください。


(Input image string)


添付ファイル: filevsllink.cfg 225件 [詳細] filefm3.cfg 313件 [詳細] fileFM3_led.png 291件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-04-04 (土) 17:20:08 (813d)
SmartDoc