JTAG

Begonnen von temp12, 25. Sep 2008, 13:44

« vorheriges - nächstes »
Nach unten

Telekatz

Hallo Famos,

Anbei der Schaltplan zu meinem Programmiergerät.

Ich wollte nicht für jedes Device ein eigenes Programmiergerät bauen, sondern ein Gerät dem ich per Software (im CPLD) die unterschiedlichsten Parallelport/Seriell/FTDI Programmiergeräte beibringen kann. Aktuell geht damit die Betty programmieren/debuggen, Scartadapter und TAE Adapter (MSP) programmieren.

Falls es jemand nachbauen möchte soll er sich melden. Dann such ich den Rest auch noch zusammen und stell ihn hier rein.

Gruß
Telekatz

Astralix

Hallo, ich bin er Neue :)

... gelockt von Chris mit einem Satz Betties.

Habe zuerst mal das mit dem JTAG probiert. Ich nutze openocd zusammen mit einem openocd-usb dongle. Dabei ist mir aufgefallen, dass das hier publizierte Script für openocd etwas veraltet ist, jedenfalls, wenn man openocd 0.4.0 verwendet. Dank Chris habe ich die Init für den LPC2220 fertig. Leider funktioniert das Flashen noch nicht. Das Flash selbst sollte via CFI erkannt werden, ob openocd das flashen direkt, bzw. mit einer Helper-Routine im RAM unterstützt, weiß ich (noch) nicht.

Trotzdem, für die, die mit machen wollen, hier schon mal das Script. Eigentlich müsste es noch gesplittet werden in board/betty.cfg und target/lpc2220.cfg. Naja, bis alles läuft erst einfach mal zusammen.


#
if { [info exists CHIPNAME] } {
   set  _CHIPNAME $CHIPNAME
} else {
   set  _CHIPNAME lpc2220
}

if { [info exists ENDIAN] } {
   set  _ENDIAN $ENDIAN
} else {
   set  _ENDIAN little
}

if { [info exists CPUTAPID ] } {
   set _CPUTAPID $CPUTAPID
} else {
   set _CPUTAPID 0x4f1f0f0f
}

#coonfigure reset options
jtag_nsrst_delay 200
jtag_ntrst_delay 200

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst srst_pulls_trst
#trst_push_pull srst_push_pull

#jtag scan chain
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi

$_TARGETNAME configure -event reset-init {
# setup PLL
# PLLCON: Enable PLL, connect PLL
mww 0xe01fc080 0x03
# VBPDIV: no division
mww 0xe01fc100 0x0
# PLLCFG: 0x42 = psel = 10 (4) = msel= 00010 (3) = 240 mhz Fcco*/
mww 0xe01fc084 0x45
# Activate PLL settings
mww 0xe01fc08c 0xaa
mww 0xe01fc08c 0x55
sleep 20

# Memory Bank Configuration
# BCFG0: 16bit, rble, 6wst - 60 mhz : Betty: FLASH 0 @ 0x80000000
mww 0xffe00000 0x100004A0
# BCFG2: 16bit, rble, 6wst - 60 mhz : Betty: FLASH 1 @ 0x82000000
mww 0xffe00008 0x100004A0

# BCFG1: 8 bit, 3 sram wst, rble, 5 wst 3 idcy : Betty: LCD @ 0x81000000
#mww 0xffe00004 0x00000C42

# GPIO Pin COnfiguration for Flash access
# PINSEL0:
mww 0xe002c000 0x00008005
# PINSEL1:
mww 0xe002c004 0x00000000
# PINSEL2:
mww 0xe002c014 0x0de049d4

# IO2SET: Set Outputs
mww 0xe0028024 0x1FC0000
# IO2DIR: Set Direction
mww 0xe0028028 0x1FC0000

# IO0DIR:
mww 0xe0028008 0x002018D0

# disable watchdog
#mww 0xfffffd44 0x00008000
# enable user reset
#mww 0xfffffd08 0xa5000001
sleep 100

arm7_9 fast_memory_access enable
}

arm7_9 dcc_downloads enable

$_TARGETNAME configure -work-area-phys 0x40000000 -work-area-size 0x4000 -work-area-backup 0

#flash bank <name> <driver> <base_addr> <size> <chip_width> <bus_width> <target_number> [<target_name> <banks> <sectors_per_bank> <pages_per_sector> <page_size> <num_nvmbits> <ext_freq_khz>]
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME cfi 0x80000000 0x00100000 2 2 $_TARGETNAME
flash bank $_FLASHNAME cfi 0x82000000 0x00100000 2 2 $_TARGETNAME


# For more information about the configuration files, take a look at:
# openocd.texi


Gruß, Ulrich

Astralix

Ok, das Script funktioniert noch garnicht...
Naja, es funktioniert, wenn vorher das originale betty im Flash ist. Mit der boop im Flash geht JTAG nicht mehr. Also wird vermutlich die PLL oder das Interface nicht korrekt programmiert.

Ich werde das dann noch korrigieren, sobald ich einen Erfolg habe.

Gruß, Ulrich

Telekatz

Wenn ich die Reset Konfiguration ändere, dann funktioniert das Script bei mir:

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst srst_push_pull
#trst_push_pull srst_push_pull


Und nicht vergessen den Energiesparmodus in Boop auszuschalten!

Gruß
Telekatz

Telekatz

#19
14. Apr 2010, 22:38 Last Edit: 16. Apr 2010, 22:21 by Telekatz
Zitat
Das Flash selbst sollte via CFI erkannt werden, ob openocd das flashen direkt, bzw. mit einer Helper-Routine im RAM unterstützt, weiß ich (noch) nicht.


Es funktioniert,  wenn man openocd anpasst und den Flashbaustein der Betty hinzufügt (siehe Patch im Anhang).

Gruß
Telekatz

Telekatz

So, mit diesem Script funktioniert es jetzt zufriedenstellend:

#
if { [info exists CHIPNAME] } {
   set  _CHIPNAME $CHIPNAME
} else {
   set  _CHIPNAME lpc2220
}

if { [info exists ENDIAN] } {
   set  _ENDIAN $ENDIAN
} else {
   set  _ENDIAN little
}

if { [info exists CPUTAPID ] } {
   set _CPUTAPID $CPUTAPID
} else {
   set _CPUTAPID 0x4f1f0f0f
}

#coonfigure reset options
jtag_nsrst_delay 50
jtag_ntrst_delay 50

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst srst_pulls_trst trst_push_pull srst_push_pull

jtag_khz 1000

#jtag scan chain
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi

# Event handlers
$_TARGETNAME configure -event reset-start {jtag_khz 1000}
$_TARGETNAME configure -event reset-init  {betty_init}

arm7_9 dcc_downloads enable

$_TARGETNAME configure -work-area-phys 0x40000000 -work-area-size 0x10000 -work-area-backup 0

#flash bank <name> <driver> <base_addr> <size> <chip_width> <bus_width> <target_number> [<target_name> <banks> <sectors_per_bank> <pages_per_sector> <page_size> <num_nvmbits> <ext_freq_khz>]
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME cfi 0x80000000 0x00100000 2 2 $_TARGETNAME
flash bank $_FLASHNAME cfi 0x82000000 0x00100000 2 2 $_TARGETNAME

arm7_9 fast_memory_access enable

proc betty_init { } {   

   # setup PLL
   # PLLCON: Enable PLL, connect PLL
   mww 0xe01fc080 0x03
   # VBPDIV: no division
   mww 0xe01fc100 0x02
   # PLLCFG: 0x42 = psel = 10 (4) = msel= 00010 (3) = 240 mhz Fcco*/
   mww 0xe01fc084 0x42
   # Activate PLL settings
   #mww 0xe01fc08c 0xaa
   #mww 0xe01fc08c 0x55
   #sleep 100
   
   # Memory Bank Configuration
   # BCFG0: 16bit, rble, 2wst - 30 mhz : Betty: FLASH 0 @ 0x80000000
   mww 0xffe00000 0x10000420
   # BCFG2: 16bit, rble, 2wst - 30 mhz : Betty: FLASH 1 @ 0x82000000
   mww 0xffe00008 0x10000420

   # BCFG1: 8 bit, 3 sram wst, rble, 5 wst 3 idcy : Betty: LCD @ 0x81000000
   #mww 0xffe00004 0x00000400

   # GPIO Pin COnfiguration for Flash access
   # PINSEL0:
   mww 0xe002c000 0x00008005
   # PINSEL1:
   mww 0xe002c004 0x00000000
   # PINSEL2:
   mww 0xe002c014 0x0de049d4
   
   # IO2SET: Set Outputs
   mww 0xe0028024 0x1FC0000
   # IO2DIR: Set Direction
   mww 0xe0028028 0x1FC0000
   
   # IO0DIR:
   mww 0xe0028008 0x002018D0
   
    # disable watchdog
   #mww 0xfffffd44 0x00008000
   # enable user reset
   #mww 0xfffffd08 0xa5000001
}

proc flash_boop {IMAGE} {
   reset init
   flash erase_sector 0 0 last
   flash write_bank 0 $IMAGE 0
   reset run
}

# For more information about the configuration files, take a look at:
# openocd.texi

Astralix

Hi!

Habs gerade noch nicht testen können und es ist jetzt auch etwas spät. Aber schon mal vielen Dank für die Mithilfe.
Report folgt.

Gruß, Ulrich aka Astralix

Astralix

Hi!

Habe meinen openocd gepatcht, vielen Dank dafür, Telekatz!
Das Script funktioniert leider noch nicht ganz. Habe aber noch keine Zeit gehabt, genauer nach zu sehen.
Wenn die originale Firmware drin ist, funktioniert es. Sobald die boop drin ist, funktioniert es nicht mehr:

>openocd -f interface/openocd-usb.cfg -f target/lpc2220.cfg -c init -c "flash_boop boop_rom.bin"

Open On-Chip Debugger 0.5.0-dev-00101-gcc197c8-dirty (2010-04-21-22:16)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.berlios.de/doc/doxygen/bugs.html
1000 kHz
adapter_nsrst_delay: 50
jtag_ntrst_delay: 50
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_push_pull
1000 kHz
dcc downloads are enabled
fast memory access is enabled
Info : device: 4 "2232C"
Info : deviceID: 67330064
Info : SerialNumber: A
Info : Description: Dual RS232 A
Info : clock speed 1000 kHz
Info : JTAG tap: lpc2220.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
Info : Embedded ICE version 4
Info : lpc2220.cpu: hardware has 2 breakpoint/watchpoint units
1000 kHz
Info : JTAG tap: lpc2220.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.
target state: halted
target halted in ARM state due to debug-request, current mode: Abort
cpsr: 0x40000097 pc: 0x00000038
Info : Flash Manufacturer/Device: 0x007f 0x225b
erased sectors 0 through 18 on flash bank 0 in 4.484375s
wrote 239340 bytes from file boop_rom.bin to flash bank 0 at offset 0x00000000 in 4.296875s (54.395 kb/s)
1000 kHz

Bis hier geht es und nach dem reset run im Script gibt auch den boop-Startbildschirm. Aber der JTAG verliert etwas früh die Verbindung:

Info : TAP lpc2220.cpu does not have IDCODE
Warn : JTAG tap: lpc2220.cpu       UNEXPECTED: 0x00000000 (mfg: 0x000, part: 0x0000, ver: 0x0)
Error: JTAG tap: lpc2220.cpu  expected 1 of 1: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
Warn : Unexpected idcode after end of chain: 1 0x00000000
Warn : Unexpected idcode after end of chain: 33 0x00000000
Warn : Unexpected idcode after end of chain: 65 0x00000000
Warn : Unexpected idcode after end of chain: 97 0x00000000
Warn : Unexpected idcode after end of chain: 129 0x00000000
Warn : Unexpected idcode after end of chain: 161 0x3c3c0000
Warn : Unexpected idcode after end of chain: 193 0x80013c7c
Warn : Unexpected idcode after end of chain: 225 0x8000007f
Warn : Unexpected idcode after end of chain: 257 0x8000007f
Warn : Unexpected idcode after end of chain: 481 0x00001fff
Warn : Unexpected idcode after end of chain: 513 0x00000000
Warn : Unexpected idcode after end of chain: 545 0x00000000
Warn : Unexpected idcode after end of chain: 577 0x00000000
Error: double-check your JTAG setup (interface, speed, missing TAPs, ...)
error: -100
Command handler execution failed


Danach kann der JTAG die betty nicht mehr erreichen:

openocd -f interface/openocd-usb.cfg -f target/lpc2220.cfg -c init

Open On-Chip Debugger 0.5.0-dev-00101-gcc197c8-dirty (2010-04-21-22:16)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.berlios.de/doc/doxygen/bugs.html
1000 kHz
adapter_nsrst_delay: 50
jtag_ntrst_delay: 50
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_push_pull
1000 kHz
dcc downloads are enabled
fast memory access is enabled
Info : device: 4 "2232C"
Info : deviceID: 67330064
Info : SerialNumber: A
Info : Description: Dual RS232 A
Info : clock speed 1000 kHz
Error: JTAG scan chain interrogation failed: all zeroes
Error: Check JTAG interface, timings, target power, etc.
Error: JTAG scan chain interrogation failed: all zeroes
Error: Check JTAG interface, timings, target power, etc.
Command handler execution failed
Warn : jtag initialization failed; try 'jtag init' again.


Das ist dann der Punkt, wo ich dann auch hängen geblieben bin. Die CPU wird noch nicht komplett initialisiert. Irgendwas ist da noch anders, als es sein muss.

Ich bleibe drann...
Gruß, Astralix aka Ulrich

Telekatz

#23
22. Apr 2010, 09:46 Last Edit: 23. Apr 2010, 15:48 by Telekatz
Hallo Astralix,

das ist so schon alles korrekt. Der Hintergrund ist folgender.

Beim LPC2220 wird zusammen mit dem System Reset auch der TAP Controller zurückgesetzt  (deshalb srst_pulls_trst). Dadurch ist es nicht möglich die Programmausführung bereits am Resetvektor zu unterbrechen.

Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.

Bis OpenOCD dann das halt schickt ist Boop bereits mit der Initialisierung fertig und in der Main-Loop bereits in cpu_idle() gesprungen. Dort wird die CPU in den Idle Mode geschickt und der Prozessortakt abgeschaltet. Dadurch läuft der TAP Controller auch nicht mehr und es ist keine Verbindung über JTAG möglich.

Um dennoch eine Verbindung zu erhalten musst du auf der Betty die ANYKEY ;D Taste gedrückt halten:
void cpu_idle ()
{
/* fall through if a key was pressed */
if (ANYKEY)
return;

Dadurch wird cpu_idle() sofort wieder verlassen.

In der neuesten Version von Boop hab ich deshalb ein Flag eingebaut, dass den Idle Mode ausschaltet. Es wird erst dann gelöscht, wenn  der Power Down Modus aktiviert wird. Dies passiert frühestens, wenn die Hintergrundbeleuchtung erlischt. Genug Zeit für OpenOCD sich zu verbinden und das System anzuhalten.

Gruß
Telekatz

Astralix

Hi,

danke für die Info, jetzt ist das klar. Ist mir bei meinen bisherigen ARM Experimenten nicht aufgefallen, weil ich immer Nut/OS als System drunter liegen habe. Dort werden am Anfang erst einmal alle Peripherie initialisiert, Zeit genug für den oocd das System auch in Halt zu schicken.

Nagut, dann kann ich mich ja jetzt an die Integration des LPC2220 ins Nut/OS machen.

Gruß, Ulrich


jannis

Wozu wird denn der PLD benutzt im originalen Aufbau?
Und koennen wir den komplett ueberschreiben oder geht dann irgendwas nicht mehr?

Telekatz

Der PLD auf dem Scart Adapter? Der decodiert den Videotext und teilt die Quarzfrequenz für den LPC runte. Ganz platt machen geht also nicht.

jannis

Aber wenn man da jetzt einfach selbst sonen prescaler mit einprogrammiert koennte man schon auch mit eigenen Sachen ueberschreiben, ja?

Telekatz

Dann vermutlich schon.

gunnar

Hallo Telekatz,


So, mit diesem Script funktioniert es jetzt zufriedenstellend:


ich habe mal mit den eingecheckten Einstellungen versucht (scheinen die gleichen zu sein, wie aus Deinem Post), die Betty per JTAG zu flashen, aber das Flash wird nicht erkannt:


Open On-Chip Debugger 0.4.0 (2011-02-10-22:46)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.berlios.de/doc/doxygen/bugs.html
jtag_nsrst_delay: 50
jtag_ntrst_delay: 50
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_push_pull
1000 kHz
dcc downloads are enabled
fast memory access is enabled
parport port = 0x378
Info : clock speed 500 kHz
Info : JTAG tap: lpc2220.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
Info : Embedded ICE version 4
Info : lpc2220.cpu: hardware has 2 breakpoint/watchpoint units
500 kHz
Info : JTAG tap: lpc2220.cpu tap/device found: 0x4f1f0f0f (mfg: 0x787, part: 0xf1f0, ver: 0x4)
Warn : srst pulls trst - can not reset into halted mode. Issuing halt after reset.
target state: halted
target halted in ARM state due to debug-request, current mode: System
cpsr: 0x6000001f pc: 0x80000604
Info : Flash Manufacturer/Device: 0x007f 0x225b
Error: Could not probe bank: no QRY
Try workaround w/0x555 instead of 0x55 to get QRY.
Error: Could not probe bank: no QRY
Error: auto_probe failed -900

flash bank '0' not found


Hast Du oder jemand anderes es schonmal hinbekommen, die Betty über ein Wiggler Interface geflasht zu bekommen? Prinzipiell sollte das Interface doch egal sein, oder?

Viele Grüße
Gunnar

Nach oben