Tlaciaren Samsung ML-2525 - firmware

Počítače stolní, notebooky, tablety, tiskárny, scanery a vše, co nějak souvisí s PC

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#16 Příspěvek od rnbw »

Tak dakujem za pomoc, uz asi ostavaju len nejake pokusy so subormi. Skusim firmware pre ine tlaciarne s rovnakym CPU a pripadne ich menit, co na to bootloader povie.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#17 Příspěvek od Andrea »

Ono to má 45+12 bytů hlavičku a navíc je to big-endian ARM.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#18 Příspěvek od rnbw »

Zistil som, ze to asi nebude len ID typu tlaciarne, ale pravdepodobne nejako suvisi aj s verziou firmwaru. Ale stale neviem, odkial to pochadza.

ML2520_V1.01.00.84.fls: 000F69A4
FIX_NU_0000-0000000000_ML2525_V1.01.00.85.hd: 000F69A5
ML2520_V1.01.00.86.fls: 000F69A5

FIX_NU_0000-0000000000_ML1660_V1.01.00.34.hd: 000F9082
FIX_0000-0000000000_ML1660_V1.01.00.35.hd: 000F9083

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#19 Příspěvek od Andrea »

To já také nevím, i když už teď ten disassembling dává smysl, je to 6MB instrukcí vzniklých překladem z Cčka, takže chuťovka a navíc pro ARM. :-?

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#20 Příspěvek od rnbw »

Tak to je fakt chutovka... Este skusim nejake experimenty, napr. odpojit niektory adresny pin SDRAM, ci potom nahodou boot loader neusudi, ze je obsah flash poskodeny. Inak SDRAM som pre istotu skusal aj vymenit, ale ziadna zmena, tak som vratil naspat povodnu.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#21 Příspěvek od Andrea »

Tak jsem se v tom ještě chvíli vrtala. Zjistila jsem, že ten vlastní kernel (začíná na 0x1C00C a je dlouhý 0x41FEC) je šifrovaný pomocí nějakých dvou tabulek (proto v něm není čitelný žádný text). Flashovací program nejdříve testuje checksum toho nového image načteného z PC, ten zjevně sedí. Pak dešifruje do paměti jak ten nový, tak ten starý kernel a získá z nich jakási čísla, to jsou ta dvě čísla v [[[ ]]]. První je ze starého kernelu a druhé z nového. V algoritmu získání těch dvou čísel jsem se bohužel ztratila. :( Jen vím, že pokud vyjde to číslo záporné, hodí to chybu. A číslo patřící ke starému kernelu je záporné a tak to hodí "Image is invalid".

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#22 Příspěvek od rnbw »

Porovnal som subory ML2520_V1.01.00.84.fls a ML2520_V1.01.00.86.fls, ktore maju rozdielne ID.

Prvy rozdiel je az na offsete 0x1c053, hned za zaciatkom nejakeho bloku (ked odrezem zo suboru hlavicku 45+12B, zacina tento blok presne na 0x1c000). Tento blok je cely zmeneny a je zjavne komprimovany (dalsia kompresia ho nezmensi). Ale nepasuje to na inflate, to by malo zacinat bajtom 0x78 :(

Okrem tohoto bloku je zmena uz len na uplnom konci suboru, kde je priadny datum a posledne dva bajty, ktore su pravdepodobne checksum.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#23 Příspěvek od Andrea »

rnbw píše:zacina tento blok presne na 0x1c000
No to je ten vlastní kernel se svojí hlavičkou, první 4B je $NKF, další 4B je jakási adresa, se kterou se pak operuje v tom divném algoritmu a třetí 4B jsou délka kernelu.

Jinak ten datum na konci je také důležitý, pokud je starší než datum uvedený ve flashovacím programu (tady 2008-04-02), tak vypíše chybu Can't Update Old Rom.

Edit: Co se do toho zkusit nabourat přes ten JTAG například pomocí OpenOCD? Tím by šla nejspíš přečíst a přepsat i ta flashka. ARM940T by měl umět.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#24 Příspěvek od rnbw »

Tak k tomu hlaseniu som sa este nedostal, to uz by bol pokrok :)

JTAG by som mohol vyskusat, aj tak som sa chcel naucit s tym robit. Postavim adapter na paralelny port a skusim, co to urobi.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#25 Příspěvek od rnbw »

Urobil som jednoduchy kabel len s odpormi - vid priloha (FET som vynechal pretoze CPU nema signal SRST). Zapojil som to podla jedineho dostupneho zapojenia pinov pre Jupiter4E (vid priloha 2).

Prvy pokus neuspesny:

Kód: Vybrat vše

$ 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 wiggler help
Usage: cable WIGGLER parallel PORTADDR [TDO,TRST,TDI,TCK,TMS,SRESET]
   or: cable WIGGLER ppdev PPDEV [TDO,TRST,TDI,TCK,TMS,SRESET]

PORTADDR   parallel port address (e.g. 0x378)
PPDEV      ppdev device (e.g. /dev/parport0)
TDO, ...   parallel port bit number, prepend '#' for inversion
           default is '7,4,3,2,1,#0'

jtag> cable wiggler ppdev /dev/parport0
Initializing ppdev port /dev/parport0
jtag> detect
Warning: TDO seems to be stuck at 0
jtag> detect
Warning: TDO seems to be stuck at 0
jtag> print
Run "detect" first.
jtag> quit
Zistil som, ze signal nTRST je uzemneny cez R1 (33R), tak som ho odstranil. Teraz to asi funguje, len treba pouzit iny program (?):

Kód: Vybrat vše

$ 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 wiggler ppdev /dev/parport0
Initializing ppdev port /dev/parport0
jtag> detect
IR length: 4
Chain length: 1
Device Id: 0 (0x0000000000000000)
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> print
 No. Manufacturer              Part                 Stepping Instruction          Register
------------------------------------------------------------------------------------------------------------------
   0                                                         (none)               (none)
jtag> quit
Přílohy
jupiter4e.png
(82.91 KiB) Staženo 51 x
jtag_wiggler_unbuf.png
(19.41 KiB) Staženo 62 x

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#26 Příspěvek od rnbw »

Tak skutocne to zije. OpenOCD som skompiloval najnovsi. Prvy pokus:

Kód: Vybrat vše

# ./openocd -f ../tcl/interface/parport.cfg
Open On-Chip Debugger 0.6.1 (2013-03-14-20:43)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Warn : Adapter driver 'parport' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
parport port = 0x378
adapter speed: 1 kHz
Info : clock speed 1 kHz
Warn : There are no enabled taps.  AUTO PROBING MIGHT NOT WORK!!
Warn : AUTO auto0.tap - use "jtag newtap auto0 tap -expected-id 0x10940f0f ..."
Warn : AUTO auto0.tap - use "... -irlen 4"
Warn : gdb services need one or more targets defined
Info : accepting 'telnet' connection from 4444

Kód: Vybrat vše

$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> scan_chain
   TapName             Enabled  IdCode     Expected   IrLen IrCap IrMask
-- ------------------- -------- ---------- ---------- ----- ----- ------
 0 auto0.tap              Y     0x10940f0f 0x10940f0f     4 0x01  0x03
Podla ID som nasiel na webe nejaky konfigurak, tak som ho upravil:

Kód: Vybrat vše

if { [info exists CHIPNAME] } {
  set  _CHIPNAME $CHIPNAME
} else {
  set  _CHIPNAME arm
}
if { [info exists ENDIAN] } {
  set  _ENDIAN $ENDIAN
} else {
  set  _ENDIAN little
}
if { [info exists CPUTAPID ] } {
  set _CPUTAPID $CPUTAPID
} else {
 # force an error till we get a good number
  #set _CPUTAPID 0xffffffff
  set _CPUTAPID 0x10940f0f
}

jtag newtap arm taptap  -irlen 4 -ircapture 0x1 -irmask 0xf
target create arm arm9tdmi -endian big -variant arm940t  -chain-position  0

reset_config trst_and_srst srst_pulls_trst

init
halt

poll off

#source scripts.cf
#dc
poll

#ic

armv4_5 reg
A uz to vyzera lepsie:

Kód: Vybrat vše

# ./openocd -f ../tcl/interface/parport.cfg -f test.cfg
Open On-Chip Debugger 0.6.1 (2013-03-14-20:43)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.sourceforge.net/doc/doxygen/bugs.html
Warn : Adapter driver 'parport' did not declare which transports it allows; assuming legacy JTAG-only
Info : only one transport option; autoselect 'jtag'
parport port = 0x378
adapter speed: 1 kHz
Warn : Specify TAP 'arm.taptap' by name, not number 0
trst_and_srst srst_pulls_trst srst_gates_jtag trst_push_pull srst_open_drain
Info : clock speed 1 kHz
Info : JTAG tap: arm.taptap tap/device found: 0x10940f0f (mfg: 0x787, part: 0x0940, ver: 0x1)
Warn : JTAG tap: arm.taptap       UNEXPECTED: 0x10940f0f (mfg: 0x787, part: 0x0940, ver: 0x1)
Error: Trying to use configured scan chain anyway...
Warn : Bypassing JTAG setup events due to errors
Info : Embedded ICE version 2
Info : arm: hardware has 2 breakpoint/watchpoint units
background polling: off
TAP: arm.taptap (enabled)
target state: halted
target halted in ARM state due to breakpoint, current mode: Undefined instruction
cpsr: 0x4000001b pc: 0xffffffe8
DEPRECATED! use 'arm reg' not 'armv4_5 reg'
System and User mode registers
      r0: e8bd87f0       r1: e1a01004       r2: e3a00000       r3: ebfffc02
      r4: e3590000       r5: 0a000001       r6: e2650000       r7: e8bd87f0
      r8: e1a00005       r9: e8bd87f0      r10: e8bd87f0      r11: 00000000
     r12: 00000000   sp_usr: bc733a57   lr_usr: f31be6b3       pc: ffffffe8
    cpsr: 4000001b

FIQ mode shadow registers
  r8_fiq: 8253c6cf   r9_fiq: d9cb4385  r10_fiq: d37bbf72  r11_fiq: 96cf8a74
 r12_fiq: b0331b05   sp_fiq: 02000914   lr_fiq: db7b3335 spsr_fiq: 000000b9

Supervisor mode shadow registers
  sp_svc: 0200162c   lr_svc: 02602840 spsr_svc: 10000011

Abort mode shadow registers
  sp_abt: 02001114   lr_abt: 7ecf2fa7 spsr_abt: 00000010

IRQ mode shadow registers
  sp_irq: 02000d14   lr_irq: 7bb35be6 spsr_irq: 300000bd

Undefined instruction mode shadow registers
  sp_und: 00000000   lr_und: 00000000 spsr_und: 80000031
Info : accepting 'telnet' connection from 4444

Kód: Vybrat vše

$ telnet localhost 4444
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> mdw 0
0x00000000: e59ff060
> mdw 1000
0x000003e8: eafffff8
> dump_image dump.bin 0 524288
Flash zacina od adresy 0, takze sa to teraz nacitava (ide to hrozne pomaly).

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#27 Příspěvek od Andrea »

No vidíš, za chvíli budeš mít spraveno. :)
Jinak na adresách 0x260FBA4 a 0x260FCA4 jsou ty dvě šifrovací tabulky. První má 256 bytů a druhá 64.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#28 Příspěvek od rnbw »

Este sa obavam, ze nebudem vediet zapisovat do flash. Ale uvidim, zatial sa to stale nacitava - mam len takmer 128 KB, takze to necham cez noc.

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#29 Příspěvek od rnbw »

Tak dump mam - pri porovnani s ML2520_V1.01.00.84.fls (bez hlavicky) je zmeneny len 1 byte na offsete 0x341bb. Vo flash je 0x2c a v subore 0x6c. Este ho skusim raz precitat, ci je to tam naozaj alebo ci to bola chyba pri prenose.

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#30 Příspěvek od Andrea »

Zrychli si toho wigglera, 1kHz je strašně málo.

Odpovědět

Zpět na „Výpočetní technika“