フォト
無料ブログはココログ

JTAG

2014年7月30日 (水)

STM32F0-Discovery + OpenOCD

講義で使おうとSTM32F0-Discoveryを購入したら、主催者側がまとめて買ったとかで出番がなくなった。

Stm32f0discovery0000

でに、いつものように、ねむいさんの置場からOpenOCDの最新版をDL。(ねむいさんありがとうございます)説明を見ると。

-OpenOCD
  OpenOCD 0.9.0-dev-00098-ge03eb89(built on 20140711)
  Windows 32bit Binary Nemuisan's Special Version
  SupportedOS
  ->WindowsXP(x86),Windows7(x86/x64)
  SupportedHardware
  ->JTAGKey,JTAGkey2 and many FT2232 Devices(LibUSBK or WinUSB or LibUSB)
  ->JLink(LibUSBK or WinUSB or LibUSB)
  ->JLink On LPCLink2(LibUSBK or WinUSB or LibUSB)
  ->ULink(LibUSB) (untested)
  ->RLink(LibUSB) (untested)
  ->STLink/V2(STMicro's Distributed USB-Driver/WinUSB)
  ->Versaloon(LibUSBK or WinUSB)
  ->TI-LCDI(TI's Distributed USB-Driver/WinUSB)
  ->CMSIS-DAP(Generic USB-HID/Mbed VCP Driver)
  ->STLink/V2-1(STM32-Nucleo Drivers/WinUSB)

CMSIS-DAPをサポートしたんだと思ったら、0.8.0で既にサポートされていた。

テストプログラムは、同じく置場のkick startをDLした。

このテストプログラムは Lチカ+シリアル でFlashに書かないでRAMで動かす。

OpenOCDを起動して

openocd.exe -s ./tcl -s ./image -f board/stm32f0discovery.cfg

telnetでlocalhost:4444に接続。RAMにロードして動かすコマンドは

> reset halt
target halted due to debug-request , current mode: Thread
xPSR: 0xc1000000 pc: 0x0800087c msp: 0x20000408
> load_image lchika.elf
4356 bytes written at address 0x20000000
download 4356 bytes in 0.090000s (47.266 KiB/s)
> mww 0x40010000  3
> mdw 0x20000000 2
0x20000000: 20002000 20000e25
> reg  sp  0x20002000
sp (/32): 0x20002000
> reg  pc  0x20000E25
pc (/32): 0x20000E25
> resume


set sp 0x20002000, set pc 0x20000E25は間違い
reg sp 0x20002000, reg pc 0x20000E25が正しい
(2015/11/29)

<<stm32f0_ram_exec.tcl>>

proc load_elf { loadfile } {
	# vector table address
	set vbr 0x40010000
	# (top of SRAM)
	set mode 3
	# reset and halt
	reset halt
	# set vector table address
	mww $vbr $mode
	# load ELF file onto SRAM(0x20000000-)
	load_image $loadfile
	return
}
proc run_sram { } {
	# vector address (top of SRAM)
	set vectaddr 0x20000000
	# get initial SP and reset handler
	mem2array vect 32 $vectaddr 2
	# display top of vector 4 elements
	mdw $vectaddr 4
	# set initial SP into SP
	reg sp $vect(0)
	# set reset handler int PC
	reg pc $vect(1)
	# execute now
	resume
	return
}
proc load_run { loadfile } {
	load_elf $loadfile
	run_sram
	return
}

こんなスクリプトを作っておいて

openocd.exe -s ./tcl -s ./image -f board/stm32f0discovery.cfg 
             -f stm32f0_ram_exec.tcl  -c "init"  -c "load_run lchika.elf"

で CPUの停止 → バイナリ―のロード → レジスタ(SP,SP)の設定 → 実行 してくれる。

Stm32f0discovery0000 ←リンク先にAVI(792.5k)

 置場を見ていると、STM32VL-Discoveryのサンプル(TFT/OLED Module Control Sample with ChaN's FatFs(STM32VL-MMC Driver))があったので、STM32F0DiscoveryのテストプログラムをSTM32VLDiscovery用に作ってみた。

main.cはインクルードするヘッダファイルを除いてほぼ同じだ。以前作ったテストプログラムは、機能を削ってようやく8KのRAMの収まるくらいだったが、コンパイルすると、4.5kに収まった。

 ところが、RAMにロードして動かそうとするとうまく動かない。LEDは点灯するだけで点滅せずシリアルにメッセージも送信されない。

 ソースを見ても分からないのでデバッガで追ってみた。こんなことならInsightを入れとけばよかったと思ったが、gdbでシコシコ

 実行する度に暴走する場所が異なる。メインから全てステップで追ってみるとxprintf()の中でgdbが返事をしなくなる。ところがxprintf()にブレークポイントを張って実行すると、ブレークポイントにたどり着く前にどこかへ行ってしまう。挙動不審だ。

 LチカでSysTickを使っているのだが int TimingDelayの値がデクリメントされていないことに気がつた。そこで、SysTick_Handlerにブレークポイントを張ってちゃんと割り込みが掛かっているか確認すると、SysTic_Handlerに飛んでこない。
割り込みべタはRAMに設定しているのに??

 悩むこと半日とうとう見付けた
src/hw_config.c

/**************************************************************************
#ifdef  VECT_TAB_RAM
/* vector-offset (TBLOFF) from bottom of SRAM. defined in linker script */
extern uint32_t _isr_vectorsram_offs;
#endif
void NVIC_Configuration(void)
{

    /* 20090429Nemui */
    #ifdef  VECT_TAB_RAM
      /* Set the Vector Table base location at 0x20000000 + _isr_vectorsram_offs */
      NVIC_SetVectorTable(NVIC_VectTab_RAM, (uint32_t)&_isr_vectorsram_offs);
    #else  /* VECT_TAB_FLASH  */
      /* Set the Vector Table base address at 0x08000000 */
      NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
    #endif
    /* 20090429Nemui */

        (
         )
NVIC_SetVectorTable()は
lib/STM32F10x_SetPeriph_Driver/src/misc.c

/**
* @brief  Sets the vector table location and Offset.
* @param  NVIC_VectTab: specifies if the vector table is in RAM or FLASH memor.
*   This parameter can be one of the following values:
*     @arg NVIC_VectTab_RAM
*     @arg NVIC_VectTab_FLASH
* @param  Offset: Vector Table base offset field. This value must be a multipl
*         of 0x200.
* @retval None
*/
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
{
  /* Check the parameters */
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));

  SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}

 この関数で VTOR(Vector Table Offset Register)を設定して割り込みベクタをリマップしている。
VECT_TAB_RAM/ VECT_TAB_FLASHはmakefieでコンパイル時に -DVECT_TAB_FLASHが宣言されている。

 OpenOCDでバイナリをRAMにロードして、実行する前に割り込みベクタ・テーブルをRAMに設定しているのだが(mww 0xE000ED08 0x20000000) main()の先頭で呼ばれるSet_System()関数から Set_System() -> NVIC_Conviguration() -> NVIC_SetVectorTable() の順で呼ばれて割り込みベクタをFLASHの先頭に戻していたようだ。

 コメントを見ると、/* 20090429Nemu */のシグネチャがある。
ねむいさんはプログラム中で割り込みベクタ・テーブルをリマップするというお考えだったらしい。それに気が付かないで自分で設定していたのが原因だった。

でもね、STM32F0DiscoveryのKickStartではベクタテーブルのリマップしてないんだよね。^^)尤も、cortex-M0にはVTORはないんだけどね。

 cortex-M0にはVTROはなくても、ベクタテーブルのリマップ関数はあるのではと思い、探してみるとちゃんとあった。

/lib/STM32F0xx_StdPeriph_Driver/src/stm32f0xx_syscfg.c

/**
  * @brief  Configures the memory mapping at address 0x00000000.
  * @param  SYSCFG_MemoryRemap: selects the memory remapping.
  *          This parameter can be one of the following values:
  *            @arg SYSCFG_MemoryRemap_Flash: Main Flash memory mapped at 0x00000000  
  *            @arg SYSCFG_MemoryRemap_SystemMemory: System Flash memory mapped at 0x00000000
  *            @arg SYSCFG_MemoryRemap_SRAM: Embedded SRAM mapped at 0x00000000
  * @retval None
  */
void SYSCFG_MemoryRemapConfig(uint32_t SYSCFG_MemoryRemap)
{
  uint32_t tmpctrl = 0;

  /* Check the parameter */
  assert_param(IS_SYSCFG_MEMORY_REMAP(SYSCFG_MemoryRemap));

  /* Get CFGR1 register value */
  tmpctrl = SYSCFG->CFGR1;

  /* Clear MEM_MODE bits */
  tmpctrl &= (uint32_t) (~SYSCFG_CFGR1_MEM_MODE);

  /* Set the new MEM_MODE bits value */
  tmpctrl |= (uint32_t) SYSCFG_MemoryRemap;

  /* Set CFGR1 register with the new memory remap configuration */
  SYSCFG->CFGR1 = tmpctrl;
}

 MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); をmainの頭で呼んでやればよさそうだ。

ついでに、スタートアップルーチン("lib/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc_ride7/startup_stm32f0xx.s)も調べてみると、Reset_Handlerの先頭でスタックの設定も行っていることが分かった。

 つまり、OpenOCDのコマンドは

> reset  halt
> load_image  main.elf
> reg  pc  Reset_Handlerのアドレス

で良さそうだ。

2014年2月 3日 (月)

versaloon

STM8S DiscoveryのST-Link部分をVersaloonにする。

 

 STM8S Discoveryはターゲット(STM8S105C6T6)とST-Linkが一体になった安価(\750@秋月)なボードである。

← ST-Link部分にはSTM32F103C8T6が使われていて、この部分だけでも\750ではとても元が取れそうにない。

 それはさておき、この部分がCortexのSWDインタフェースとして使えればよいのだがSWDには対応していない。

 でも、ファームを書き換えてSWDインタフェース(Versaloon)にすることをねむいさんのページで知り買ってきたが、STM32LVDiscoveryも一緒に買ったので改造する必要がなくなって放ったらかしになっていた。

 STM8Sの開発環境は以前使っていたパソコンにはインストールしてみたけれど、パソコンを買い換えてからはインストールしていない。

 Cortexプログラム/デバッグ用のSWDインタフェースはST32xxDiscoveryのST-Link部分を使っている。VersaloonがSTM8SDiscoveryに対応したらしく、改造しなくてもファームを書き換えるだけで使えるようになったことを知り、Versaloon化してみた。


 ファームはソースツリーをDLしてmakefieにあるハードウェアの指定を HW_BOARD = STM8S_Discovery に変更(コメントアウトしてあるので先頭の'#'を削除)して、core_cm3.cを2箇所直して makeすればOK。
「電子工作マスターへの歩み」にあるjujurouさんの「STM8S-DISCOVERYのST-Link部分をVersaloon化」に詳しい説明がある。

 ファームの書き換えにはSTのSTM32 ST-Link utilityとSTM32F0DiscoveryのST-Link部分を使用した。
Versaloonfirmwarewrite

ここでチョイ嵌り。
STM8SDiscoveryにはSTM32F0Discovyeryから電源を供給しようとした。STM32F0DiscoveryのCN3にSWD I/Fのヘッダがあるのだが、#1ピンに3.3vが出ているものと思い込んでいて、STM8DiscoveryがST-Link utilityから認識されなかった。

Versaloonfirmwarewritevcc

 STM32F0Discoveryの回路図を見て気が付き、3.3vをSTM32F0DiscoveryのCN3ではなくボードの#1ピンから取って正常に書き込むことができた。

 VersaloonはSWD I/Fだけでなく仮想COMポートを持っている。ST-Linkも仮想COMポートをサポートしてくれると助かるのだが。
Versaloondevice

2013年9月16日 (月)

usb_jtag + カメレオンUSB FX2

usb_jtagはkolja waschkさんが公開している、AlteraのUsb-Blasterケーブルと同じプロトコルを使用したJTAGアダプタで、

On the USB side, it now uses the same protocol as Altera's USB-Blaster. The drivers that I developed for my adapter do work with the Blaster as well. To the host PC, the only really noticeable difference are vendor and product ID and the product description string (0x16C0/0x06AD/USB-JTAG-IF instead of 0x9FB/0x6001/USB-Blaster).

だそうだ。
 difference are vendor and product ID and the product description string
って意味深だなぁ...

 Usb-Blasterの構成はFT245+CPLDらしく、探すとパチモン互換品もたくさんある。
usb_jtagには3つのタイプがあって

  • Variant A: Cypress FX2
     FT245+CPLDをCypressのEZ-USB FX2のファームウェアで実現したもの
  • Variant B: FTDI FT245 plus CPLD
     FT245+CPLDで実現したもの
  • Variant C: SiLabs C8051F32x
     FT245+CPLDをSiLabのC8051F32x のファームウェアで実現したもの

 カメレオンUSB FX2でVariant Aを作ってみることにした。

Sourceforgeからixo-jtag-code-204-usb_jtag-trunk.zipをDL・展開して、device/C51/ ディレクトリでmakeする。
なお、コンパイルにはSDCCが必要である。

 何も指定しないでmakeすると、FX2のポートCを使用する。56pinのカメレオンUSB FX2では使用できないので hw_basic.cを変更したhw_chameleon.cを作成して、ポートAを使用するようにした。

-- hw_chameleon.c (太字の部分を変更する) --

//-----------------------------------------------------------------------------
// comment out (undefine!) if you don't want PS, AS or OE signals

//#define HAVE_PS_MODE 1
//#define HAVE_AS_MODE 1
//#define HAVE_OE_LED  1

// comment in (define!) if you want outputs disabled when possible
//#define HAVE_OENABLE 1

#define OEC           OEA  /* Port C -> Port A */

/* JTAG TCK, AS/PS DCLK */ sbit at 0x87          TCK; /* Port C.2 -> A.7 */ #define bmTCKOE       bmBIT7 #define SetTCK(x)     do{TCK=(x);}while(0) /* JTAG TDI, AS ASDI, PS DATA0 */ sbit at 0x80          TDI; /* Port C.0 -> A.0 */ #define bmTDIOE       bmBIT0 #define SetTDI(x)     do{TDI=(x);}while(0) /* JTAG TMS, AS/PS nCONFIG */ sbit at 0x81          TMS; /* Port C.3 -> A.1 */ #define bmTMSOE       bmBIT1 #define SetTMS(x)     do{TMS=(x);}while(0) /* JTAG TDO, AS/PS CONF_DONE */ sbit at 0x83          TDO; /* Port C.1 -> A.3 */ #define bmTDOOE       bmBIT3 #define GetTDO(x)     TDO

環境変数 HARDWARE=hw_chameleon を設定してmakeする。

$ export HARDWARE=hw_chameleon; make

 カメレオンUSB FX2 をUrJTAGでバウンダリスキャンする。このボードに載っているCPLDはAlteraのEMP570T100なのでAlteraからBSDLファイルをDLしてデバイスを登録すると認識した。

C:\Program Files\UrJTAG>jtag

UrJTAG 0.10 #1502
Copyright (C) 2002, 2003 ETC s.r.o.
Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors

UrJTAG is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for UrJTAG.

WARNING: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.

jtag> cable UsbBlaster
Connected to libftd2xx driver.
jtag> detect
IR length: 10
Chain length: 1
Device Id: 00000010000010100010000011011101 (0x00000000020A20DD)
  Manufacturer: Altera
  Part(0):         EMP570T100
  Stepping:     0
  Filename:     c:\program files\urjtag\data/altera/emp570t100/emp570t100
jtag>

 ナイトライダーをやってみた。

Chameleonusb0399 ←リンク先にAVI
「chameleonUSB.avi」をダウンロード

 

カメレオンUSB FX2はFX2のPortB、PortD、FIFOAD0、FIFOAD1、SLOEがEMP570T100に接続してあるので、ファームウェアはEEPROMに書かないでコンフィグ時だけファームウェアをロードした方が良さそうである。

2013年9月 3日 (火)

OpenOCD TI-ICDI + LM4F120 LaunchPad

買って写真だけ撮って放っていた TIのLM4F120 LaunchPad で遊んでみる。

Lm4f120launcpad4

 TIのStellarisシリーズはいつの間にかTiva Cシリーズに変わっていて、このボードに載っているLM4F120H5QRはTM4C1233H6PMになったらしく、LM4F120H5QRのデータシートはTIのサイトで見つけることができなかった。(ネットには落ちているけど)
対照表がこのページTiva C Series ARM Cortex-M Microcontrollers にあるなんてわからないよ!

 TI謹製のCCSを使うと何の問題もないのだけれど、開発環境ばかり増えるのも嫌なのでEclipse+OpenOCDかInsight+OpenOCDでやりたいと思って放っておいたのだが、教材に使う魂胆でOpenOCDで使ってみることにした。

 OpenOCD 0.7.0 がICDIに対応したというのでDLしてみたが、LM4F120 LaunchPadは対応していないようだ。ところが、OpenOCDのサイトにあるUser's GUIDEはrelease 0.8.0-devになっていて、このドキュメントにはLM4F120LaunchPadのICDIもサポートされると書いてある。

 OpenOCD 0.8.0-devを探していると、ねむいさんのページにあったのでさっそくDLしてみると、tcl/boardにek-lm4f120xl.cfgがあった。(ねむいさんに感謝)

 例によってRAMで動くプログラムを作ってみた。
STM32vlDiscoveryに載っているSTM32F100RBT6BのRAMは8k、トラ技おまけのLPC1114FN28のRAMは4kだが、このボードに載っているLM4F120H5QRのRAMは余裕の32kである。

 ねむいさんのページにあったLM4F120H5QRのkickstartを参考にして、リンカスクリプト(lib/linker/lm4f120xxx.ld)を編集してすべてのセクションをRAMに配置するようにして、(">ROM"を">RAM"にするだけの手抜き) makeするとmain.sym、main.binができる。

  ek-lm4f120xl.cfgを使ってOpenOCDを起動するとICDI経由ターゲットのLM4F120H5QRが見える。

openocd -s ./tcl -f bord/ek-lm4f120xl.cfg

C:\OpenOCD\OpenOCD-0.8.0>openocd.exe -s ./tcl -f board/ek-lm4f120xl.cfg
Open On-Chip Debugger 0.8.0-dev-00131-gf4943ac-dirty (2013-08-30-09:42)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : This adapter doesn't support configurable speed
Info : ICDI Firmware version: 9270
Info : lm4f120h5qr.cpu: hardware has 6 breakpoints, 4 watchpoints

telnetでlocalhost:4444に接続して、main.binをロードして実行する。

Open On-Chip Debugger
> version
Open On-Chip Debugger 0.8.0-dev-00131-gf4943ac-dirty (2013-08-30-09:42)
> reset halt
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x0000334c msp: 0x20001000
> load_image C:\\LM4F120H5QR_Launchpad\\main.bin 0x20000000 bin
2340 bytes written at address 0x20000000
downloaded 2340 bytes in 0.078000s (29.297 KiB/s)
> mdw 0x20000000 2
0x20000000: 20008000 20000281
> reg sp 0x20008000
sp (/32): 0x20008000
> reg pc 0x20000280
pc (/32): 0x20000280
> mww 0xE000ED08 0x20000000
> resume
>

LM4F120H5QRのFlashは0000:0000-0004:0000、RAMは2000:0000-20000:8000に配置してあるので、スタックポインタ(SP)は、20000:8000を、プログラムカウンタ(PC)はmain.symからResetHandlerのアドレスを探すか、main.binをロードして2000:0000に書かれているアドレスを、mww 0x20000000で調べて指定する。(2000:0280) 

reg sp 0x20008000
reg pc 0x20000280

 LM4F120は割り込みベクタテーブルはVTABLEレジスタ(E000:ED08)で設定する。
VTABLEレジスタにRAMの開始アドレス2000:0000を書くと割り込みベクタがRAMに配置されるらしい。
(Tiva™ TM4C1233H6PM Microcontroller (identical to LM4F120H5QR) DATA SHEET tm4c1233h6pm.pdf P154 Register 68: Vector Table Offset (VTABLE), offset 0xD08 参照)

mww 0xE000ED08 0x20000000

そして
resumeするとPC=0x20000280 ResetHandlerから実行される。

 フラッシュメモリの内容をシリアルにダンプするプログラムを書いてみた。

Welcome to LM4F120XL LaunchPad dump program !!
 F : dump Flash area
 R : dump RAM area
 H : Help

 address  +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
0000:0000 00 10 00 20 4D 33 00 00 BB 2A 00 00 8F 11 00 00 ... M3...*......
0000:0010 07 27 00 00 07 27 00 00 07 27 00 00 00 00 00 00 .'...'...'......
0000:0020 00 00 00 00 00 00 00 00 00 00 00 00 07 27 00 00 .............'..
0000:0030 07 27 00 00 00 00 00 00 07 27 00 00 81 27 00 00 .'.......'...'..
0000:0040 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:0050 07 27 00 00 BD 16 00 00 07 27 00 00 07 27 00 00 .'.......'...'..
0000:0060 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:0070 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:0080 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:0090 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:00A0 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:00B0 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:00C0 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:00D0 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:00E0 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..
0000:00F0 07 27 00 00 07 27 00 00 07 27 00 00 07 27 00 00 .'...'...'...'..

もう少し大きなプログラムを書いてみよう。

2012年8月 4日 (土)

JTAGkey Clone

以前作ったJTAGkey そっくりさん
Jtagkeyclone
秋月のAE-FT2232(FT2232変換モジュール):下
とレベル変換IC(SN74LVC125:左上、SN74AVC4T245)を使ったもの

回路図は、ねむいさんJTAGkeyClone(FT2232系JTAG I/F)製作のすすめを参考にしている。
異なる点は

  1. 部品の変更
    手持ちの部品の関係で
    SN74LVC2G125、SN74LVC1G125→SN74LVC125
    SN74LVC2T45→SN74AVC4T45
    を使ったので5Vは使えない
  2. 3.3V出力
    FT2232の3.3V出力をターゲットに供給できるようにSWを付けた
  3. シリアル
    シリアルの端子も出しておいた
  4. EEPROM省略
    EEPROM(93LC64)を省略したのでコンフィグで対応する

これとOpenOCDを使ってIFのおまけARMボードにアクセスする記事はこちら

2012年7月30日 (月)

バウンダリスキャンでRAMを読む

 若い人たちに、バウンダリスキャンでRAMを読む解説をすることがあるのだが、説明が悪いのか聞いてる人たちはあまりピンときてないようなので、LCMXO2280C-B-EVN+UrJTAGを使ってデモ環境を作ってみた。

「NORFlashやSRAMは、NANDFlashと違ってアドレスを入力してOE,CEをLにすればデータが出てくるので簡単に読める。」
という説明をしたいのである。

  • アドレス、OE、CE制御→データ出力
  • バウンダリスキャンでアドレス、OE、CE出力可能
  • バウンダリスキャンでデータ入力可能

簡単でしょ! というわけだ。
ベテランの人にこの話をしたら、
「そもそも、NORFlashやSRAMのアクセス方法を知らない人には、イメージできないのでは?」
という意見をもらった。
ならばと、アドレス、データに接続したスイッチをパチパチやって、データのアクセスが簡単っていうことが体験できるように、アドレス用8bit、データ用8bitのDipSWとOE、WEのスイッチを載せてみた。
Memtestboard

アドレス、データ入力スイッチはトグル・スイッチを使いたいところだけれど、安さに負けてDIPスイッチにした。

こんな↓回路にしてみた。

Memtestboard

バウンダリスキャンでRAMにアクセスしなければならないので、RAM(HM628256:256Kx8 SRAM)の端子、SWは個別にCPLDに入力し、バッファを経由してSWとRAMを接続している。

ここからが本題 バウンダリスキャンでRAMを読む
UrJTAGでFlashにアクセスするためにはBUSを定義するのが簡単である。デバイスがCPUであればすでに定義されていて、

jtag> help initbus
Usage: initbus BUSNAME
Initialize new bus driver for active part.

BUSNAME       Name of the bus

List of available buses:
au1500     AU1500 BUS Driver via BSR
avr32      Atmel AVR32 multi-mode bus driver, requires <mode> parameter
           valid <mode> parameters:
               x8:   8 bit bus for the uncached HSB area, via OCD registers
               x16:  16 bit bus for the uncached HSB area, via OCD registers
               x32:  32 bit bus for the uncached HSB area, via OCD registers
               OCD : 32 bit bus for the OCD registers
               HSBC: 32 bit bus for the cached HSB area, via SAB
               HSBU: 32 bit bus for the uncached HSB area, via SAB
                               (
                                )
prototype  Configurable prototype bus driver via BSR, requires parameters:
           amsb=<addr> alsb=<addr> dmsb=<data> dlsb=<data>
           ncs=<cs#>|cs=<cs> noe=<oe#>|oe=<oe> nwe=<we#>|we=<we>
      [amode=auto|x8|x16|x32]                                (                                 )

で一覧が表示される。
このデモ環境ではCPLDを使用しているので、prototypeバスを使って自分でBUSを定義する必要がある。

jtag> initbus prototype amsb=A14 alsb=A0 dmsb=D7 dlsb=D0 ncs=nCS noe=nOE nwe=nWE amode=x8

のように指定すると、信号名D7、D6、D5、D3、D2、D1、D0を自動的に探してくれる。同様に信号名A14からA0を自動的に探してくれるので隣り合ったピンに配置していなくてもよい。
問題はA14~A0、D7~D0のように、プレフィックス'A'や'D'が同じで、サフィックス'14'~'0'が連続していなければならないことである。
LCMO2280では信号名はPT2D、PT2Cのような名づけ規則なので

jtag> initbus prototype amsb=PT2C alsb=PT6C ・・・・

のように指定してもうまく探してくれない。

エイリアス機能があって、PT2C→A14、PT6C→A0のエイリアスを指定してやればよさそうだ。エイリアス機能 saliasのヘルプを表示させると

jtag> help salias
Usage: signal ALIAS SIGNAL
Define new signal ALIAS as alias for existing SIGNAL.

ALIAS         New signal alias name
SIGNAL        Existing signal name

signalコマンドのヘルプが表示される。
aliasコマンドではなくてsignalコマンドを使えと言うことかと、signalでnOEを指定し、nOEに’0’を出力してみた。

jtag> signal nOE PT7A
jtag> print signals
Signals:
nOE PT7A
PL2A    input=PL2A      output=PL2A
         (
         省略
          )
jtag> set signal nOE out 0
signal 'nOE' cannot be set as output

ところが、nOEは出力に設定できないとおっしゃる。
ユーザマニュアルには saliasコマンドがちゃんと記載されているので、saliasコマンドでやってみると、

jtag> salias nOE PT7A
jtag> set signal nOE out 0

ちゃんと指定できるではないか。
ということで、SRAMの全ピンのエイリアスを設定するスクリプトを書いて実行すると、A14~A0、D7~D0、nCE、nOE、nWEが使えるようになった。

メモリ・アドレス0000hのデータを読むには、

  1. 外部テストモードに設定
  2. BSRのA14~A0にアドレス(0000h)、nCE、nOEに'0、nWEに'1'をセット
  3. BSR出力
  4. BSR入力
  5. データ表示

jtag> instruction EXTEST
jtag> shift ir
jtag> set signal A14 out 0 
jtag> set signal A13 out 0
jtag> set signal A12 out 0
           (
            )
jtag> set signal A2 out 0
jtag> set signal A1 out 0
jtag> set signal A0 out 0
jtag> set signal nCE out 0
jtag> set signal nOE out 0
jtag> set signal nWE out 1

jtag> shift dr
jtag> shfit dr
jtag> get signal D7
D7 = 1
jtag> get signal D6
D6 = 1
         (
          )
jtag> get signal D1
D1 = 1
jtag> get signal D0
D0 = 0

メモリ・アドレス0000hにデータA5hを書くには、

  1. 外部テストモードに設定
  2. BSRのA14~A0にアドレス(0000h)、D7~D0にデータ(A5h)、nCE、nOWに'0、nOEに'1'をセット
  3. BSR出力
  4. BSRのnOEに'1'をセット
  5. BSR出力
jtag> instruction EXTEST
jtag> shift ir
jtag> set signal A14 out 0 
jtag> set signal A13 out 0
jtag> set signal A12 out 0
           (
            )
jtag> set signal A2 out 0
jtag> set signal A1 out 0
jtag> set signal A0 out 0


jtag> set signal D7 out 1
jtag> set signal D6 out 0
jtag> set signal D5 out 1
jtag> set signal D4 out 0
jtag> set signal D3 out 0
jtag> set signal D2 out 1
jtag> set signal D1 out 0
jtag> set signal D0 out 1

jtag> set signal nCE out 0
jtag> set signal nOE out 1
jtag> set signal nWE out 0

jtag> shift dr

jtag> set signal nWE out 1
jtag> shfit dr

 基本的にはこれで読み書きできるのだが、この操作をアドレスを変えて何回も繰り返すのは大変だ。
ということでこれらの操作を自動的に行うメモリアクセス系のコマンド、peek、poke、writemem、readmemがある。

 アドレス0000hにA5hを書いて、それを読みだすには peek、pokeを使うととっても簡単である。

jtag> script D:\Users\Yoshi\Documents\JTAG\alias.txt 
Please use the 'include' command instead of 'script'
jtag> initbus prototype amsb=A14 alsb=A0 dmsb=D7 dlsb=D0 ncs=nCE
   nwe=nWE noe=nOE amode=x8
jtag> poke 0x0000 0xA5
jtag> peek 0x0000
bus_read(0x00000000) = 0xA5 (165)

めでたし、めでたし。
( 修正2012/8/26: nitbus→initbus)

 最も大きな問題は、このデモでNORFlash、SRAMはバウンダリスキャンで簡単に読めるということが分かってもらえるどうかなのだが


「自分の常識他人の非常識」にはいつも気を付けているつもりなのだが、見事にハマってしまった。

2012年7月15日 (日)

OpenOCD ST-Link + STM32LVDiscovery

STM32vlDiscoveryのRAMで動くプログラムをEcripseで作ってOpenOCD-STLinkでデバッグするときのメモ


  1. 概要
    STM32vlDiscoveryは開発環境(IDE)として

    ● Atollic, TrueSTUDIO® (including the free LiteTrueSTUDIO®)
    ● IAR, Embedded Workbench® for ARM
    ● Keil, MDK-ARMTM

    が使える

     評価ボードや雑誌のオマケ基板をで遊んでいると開発環境が増えてくるのだが、大抵はLチカが動くと2度と使わない。ということで既にインストールしてあるEclipse+gcc+OpenOCD-STLinkでやってみることにした。
    更に、ちょっとしたプログラムをいちいちFlashに書くのは面倒なのでRAMで動くプログラムを作ることにする。

  2. Eclipse+CDT
     EclipseのインストールはNetを探すと見つかる。CDTもインストールしておく。
    ZylinCDT(組み込み用CDT)もインストールする。
    Eclipseの[ヘルプ]→[新規ソフトウェアのインストール]→[追加]で

    名前(N): Zylin embeddedCDT
    ロケーション(L): http://opensource.zylin.com/zylincdt
    Eclipsezylincdt_2



    を追加すると、中ほどのリストボックスに Zylin embeddedCDT が表示されるのでこれをインストールする。

  3. サンプルソース
     サンプルはSTのSTM32VLDiscoveryのページの[Design Support]タブにSTM32VLDISCOVERY firmware package (AN3268)が公開されている。
     このサンプルはARM-based 32-bit MCU STM32F10xxx standard peripheral libraryが使用されていている。ソースは参考になるのだが、このサンプルではRAMに収まらない。
  4. ここのサンプルはSTのライブラリを使っていないのでRAMに収まる。ヘッダファイルはSTM32F10x standard peripheral librayのものを使う。

  5. スタートアップルーチン
     スタートアップルーチンはSTM32VLDISCOVERY firmware packageを展開してできる、

    ~\an3268\stm32vldiscovery_package\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO\startup_stm32f10x_ld_vl.s
    の拡張子を"S"(大文字)にして使う。

  6. リンカスクリプト
     RAMで動作させるためのリンカスクリプトはSTM32VLDISCOVERY firmware packageを展開してできる、
    ~an3268\stm32vldiscovery_package\Project\Master Workspace\TrueSTUDIO\stm32_flash.ld 
    の「>FLASH」を「>RAM」に編集して使う。
    (スタートアップルーチンで.dataセグメントをROMからRAMへのコピーが不要になるのだが、ここは手抜きということで ^^;)

  7. コンパイル
    Lesson1
    のソースをコンパイルしてみた。
    Lchika_src

  8. デバッグ
    デバッグの構成で左ペインの Zylin embedded debuger(C++アプリは不可)を選択し、コマンドタブに以下のコマンドを入力する。
    Lchika_dbg
    target remote localhost:3333
    monitor reset halt
    thbreak main
    mon mww 0xE000ED08 0x20000000
    set $sp=0x20002000
    set $pc=Reset_Handler
    info reg
    mon reg
    load
    c
    

    gdbのコマンドの意味は

    target remote localhost:3333 #OopenOCDのgdbポート
    monitor reset halt #CPUをリセットして停止する
    thbreak main #main() にブレークポイント設定
    mon mww 0xE000ED08 0x20000000 #割り込みベクタをRAMの先頭に設定
    set $sp=0x20002000 #スタックポインタをRAMの末尾に設定
    set $pc=Reset_Handler #プログラムカウンタをReset_Hanlerに設定
    info reg #レジスタ表示
    #mon reg #こちらの方が詳しい      
    load #バイナリをRAMにロードする
    c #実行

    OpenOCDを起動しておくとソースレベルデバッグが可能になる。
    (メニューバーの[実行]→[外部ツール]→[外部ツールの構成]でOpenOCDを起動するように設定しておくと外部ツールアイコンで起動できる)
    Lchika_off

  9. 実行
    実行するとこんな感じ
    Mvi_5837thm←リンク先に動画

    プログラムで点滅しているのは右上の青LED


そのうちもっと丁寧に書こう

2012年7月 7日 (土)

OpenOCD ST-Link

買ってあったSTM32 Value line discoveryをOpenOCDで使ってみる。
Stm32vldiscovery

 STM32VLDiscoveryにはST-Link(左側)とターゲットCPU(右側)としてSTM32F100RBT6B(ARM Cortex-M3)が搭載されている。 まっとうな使い方はネットにたくさん解説がある。 例えばエレキジャック

ST-LinkはSTmicroのSTM8、STM32プロセッサ用のIn-Circuit-Debuger・プログラマでSTM32(ARM)ではSWD/JTAGが使用される。
SWD(Serial Wire Debugg)はクロックとデータ(双方向)の2本の信号を利用して、ARMのJTAGデバッグ機能とテスト機能とシステム メモリへのリアルタイム アクセス機能を実行するインタフェースである。

 これまでARMのデバッグはJTAGkeyそっくりさん(FT2232)+OpenOCDでやっていたのだが、OpenOCDがST-Linkに対応したらしく、このボードだけでOpenOCDで遊べそうだ。

OpenOCDを作る
 ねむいさんのぶぐを参考にST-Link対応OpenOCDを作る。
ねむいさん、Simonguianさんありがとうございます。偉大な先達に感謝。

STM32VLDiscoveryのドライバを入れ替える
 STM32VLDiscoveryはマスストレージとして認識されているので、OpenOCDから操作できるようにドライバをlibusbに変える。
jujurouさんの電子工作マスターへの歩みを参考にする。偉大な先達に感謝。

OpenOCDを起動する
 ビルドしたOpenOCDのtcl/boardディレクトリにあるSTM32LVDiscovery用のコンフィグを使ってopenocd.exeを実行する。
Stm32vldiscovery1
openocdが起動したら、Telnetでlocalhost:4444に接続すると使える。

 内蔵フラッシュ(0x0800 0000)を読んだところ。
Stm32vldiscovery_mdw

まずは、内蔵RAMで動くテストプログラムを作ってみよう。


STM32vlDiscoveryのRAMで動くプログラムをEcripseで作ってOpenOCD-STLinkでデバッグするときのメモ (OpenOCD ST-Link + STM32LVDiscovery)

2012年6月16日 (土)

urJTAG(2)

  urJTAGでバウンダリスキャンしてみる(2)

urJTAGを使ってLCMXO2280 breakout bordをバウンダリスキャンする。
urJTAGの設定はここを参照。

  1. IDレジスタを読む
    jtag> instruction IDCODE
    jtag> shift ir
    jtag> shift dr
    jtag> dr
    00000001001010001101000001000011
    jtag> idcode
    Reading 0 bytes if idcode
    Read 01000011 11010000 00101000 00000001 00000000 00000000 00000000 00000000
    jtag>
    

    jtag> instruction IDCODE ← インストラクションを指定:IDCODE
    jtag> shift ir ← インストラクションレジスタにセット
    jtag> shift dr ← バウンダリスキャンレジスタをシフト
    jtag> dr ← 
    バウンダリスキャンレジスタを表示

     データを読む場合の操作は、インストラクションを指定→インストラクションレジスタ(IR)をシフト→バウダリスキャンレジスタ(BSR)をシフト→BSRを表示
     データを書く場合の操作は、インストラクションを指定→IRをシフト→BSRに値をセット→BSRをシフト
    である。 
  2. ピンの状態を読み取る
     ピンの状態を読み取る場合には、SAMPLE/PRELOADコマンドを使用する。
    jtag> instruction SAMPLE/PRELOAD
    jtag> shift ir
    jtag> shift dr
    jtag> dr
    11111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111000101100100010001111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111
    11111111111111111111111111111111111111111111111111111111111111111111111111111111
    1111111111111111111111111111111111111111111111111111011111111111
    jtag>
    

    太字の部分がLEDが繋がっているポートである。
    良く見るとLEDは8個しかないのにデータが多い。
    回路図を見ると、 8個のLEDは、CPLDのピンPB14D,PB15A,PB15B,PB15D,PB16A,PB16B,PB16C,PB16Dに接続されていることが分かる。
    Lcmxo2280_led

     これらのピンの素性はBSDLに記述されている。
    ---lcmxo2280c_cabga256.bsm---
    attribute BOUNDARY_REGISTER of LCMXO2280C_XXB256 : entity is
      :
    "413 (BC_7, PB16D, bidir, X, 412, 1, Z), " &
    "412 (BC_2, *, control, 1), " &
      :
    
    PB16DはBSRの413番目のレジスタに接続されている双方向のポートであって、方向の制御はBSRの412番目のレジスタで行うことを示している。 つまり、入出力を行う際には、この2つのレジスタに値をセットする必要があるということである。
    ピンの制御を行う際にいちいち2ビット制御するのは面倒なのでsetコマンドを使う。
    PB16Dに"0"を出力したい場合には set signal PB16D out 1 のように指定する。 このLEDは"0"を出力すると点灯、"1"を出力すると消灯なので点灯させてみる。

    jtag> instruction EXTEST
    jtag> shift ir
    jtag> set siglan PB16D out 0
    jtag> shift dr
    

    EXTESTは指定したビット列を出力する命令である。
    set signalコマンドでPB16Dに"0"を出力する設定にして、BSRをシフトすることでビット列がピンに出力される。 
    Lcmxo2280_led7_on
  1. まとめて処理
    1ピンずつ手動で制御するのも面倒だし間違えることがあるので、決まった手順はスクリプトを作って自動的に制御させる。
    ---led1.txt---
    set signal PB14D out 1
    set signal PB15A out 1
    set signal PB15B out 1
    set signal PB15D out 1
    set signal PB16A out 1
    set signal PB16B out 1
    set signal PB16C out 1
    set signal PB16D out 1
    shift dr
    
    set signal PB14D out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB15A out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB15B out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB15D out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB16A out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB16B out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB16C out 0
    shift dr
    usleep 50000
    usleep 50000
    set signal PB16D out 0
    ---led1.txt---
    
    このようなファイルを作って
    jtag> cable ft2232
    Connected to libftd2xx driver.
    jtag> detect
    IR length: 8
    Chain length: 1
    Device Id: 00000001001010001101000001000011 (0x000000000128D043)
      Manufacturer: Lattice Semiconductors
      Part(0):         LCMXO2280-caBGA256
      Stepping:     0
      Filename:     c:\program files\urjtag\data/lattice/lcmxo2280c-cabga256/lcmxo2280c-cabga256
    jtag> instruction EXTEST
    jtag> script led1.txt
    jtag>
    

    LEDが1秒間隔で順に点灯する。
    Ledbar3_3
    ダウンロード LEDbar3.mp4 (975.6K)

2012年6月13日 (水)

urJTAG(1)

urJTAGでバウンダリスキャンしてみる
LCMXO2280とFT2232Hが載っているLCMXO2280 break out board(LCMXO228-BB-ENV)を買ってみた。
Lcmxo2280_bb_env

LCMXO2280C-B-ENVをurJTAGでバウンダリスキャンするまでのメモ

  1. ダウンロード
    urJTAGのページ
    から最新版をダウンロードしてインストール
  2. 実行
    インストールディレクトリのjtag.exeを実行すると、メッセージが表示された後に、プロンプト( jtag> ) が表示され、コマンドが入力できるようになる。
    helpコマンドで使えるコマンドが表示される。また、"help コマンド"でコマンドの詳細が表示される
    UrJTAG 0.10 #1502
    Copyright (C) 2002, 2003 ETC s.r.o.
    Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors
    
    UrJTAG is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    There is absolutely no warranty for UrJTAG.
    
    WARNING: UrJTAG may damage your hardware!
    Type "quit" to exit, "help" for help.
    
    jtag> help
    Command list:
    
    quit          exit and terminate this session
    help          display this help
    frequency     setup JTAG frequency
    cable         select JTAG cable
    reset         reset JTAG chain
    discovery     discovery of unknown parts in the JTAG chain
    idcode        Read IDCODEs of all parts in a JTAG chain
    detect        detect parts on the JTAG chain
    signal        define new signal for a part
    scan          read BSR and show changes since last scan
    salias        define an alias for a signal
    bit           define new BSR bit
    register      define new data register for a part
    initbus       initialize bus driver for active part
    print         display JTAG chain list/status
    part          change active part for current JTAG chain
    bus           change active bus
    instruction   change active instruction for a part or declare new instruction
    shift         shift data/instruction registers through JTAG chain
    dr            display active data register for a part
    get           get external signal value
    test          test external signal value
    shell         shell cmmd
    set           set external signal value
    endian        set/print endianess
    peek          read a single word
    poke          write a single word
    pod           Set state of POD signal(s)
    readmem       read content of the memory and write it to file
    writemem      write content of file to the memory
    detectflash   detect parameters of flash chips attached to a part
    flashmem      burn flash memory with data from a file
    eraseflash    erase flash memory by number of blocks
    script        run command sequence from external file
    include       include command sequence from external repository
    addpart       manually adds parts on the JTAG chain
    usleep        Sleep some number of microseconds
    svf           execute svf commands from file
    bsdl          manage BSDL files
    debug         debug jtag program
    
    Type "help COMMAND" for details about a particular command.
    jtag> 

  3. ケーブルの選択
    urjtag>help cableで使用できるケーブルのリストが表示される。
    このボードにはFT2232Hが載っているのでFT2232(Generic FTDI FT2232 Cable)を使う。urjtag>cable ft2232 helpでFT2232ドライバのパラメータが表示される。
    jtag> help cable
    Usage: cable DRIVER [DRIVER_OPTS]
    Select JTAG cable type.
    
    DRIVER      name of cable
    DRIVER_OPTS options for the selected cable
    
    Type "cable DRIVER help" for info about options for cable DRIVER.
    
    List of supported cables:
    ARCOM         Arcom JTAG Cable
    ByteBlaster   Altera ByteBlaster/ByteBlaster II/ByteBlasterMV Parallel Port Down
    load Cable
    UsbBlaster    Altera USB-Blaster Cable
    FT2232        Generic FTDI FT2232 Cable
    JTAGkey       Amontec JTAGkey (FT2232) Cable
    ARM-USB-OCD   Olimex ARM-USB-OCD[-TINY] (FT2232) Cable
    gnICE         Analog Devices Blackfin gnICE (FT2232) Cable (EXPERIMENTAL)
    OOCDLink-s    OOCDLink-s (FT2232) Cable (EXPERIMENTAL)
    Signalyzer    Xverve DT-USB-ST Signalyzer Tool (FT2232) Cable (EXPERIMENTAL)
    Turtelizer2   Turtelizer 2 Rev. B (FT2232) Cable (EXPERIMENTAL)
    USB-to-JTAG-IF USB to JTAG Interface (FT2232) Cable (EXPERIMENTAL)
    Flyswatter    TinCanTools Flyswatter (FT2232) Cable
    usbScarab2    KrisTech usbScarabeus2 (FT2232) Cable
    DLC5          Xilinx DLC5 JTAG Parallel Cable III
    EA253         ETC EA253 JTAG Cable
    EI012         ETC EI012 JTAG Cable
    IGLOO         Excelpoint IGLOO JTAG Cable
    KeithKoep     Keith & Koep JTAG cable
    Lattice       Lattice Parallel Port JTAG Cable
    MPCBDM        Mpcbdm JTAG cable
    TRITON        Ka-Ro TRITON Starterkit II (PXA255/250) JTAG Cable
    WIGGLER       Macraigor Wiggler JTAG Cable
    WIGGLER2      Modified (with CPU Reset) WIGGLER JTAG Cable
    xpc_int       Xilinx Platform Cable USB internal chain
    xpc_ext       Xilinx Platform Cable USB external chain
    jlink         Segger/IAR J-Link, Atmel SAM-ICE and others.
    
    jtag> cable ft2232 help Usage: cable FT2232 [vid=VID] [pid=PID] [desc=DESC] [driver=DRIVER] VID        vendor ID (hex), defaults to 0000 PID        product ID (hex), defaults to 0000 DESC       Some string to match in description or serial no. DRIVER     usbconn driver, either ftdi-mpsse or ftd2xx-mpsse            defaults to ftd2xx-mpsse if not specified
    jtag> cable ft2232 Connected to libftd2xx driver.
    jtag>
    FTDIのFT2232を使ったケーブルはたいてい使えるようだ。他にAlteraのUSB-Blasterにも対応している。
     
  4. デバイスの識別
    IDCODEを表示させて、デバイスを自動識別させる(jtag> detect)が識別されない。
    jtag> cable ft2232
    Connected to libftd2xx driver.
    jtag> idcode
    Reading 0 bytes if idcode
    Read 01000011 11010000 00101000 00000001 00000000 00000000 00000000 00000000
    jtag> detect
    IR length: 8
    Chain length: 1
    Device Id: 00000001001010001101000001000011 (0x000000000128D043)
      Manufacturer: Lattice Semiconductors
      Unknown part!
    chain.c(149) Part 0 without active instruction
    chain.c(200) Part 0 without active instruction
    chain.c(149) Part 0 without active instruction
    jtag>
    

    DeviceIDは取得できているが、urJTAGにはデフォルトでLCMXO2280Cが登録されていないので、Unknown part!となる。
    自動機別させるためにはjrJTAGにLCMXO2280を登録する必要がある。
     
  5. デバイスの登録
    LCM2280C-B-ENVに使用されているチップは ftBGA256なので、以下のcaBGAはftBGAに読み替えること。(2012/7/19)

     LatticeのサポートページからLCMXO2280C caGBA256のBSDLファイル(lcmxo2280c_cabga256.bsm)をダウンロードする。
    lcmxo2280_cabga256.bsmをエディタで開いて”IDCODE_REGISTER”を探すと、detectコマンドで表示されたDeviceIDがCompany code, Device specific number, Version numberに分かれていることが分かる。この情報を元に識別用の情報をurJTAGに登録する。
     
    ---lcmxo2280c_cabga256.bsm---
        :
    --IDCODE and USERCODE register definition
        attribute IDCODE_REGISTER of LCMXO2280C_XXB256 : entity is
            "0000" &    --Version number
            "0001001010001101" &    --Device specific number
            "000001000011";    --Company code

        :

    Company Codeは、~\urJTAG\data\MANUFACTURERSに既に登録されている。LCMXO2280C-caBGA256の登録方法は次のとおり
    1. ~\urJTAG\data\lattice\PARTSの編集
      PARTSの最終行にlcmxo2280c-cabga256とDevice specific number を登録する。
      ---PARTS---
      0001001010001101  lcmxo2280c-cabga256   LCMXO2280-caBGA256
       
    2. ~\urJTAG\data\lattice\lcmxo2280c-cabga256ディレクトリの作成
      ~\urJTAG\data\lattice\lcmxo2280c-cabga256ディレクトリを作って、その中にSTEPPINGSとlcmxo2280c-cabga256を作る。
      STEPPINGSにはVersion numberを記述する。
      ---STEPPING---
      # bits 31-28 of the Device Identification Register
      0000    lcmxo2280c-cabga256    0


      lcmxo2280c-cabga256には内部レジスタとピンの情報を記述する。
       
    3. ~\urJTAG\data\lattice\lcmxo2280c-cabga256\lcmxo2280c-cabga256の作成
      bsdlコマンドを使用すると自動的にbsdlファイルからinstructionコマンド、signalコマンド、bitコマンドを作成してくれる。
      urjtag> bsdl dump lcmxo2280c_cabga256.bsm
                         (dump が抜けていた! 2013/10/2)
      の結果をlcmxo2280c-cabga256にコピペする。urJTAG.exeを起動後プロパティで画面バッファサイズを大きくしておかないとコマンド実行結果が全てコピペできない。

      または、bsdlコマンドを記述したbsdl.txtを作り、lcmxo2280c_cabga256.bsmと同じディレクトリに置いて、
      ---bsdl.txt---
      bsdl dump lcmxo2280c_cabga256.bsm

      c:\hoge> urJTAG\jtag.exe bsdl.txt > lcmxo2280c-cabga256


      で作る。先頭数行のwarnigは削除しておく。
       
  6. 自動識別
    detectコマンドで自動識別させてみる。
    jtag> cable ft2232
    Connected to libftd2xx driver.
    jtag> detect IR length: 8 Chain length: 1 Device Id: 00000001001010001101000001000011 (0x000000000128D043)   Manufacturer: Lattice Semiconductors   Part(0):         LCMXO2280-caBGA256   Stepping:     0   Filename:     c:\program files\urjtag\data/lattice/lcmxo2280c-cabga256/lcmxo2280c-cabga256
    jtag>

このブログので長文&&HTMLレベルの編集をしようとすると大変だ。
その都度修正ということで...


竹本浩さんのページUrJtagを使うを参考にしました。

より以前の記事一覧