OCD Commander, Wiggler i ARM7

Mar 19, 2006 19 Replies

Witam!



Znalazłem w swoich zasobach bezprzewodowy router z ADM5106 (a w zasadzie Conexant CX84200, ARM7TDMI z 4 portowym switchem, USB, 2xUSART i parę innych bajerów). O taki jak tu:

formatting link
Krew eksperymentatora zagrała ;) i postanowiłem pogrzebać. Podłączyłem Wigglera, ściągnąłem OCD Commandera. Zanim cokolwiek zmajstruję, chciałbym ściągnąć to, co tkwi we FLASH-u (16MB zewnętrznego FLASH-a ma i 2MB SDRAM na pokładzie). No i patrzę w tego OCD Commandera i nie widzę nigdzie polecenia do ściągania programu z FLASH do pliku. W drugą stronę jest.



Pytanie: czy coś przeoczyłem, czy mam użyć innego narzędzia (jeśli tak, to jakiego)?



Pozdrawiam Marcin Stanisz


Heh bo widzisz sprawa jest o tyle skomplikowanana ze zeby sciagnac cokolwiek z flasha musisz napisac program ktory zaladujesz do ramu i uruchomisz z poziomu OCD . Chetnie pomoge pisz na priv

Zaraz, zaraz ... Dlaczego od razu na priv ? :-)

Piszcie na grupe. Chetnie poczytam.

Dnia Sun, 19 Mar 2006 20:59:19 +0100, ::WiReFree:: napisał(a):

Bu. To w takim razie jeszcze trochę potrwa, bo jestem w połowie manuala do ARM7TDMI ;)

Dzięki! Może znasz w sieci jakieś miejsce z przykładowym kodem? ARMBOOT?

Pozdrawiam Marcin Stanisz

formatting link

boot loader uboot i eldk z kroskompilatorami a z tym zgraniem zawartosci flasha to moze byc powazna sprawa za pomoca OCD nie da sie raczej tego zrobic ale mozesz napisac aplikacje ktora OCD wgra do RAM'u i uruchomi a ta aplikacja odczyta zawartosc flash'a i wysle np po tftp

:)

Dnia Mon, 20 Mar 2006 11:14:25 +0100, ::WiReFree:: napisał(a):

Dziękuję, obejrzę. Widzę, że szedłem w dobrym kierunku, a armboot został spaczowany dla mojego procka.

RS232 wystarczy :)

Pozdrawiam Marcin Stanisz

Witam, W open OCD (odpowiednik OCD Commandera tyle ze open source'owy) jest opcja "dump_binary <file> <address> <size>" Nigdy tego co prawda nie probowalem, bo zawsze wgrywalem program do procka, ale wyglada na to, ze tym sposobem mozna zgrac zawartosc pamieci do pliku. Nie wiem jednak jak jest gdy pamiec jest zabezpieczona przed odczytem, itp...

Dnia Mon, 20 Mar 2006 16:39:40 +0100, Jack Houseman napisał(a):

Nawet się pod Cygwinem skompilował, coś ściągnął, to coś zaczyna się nawet sensownie od jakby inicjalizacji wektorów:

Disassembly of section .data:

00000000 <.data>: 0: e59ff018 ldr pc, [pc, #24] ; 0x20 4: e59ff018 ldr pc, [pc, #24] ; 0x24 8: e59ff018 ldr pc, [pc, #24] ; 0x28 c: e59ff018 ldr pc, [pc, #24] ; 0x2c 10: e59ff018 ldr pc, [pc, #24] ; 0x30 14: e59ff018 ldr pc, [pc, #24] ; 0x34 18: e59ff018 ldr pc, [pc, #24] ; 0x38 1c: e59ff018 ldr pc, [pc, #24] ; 0x3c 20: 00001000 andeq r1, r0, r0 :)

Na razie jednak po wgraniu do RAM i próbie odpalenia (resume) od adresu

0x20 czy 0x24 nie chce działać (pewnie to nie takie proste, jeśli program się np. przepisuje do RAM-u na wstępie, to początek mogę tylko zgadywać).

Dziękuję i pozdrawiam Marcin Stanisz

Marcin Stanisz napisał(a):

[...]

Poczytaj listę instrukcji ARMa albo nawet jakiś samouczek to się nieco rozjaśni. Otóż instrukcja umieszczona pod adresem 0, wykonywana po resecie, nakazuje załadowanie do PC wartości 32-bitowej spod adresu (PC+24) czyli spod 0x20 (co zasugerował poprawnie disasembler). Czyli wykona się skok do 0x1000 i tam musi leżeć dalszy program.

Dnia Tue, 21 Mar 2006 08:22:17 +0100, Adam Dybkowski napisał(a):

Dzięki, Adam :)

Czytam równolegle to opasłe tomisko pt. ARM Architecture Manual, ale dobrze się przy nim zasypia ;)

Co mnie jeszcze zaniepokoiło w ściągniętym obrazie to to, że nie widać w nim żadnych tekstów (a na porcie szeregowym wypisuje ich niemało, ma też serwer WWW wbudowany). Pewnie obraz jest spakowany... W pierwszym poście się rypnąłem z wielkościami pamięci: w słowach ma 512K FLASH-a i 2M SDRAM.

Pozdrawiam Marcin Stanisz

Jak sie zacznie zabawe z ARM'ami to ilosc informacji jakie nalezy przeczytac zaczyna przyrastac w tempie wykladniczym :-) I wszystko "a must have".

Dnia Mon, 20 Mar 2006 16:39:40 +0100, Jack Houseman napisał(a):

A nie masz problemów z zapisem do RAM? U mnie RAM zaczyna się pod adresem

0x20000000. Próba odczytu i zapisu komórki wygląda tak:
0x20000000: e10f1000

error: access caused data abort, system possibly corrupted

I oczywiście nie zmienia wartości... Jak wygląda twój plik konfiguracyjny do OpenOCD (ja mam standardowy do Wigglera)? Dokumentacja jest w powijakach, ale zanim zapytam autora wolę spytać was, czy nie robię jakiejś głupoty :)

Pozdrawiam Marcin Stanisz

Jesli o mnie chodzi, to nie uzywalem dotad komend bezposredniego zapisu/odczytu z pamieci. Zawsze korzystalem z OOCD tylko do debugowania, z czego najchetniej to opcja z programem wgrywanym do flasha (najstabilniej sie zachowuje - przy opcji RAM GDB potrafilo mi sie wykrzaczac). Przy LPC wrzutka programu do flasha z linii polecen (za pomoca bootloadera) trwa kilka sekund (dla malych programow), wiec nie odczuwam potrzeby koniecznego wrzucania programu przez jtaga. Zwlaszcza, ze on jest wciaz w wersji rozwojowej i o ile blad w debugowaniu grozi mi najwyzej utrata lacznosci z targetem, to np. przy wgrywaniu flasha mogloby sie to skonczyc np. skasowaniem boot loadera. Moja konfiguracja tez jest standardowa dla Wigglera. Jednak samo wgrywanie programu do RAM'u musi jakos dzialac, bo robilem kilka prob z uruchamianiem programow w RAM'ie i dzialaly :-)

Tak wiec chyba bedziesz musial spytac autora, ktory zreszta jest dosc chetny do pomocy :-)

Dnia Sun, 19 Mar 2006 19:51:32 +0100, Marcin Stanisz napisał(a): <ciach>

Mały updejt poświąteczny - udało się:

  1. Uruchomić wgrywanie do RAM za pomocą OpenOCD,
  2. Znaleźć binarną wersję armtool dla Win i też udaje że działa ;)
  3. Skompilować bez błędów armboota.

Nie udało się:

  1. Armtool pokazuje IDCODE na zmianę 00000000 lub FFFFFFFF, więc jakiś problem jest,
  2. Armboot skompilowany GNUARM (gcc w wersji 4.0.2) nie działa po wgraniu do routera :(

Pozdrawiam Marcin Stanisz

Marcin Stanisz napisał(a):

Ściągnij źródła armtool i skompiluj pod cygwin'em. Po odpowiednim dopasowaniu kabelka do standardu armtool'a (a jeszcze lepiej zmianie źródeł pod schemat kabelka) powinno zadziałać. Musisz oczywiście przyznać też prawa do pisania po portach I/O wpisując magiczną komendę:

ioperm -i

Dnia Tue, 18 Apr 2006 22:26:15 +0200, Adam Dybkowski napisał(a):

Próbowałem, ale na razie bez powodzenia. Na razie Open OCD sprawuje się dobrze. Dzięki za zwrócenie uwagi na konfigurację kabelka - przyjąłem, że to będzie wiggler i już.

Się wie :)

Kolejny sukces: udało mi się napisać prościutki program w asm, który wysyła znaki przez UART :) (Oczywiście UART mi wcześniej firmware zainicjowało, a ja tylko znaki do bufora pcham.) Chyba blog założę ;) Szkoda, że nie można się ulubionemu zajęciu przez sen oddawać, byłoby przyjemne z pożytecznym...

Dobranoc Marcin Stanisz

Marcin Stanisz napisał(a):

A dokładniej? Nie kompiluje się czy nie działa armtool?

Obejrzyj źródła FreeRTOS - jest tam port na 7TDMI i dużo może się z tego przydać. Obsługa przerwań, wyjątków, cały system wieloprocesowy itp.

Dnia Wed, 19 Apr 2006 22:22:22 +0200, Adam Dybkowski napisał(a):

Ściągnąłem źródła z Midori, próbowałem skompilować, posypało błędami (zależności od libjtag, brak Makefile w katalogu nadrzędnym (!!), parę innych), więc na szybko dałem sobie spokój i poszukałem wersji skompilowanej. Teraz znalazłem stronę

formatting link
i tam jest krok po kroku napisane, jak skompilować armtool. Popróbujem.

Jasne. Moim celem było sprawdzenie, czy Open OCD w ogóle coś zapisuje do RAM, czy tylko udaje (ponieważ armboot się nie uruchamiał).

Ten "program" do wysyłania znaków przez UART jest tak duży, że przytoczę go w całości dla potomności (proszę nie komentować oczywistych niedorzeczności w postaci skoku do main, było późno :)):

.text .align 2 .global _start _start: bal main main: ldr r1,=0x90000000 ;@ adres rejestru UDR ldr r2,=0x21 @;wyslij ! str r2, [r1] loop: ldr r4,=100000

1: nop subs r4, r4, #1 bne 1b

ldr r1,=0x90000000 ldr r2,=0x22 @;wyslij " str r2, [r1]

ldr r4,=100000

1: nop subs r4, r4, #1 bne 1b

ldr r1,=0x90000000 ldr r2,=0x23 @;wyslij # str r2, [r1]

bal loop

.align 2

.bss

Marcin Stanisz

Dnia Mon, 17 Apr 2006 21:16:00 +0200, Marcin Stanisz napisał(a):

He, he (na razie próbka uruchomiona z RAM-u, pomija wszystkie inicjalizacje i ma źle skonfigurowany FLASH; problemem była w założeniu funkcja kopiująca Armboota z FLASH do RAM - nadpisywał sam siebie):

ARMboot 1.1.1 (Apr 17 2006 - 23:07:36)

ARMboot code: 00000000 -> 000135c0 DRAM Configuration: Bank #0: 00000000 8 MB Flash: 2 MB

*** Using default environment Hit any key to stop autoboot: 25 cx84200 # help go - start application at address 'addr' run - run commands in an environment variable bootm - boot application image from memory bootd - boot default, i.e., run 'bootcmd' loads - load S-Record file over serial line saves - save S-Record file over serial line loadb - load binary file over serial line (kermit mode) autoscr - run script from memory md - memory display mm - memory modify (auto-incrementing) nm - memory modify (constant address) mw - memory write (fill) cp - memory copy cmp - memory compare crc32 - checksum calculation base - print or set address offset printenv- print environment variables setenv - set environment variables saveenv - save environment variables to persistent storage protect - enable or disable FLASH write protection erase - erase FLASH memory flinfo - print FLASH memory information bdinfo - print Board Info structure iminfo - print header information for application image loop - infinite loop on address range mtest - simple RAM test reset - Perform RESET of the CPU echo - echo args to console fsload - load binary file from a filesystem image fsinfo - print information about filesystems ls - list files in a directory (default /) sleep - delay execution for some time version - print monitor version help - print online help ? - alias for 'help' cx84200 #

Pozdrawiam Marcin Stanisz

Dnia Wed, 19 Apr 2006 22:22:22 +0200, Adam Dybkowski napisał(a):

No więc tak. Działam pod cygwinem. Nie ma on dwóch plików nagłówkowych, wymaganych przez pp_dev.c z pakietu libjtag (linux/ppdev.h i linux/ioctl.h). Drugi z nich jest w sys, pierwszy ściągnąłem z Internetu.

Dało to tyle, że podczas kompilacji o ppdev.h już się nie upomina, ale krzyczy parse error przy każdym wywołaniu ioctl().

Szukanie na razie dało tyle:

  1. Cygwin nie obsługuje parport,
  2. Są tacy, którzy skompilowali armtool "so wie so",
  3. Ale ja nie wiem jak :)

Dałem sobie spokój :) I tak moją największą obawą jest uszkodzenie bootloadera we flashu - zastosowanej kości flash nie zaprogramuję inaczej.

Pozdrawiam Marcin Stanisz

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required