logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[OMAP5912][ARM9] brak możliwości zapisu do pamięci flash

IjeSJot 15 Mar 2020 11:12 651 10
REKLAMA
  • #1 18532065
    IjeSJot
    Poziom 27  
    Posty: 1170
    Pomógł: 84
    Ocena: 40
    Witajcie,

    Niestety na wskutek popełnionego błędu, skasowałem bootloader w pamięci flash. Urządzenie wykorzystuje procesor OMAP5912 oraz pamięć Spansion S29GL128S. Udało mi się pomyślnie podłączyć interfejsem JTAG (Jlink) do procesora, jestem w stanie odczytać różne obszary pamięci, jednak zapis nie jest skuteczny ponieważ procesor ignoruje te zapisy. Próby zapisu podejmowałem na różne sposoby, zarówno poprzez OpenOCD jak i przez oprogramowanie Jlink, niestety bezskutecznie. OpenOCD ustawia OMAP-a w tryb supervisor ale mimo to, zapis nie jest możliwy. Macie może jakiś pomysł, co mogę robić źle? Oczywiście, jeśli będą potrzebne dodatkowe dane czy też zrzuty ekranu to służę pomocą.

    Pozdrawiam, Kamil.
  • REKLAMA
  • #2 18532297
    _lazor_
    VIP Zasłużony dla elektroda
    Posty: 3795
    Pomógł: 259
    Ocena: 1132
    A do ramu możesz co kolwiek zapisać? Jeśli nie to w sumie nie mam pojęcia jak taki układ uruchomić, może wpiąć się do kości flash i tam wgrywać już swój program pomijając bootloadera lub gdzieś zdobyć bootloader i go z powrotem wrzucić.
  • #3 18532336
    IjeSJot
    Poziom 27  
    Posty: 1170
    Pomógł: 84
    Ocena: 40
    Do ramu nie sprawdzałem. Ale dostęp do flasha jest możliwy po zainicjowaniu procesora poprzez konfigurację rejestrów, chociażby EMIFS. Z tym niestety mam problem. Mogę bez problemu odczytać dowolny adres w pamięci, więc zakładam że RAM też. Niestety zapis nie powoduje żadnych zmian. A do zapisania jest niewiele ponieważ mam wyczyszczony obszar od 0 do 1FF, więc na upartego mogę wpisać ręcznie brakujące komórki, gdyby tylko zapis był możliwy.
  • REKLAMA
  • #4 18532363
    _lazor_
    VIP Zasłużony dla elektroda
    Posty: 3795
    Pomógł: 259
    Ocena: 1132
    Do flasha nigdy się nie pisze do pojedyńczej "komórki" OpenOCD i inne programatory muszą wrzucić "write algoritm" do ramu a potem poprzez niego zapisują stronę flasha.
  • #5 18532424
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Do flash nie zapisujesz przez komendy mww/mwh/mwb, tylko albo trzeba użyć funkcji np. "flash write_image ..." / "program ..." (wymaga to odpowiednio skonfigurowanego pliku opisującego Twoją płytkę dla OpenOCD), albo musisz się bawić ręcznie tak jakbyś chciał zrobić taki zapis bezpośrednio przez rejestry procesora (czyli żeby zapisać jeden bajt to musisz np. skonfigurować kontroler pamięci, włączyć tryb programowania, ustawić adres, ustawić bit odpowiadający za zapis, wpisać gdzieś nową wartość, ustawić bit rozpoczynający zapis, poczekać na bit który oznacza zakończenie zapisu itd. itd. itd. - to oczywiście przykład).
  • #6 18532511
    IjeSJot
    Poziom 27  
    Posty: 1170
    Pomógł: 84
    Ocena: 40
    Ok, dzięki za odpowiedzi. Przy uruchamianiu openocd, wskazuję interfejs którego zamierzam użyć: -f interface/jlink.cfg, potem wskazuję -f board/osk5912.cfg (który jest najbliżej tego co potrzebuję), jednak zmodyfikowałem go w ten sposób, że wskazałem tylko jeden bank pamięci, oraz wielkość:

    source [find target/omap5912.cfg]
    
    # NOTE: this assumes you're using the ARM 20-pin ("Multi-ICE")
    # JTAG connector, and accordingly have J1 connecting pins 1 & 2.
    # The TI-14 pin needs "trst_only", and J1 connecting 2 & 3.
    reset_config trst_and_srst separate
    
    # NOTE:  boards with XOMAP parts wire nSRST to nPWRON_RESET.
    # That resets everything -- including JTAG and EmbeddedICE.
    # So they must use "reset_config srst_pulls_trst".
    
    # NOTE:  an expansion board could add a trace connector ... if
    # it does, change this appropriately.  And reset_config too,
    # assuming JTAG_DIS reroutes JTAG to that connector.
    etm config $_TARGETNAME 8 demultiplexed full dummy
    etm_dummy config $_TARGETNAME
    
    # standard boards populate two 16 MB chips, but manufacturing
    # options or an expansion board could change this config.
    flash bank osk.u1 cfi 0x02000000 0x01000000 2 2 $_TARGETNAME
    #flash bank osk.u2 cfi 0x01000000 0x01000000 2 2 $_TARGETNAME
    
    proc osk5912_init {} {
    	omap5912_reset
    
    	# detect flash
    	flash probe 0
    
    }
    $_TARGETNAME configure -event reset-init { osk5912_init }
    
    arm7_9 dcc_downloads enable


    Czy coś jeszcze muszę ustawiać? Może jakaś modyfikacja resetu? Czy muszę przeanalizować schemat urządzenia?
  • REKLAMA
  • #7 18532518
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    "flash bank osk.u1 cfi 0x02000000 0x01000000 2 2 $_TARGETNAME"
    To włącza flash typu "CFI", więc jakby się uprzeć, to może typowa pamięć flash w ten sposób też zadziała, pod warunkiem że reszta parametrów jest OK (szczegóły do znalezienia w dokumentacji OpenOCD).

    W każdym razie do zapisu flash służą komendy o których wspomniałem wcześniej, czyli "flash write_image" lub "program ...".
  • REKLAMA
  • #8 18532531
    IjeSJot
    Poziom 27  
    Posty: 1170
    Pomógł: 84
    Ocena: 40
    Do procka jest dołączony NOR flash i jego przestrzeń adresowa jest włączona w obszar całej mapy procka. W moim przypadku, flash zaczyna się od 0x0200000. Czy może być konieczność dopisania konfiguracji EMIFS do pliku omap5912.cfg? Wygląda on tak:

    # TI OMAP5912 dual core processor
    # http://focus.ti.com/docs/prod/folders/print/omap5912.html
    
    if { [info exists CHIPNAME] } {
       set _CHIPNAME $CHIPNAME
    } else {
       set _CHIPNAME omap5912
    }
    
    if { [info exists CPUTAPID] } {
       set _CPUTAPID $CPUTAPID
    } else {
       # NOTE: validated with XOMAP5912 part
       set _CPUTAPID 0x0692602f
    }
    
    adapter srst delay 100
    
    # NOTE: presumes irlen 38 is the C55x DSP, matching BSDL for
    # its standalone siblings (like TMS320VC5502) of the same era
    
    #jtag scan chain
    jtag newtap $_CHIPNAME dsp -irlen 38 -expected-id 0x03df1d81
    jtag newtap $_CHIPNAME arm -irlen 4 -expected-id $_CPUTAPID
    jtag newtap $_CHIPNAME unknown -irlen 8
    
    set _TARGETNAME $_CHIPNAME.arm
    target create $_TARGETNAME arm926ejs -chain-position $_TARGETNAME
    
    proc omap5912_reset {} {
    	#
    	# halt target
    	#
    	poll
    	sleep 1
    	halt
    	wait_halt
    	#
    	# disable wdt
    	#
    	mww 0xfffec808 0x000000f5
    	mww 0xfffec808 0x000000a0
    
    	mww 0xfffeb048 0x0000aaaa
    	sleep 500
    	mww 0xfffeb048 0x00005555
    	sleep 500
    }
    
    # omap5912 lcd frame buffer as working area
    $_TARGETNAME configure -work-area-phys 0x20000000 \
    	-work-area-size 0x3e800 -work-area-backup 0
  • #9 18532661
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    IjeSJot napisał:
    Czy może być konieczność dopisania konfiguracji EMIFS do pliku omap5912.cfg?

    Musisz sprawdzić. A najlepiej byłoby znaleźć plik konfiguracyjny z pamięcią podobną do Twojej. Albo po prostu zerknięcie W KOŃCU (; do dokumentacji OpenOCD.
  • #10 18533118
    IjeSJot
    Poziom 27  
    Posty: 1170
    Pomógł: 84
    Ocena: 40
    Dokumentację trochę poczytałem, ale z ARM-em mam pierwszy raz doczynienia. Tak czy inaczej, jest mały postęp. Zmniejszyłem częstotliwość pracy JTAG do 5kHz, i w tej chwili próba programowania wygląda tak:
    > program boot.hex                                                                                                      
    JTAG tap: omap5912.dsp tap/device found: 0x03ef1d81 (mfg: 0x6c0 (<unknown>), part: 0x3ef1, ver: 0x0)                    
    JTAG tap: omap5912.dsp       UNEXPECTED: 0x03ef1d81 (mfg: 0x6c0 (<unknown>), part: 0x3ef1, ver: 0x0)                    
    JTAG tap: omap5912.dsp  expected 1 of 1: 0x03df1d81 (mfg: 0x6c0 (<unknown>), part: 0x3df1, ver: 0x0)                    
    JTAG tap: omap5912.arm tap/device found: 0x0692602f (mfg: 0x017 (Texas Instruments), part: 0x6926, ver: 0x0)            
    TAP omap5912.unknown does not have IDCODE                                                                               
    Trying to use configured scan chain anyway...                                                                           
    Bypassing JTAG setup events due to errors                                                                               
    target halted in ARM state due to debug-request, current mode: Supervisor                                               
    cpsr: 0x000000d3 pc: 0x00002360                                                                                         
    MMU: disabled, D-Cache: disabled, I-Cache: disabled                                                                     
    target halted in ARM state due to debug-request, current mode: Supervisor                                               
    cpsr: 0x000000d3 pc: 0x00002360                                                                                         
    MMU: disabled, D-Cache: disabled, I-Cache: disabled                                                                    
    Flash Manufacturer/Device: 0x0000 0xffff                                                                                
    Could not probe bank: no QRY                                                                                            
    Try workaround w/0x555 instead of 0x55 to get QRY.                                                                      
    Could not probe bank: no QRY                                                                                            
    Error executing event reset-init on target omap5912.arm:                                                                
    embedded:startup.tcl:214: Error:                                                                                      
    in procedure 'program'                                                                                                  
    in procedure 'ocd_process_reset'                                                                                        
    in procedure 'ocd_process_reset_inner' called at file "embedded:startup.tcl", line 214                                  
    NOTE! Severe performance degradation without fast memory access enabled. Type 'help fast'.                              
    ** Programming Started **                                                                                               
    Flash Manufacturer/Device: 0x0000 0xffff                                                                                
    Could not probe bank: no QRY                                                                                            
    Try workaround w/0x555 instead of 0x55 to get QRY.                                                                      
    Could not probe bank: no QRY                                                                                            
    auto_probe failed                                                                                                       
    embedded:startup.tcl:449: Error: ** Programming Failed **                                                               
    in procedure 'program'                                                                                                  
    in procedure 'program_error' called at file "embedded:startup.tcl", line 508                                            
    at file "embedded:startup.tcl", line 449


    I teraz pytanie, czy w .cfg muszę jeszcze coś dopisać odnośnie pamięci (czyli ID producenta i pamięci). Lub ewentualnie czy jeszcze muszę dokonfigurować rejestry np. EMIFS? Niestety w internecie prawie nic nie ma na ten temat.
  • #11 18534143
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Zacznij od zmiany tap ID z 0x03df1d81 na 0x03ef1d81. Na resztę pytań niestety Ci nie odpowiem, chyba że coś znajdziesz w dokumentacji - może zamiast flasha CFI powinieneś wybrać coś innego, ale tego też nie wiem.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik napotkał problem z zapisem do pamięci flash w urządzeniu opartym na procesorze OMAP5912 po usunięciu bootloadera. Mimo udanego połączenia przez JTAG (Jlink) i możliwości odczytu pamięci, zapisy są ignorowane. Uczestnicy dyskusji sugerują, że zapis do pamięci flash wymaga użycia odpowiednich algorytmów zapisu, a nie bezpośrednich komend. Wskazują na konieczność skonfigurowania kontrolera pamięci oraz użycia komend takich jak "flash write_image" lub "program". Użytkownik rozważa również modyfikację pliku konfiguracyjnego OpenOCD oraz zmniejszenie częstotliwości JTAG, co przyniosło pewne postępy. Wskazano na potrzebę zmiany identyfikatora TAP oraz sprawdzenia dokumentacji OpenOCD w celu uzyskania dalszych wskazówek.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA