Dlink DSL-2500U/BRU/D H/W Ver. : D1

Есть ли жизнь у этого модема после убитого флеша или дорога только в сервис центр ???

Виновник торжества. Итак посмотрим на него поближе ( если вам что-то плохо видно, то здесь все фотки кликабельны =) ) ...
 
Компоненты модема :

SoC ( System On Chip ) : ADSL2+ with CPU MIPS32 : BroadCom ( BCM6332KFBG ) - 240Mhz
RAM () - 8 Мб
Serial flash ( Spansion S25FL016AIF ) - 2 Мб 

Идентификация модема :

Board Id : 96332CG

CPU revision is: 0x00029010

> cat /proc/cpuinfo 

system type             : 96332CG
cpu model               : BCM6338 V1.0

> cat /proc/meminfo
MemTotal:         6108 kB
MemFree:           544 kB


Прежде всего хочу поблагодарить всех людей и ресурсы, что мне помогли : 

McMCC : за схему адаптера для консольного шнурка ( через который цепляется модем к COM порту PC ) - http://mcmcc.bat.ru/dlinkt/
Michael V. Pudeev : за идею как оживить - http://pudeev.livejournal.com/35872.html
Martin Rehak ( rayer ) : за программатор SPIPGM - http://rayer.ic.cz/programm/spipgm.zip http://rayer.ic.cz/elektro/spipgm.htm
deadarcher : за опыт по работе с SPIPGM программатором - http://www.lan23.ru/forum/showthread.php?t=2133
????? : человечка, который подогнал мне FullFlash от DSL-2500U/BRU/D, иначе бы пришлось искать донора что бы сделать дамп.
sanyokk : Feedback по статье и настройки LPT.

Спасибо вам !!!

Если у вас есть что-то дополнить, или вы хотите что-то спросить обсуждаем тут

Наверно всем читающим понятно, что все действия вы производите на свой страх что-то убить окончательно ! По этому если вы в чём-то не
уверены, то вам дорога в сервис центр. Данный способ не даёт 100% гарантии восстановления модема ! Мне известно 4 случая успешного восстановления
модемов включая мой !

Востановление проверено в ОС : Win XP SP2,SP3. Файлы которые нам понадобятся, для оживления. Далее по тексту на них так же будут ссылки.

SPIPGM программатор - берём тут или там
Полный дамп ( он же FullFlash ) флешки S25FL016AIF берём - тут ( md5 хеш сумма : 65101800ffe01ec82987bb95d3c8583f )

[ 1 ] Предыстория.
      
Случилось так, что человек запутавшись залил в этот модем прошивку от 2500U. Модем её молча схавал, даже не поперхнувшись, после чего сдох.
Как позже удалось выяснить это была так называемая factory прошивка в имене которой содержатся вот такая подстрока wo_sign.
Пример с ftp.dlink.ru RU_DSL-2500U_306040Z00_factory.zip RU_DSL-2500U_306040Z00_cfe_fs_kernel_wo_sign дело в том, что если загружается
такая прошивка, то проверка версий ( установленной в модеме и загружаемой ) игнорируется.

В итоге модем перестал отзываться по WEB-у или Telnet-у. На нём горели только индикаторы Power, и при подключенном
Ethernet кабеле LAN. ADSL не загорался даже если была подключена телефонная линия.

Ну так, что мы хотели ! При перепрошивки происходит так же перезапись загрузчика CFE ( Common Firmware Enviroument ) и его конфигурационных
значений cfe-v. Т.е. если пропал свет во время прошивки, то есть шанс запороть модем, т.к. загрузчик будёт мёртв.  В модемах которые
реализованы на TI AR7 платформе ( загрузчики ADAM2 PSBL ) такой проблемы нет, т.к. он не обновляется во время прошивки.

Есть только один вариант понять что же с модемом. Для этого необходимо спаять консольный шнурок для этого модема и посмотреть, а есть
хоть что-то у на консоле.

[ 2 ] Собираем консольный шнурок.

Консольный шнурок в этом модеме цепляется к разъёму JP2, распиновка его начиная с первого контакта
( кстате на печатных платах этот контакт имеет форму квадратика, но иногда и обычный кружок )  TxD, NC, 3.3v, GND, RxD

Сам разьём у меня не был распаян, по этому пришлось закупиться однорядной 40-ка пиновой штыревой панелькой. Для изготовления
разъёма необходимо отломать от неё 5 пинов и впаять на место где он должен быть. Китайцы экономят на всём =)

Консольный шнурок собирал на MAX3232CPE ( ~ 80р ), хотя вроде можно и на MAX232CPE ( ~ 25р ) Ниже приведена его схема на MAX3232CPE.
 
Для подключение к консоле я использовал PuTTY 0.60. Важным параметром при коннекте указать скорость работы COM порта 115200, все
остальные параметры порта можно оставить без изменений ! Была замечена такая особенность, если модем не реагирует на ввод с клавиатуры
можно попробовать установить в PuTTY пораметр Flow Control в значение none. Хотя это какой-то глюк походу, т.к. после рестарта модема
работает и с пораметрами по умолчанию =)

Если этого не сделать, то вместо вразумительных данных на терминал будет сыпаться мусор. Из-за ошибки в выборе скорости, я подумал что
MAX232CPE у меня не исправна и купил MAX3232CPE.
После того как выставил правильную скорость работы COM порта 115200 , всё стало отображаться корректно. На консоле были такие сообщения
CFE version 1.0.37-6.5.17 for BCM96338 (32bit,SP,BE)
Copyright (C) 2000-2005 Broadcom Corporation.

Boot Address 0xbfc00000

Initializing Arena.
Initializing Devices.
Serial flash device: name S25FL016A, id 0x0114, size 2048KB
Get Ether Mac Info Failed, use internal as default !
Unknown PHY type
CPU type 0x29010: 240MHz
Total memory: 8388608 bytes (8MB)

Total memory used by CFE:  0x80401000 - 0x805285E0 (1209824)
Initialized Data:          0x8041D990 - 0x8041FBF0 (8800)
BSS Area:                  0x8041FBF0 - 0x804265E0 (27120)
Local Heap:                0x804265E0 - 0x805265E0 (1048576)
Stack Area:                0x805265E0 - 0x805285E0 (8192)
Text (code) segment:       0x80401000 - 0x8041D988 (117128)
Boot area (physical):      0x00529000 - 0x00569000
Relocation Factor:         I:00000000 - D:00000000

*** Board is not initialized properly ***

Press:   to use current value
        '-' to go previous parameter
        '.' to clear the current value
        'x' to exit this command
Board Id Name (0-15)
96338SV          -------  0
96338L-2M-8M     -------  1
96338W           -------  2
96338E4          -------  3
R4P              -------  4
R                -------  5
R4P-4M-16M       -------  6
R-4M-16M         -------  7
R4P_SE560        -------  8
R2P-4M-16M       -------  9
D-1P             ------- 10
D-1P-16M         ------- 11
D-4P             ------- 12
D-4P-16M         ------- 13
R4P_68           ------- 14
R4P_68_16M       ------- 15       :

Видно, что CFE жив, но параметры cfe-v не инициализированы. По этому модем не знает как грузиться. Да и сам CFE то от 2500U. Попробовал
завести его так

R4P_68_16M       ------- 15       :  5
Number of MAC Addresses (1-32)    :  12  2
Base MAC Address                  :  00:1c:f0:09:f0:34
Dying Gasp Enable (0:Disable 1:Enable)  :  0

После этого модем загрузился. Я даже попал в Web. На вкладке status, web интерфейса модем представился так

Board ID:  	R
Software Version: 	SZ_DSL-2500U_3-06-04-2700.A2pB021c.d19b
Bootloader (CFE) Version: 	(before 1.0.37-5.12)

Попробовал залить прошивку через web, в ответ модем ругнулся фразой - "Не буду шить!". Попробовал через CFE Crash mode ( что бы войти,
при старте модема необходимо зажать на нём кнопку reset секунд на 15 , в этом режиме будет доступен web интерфейс на 192.168.1.1 ) 

На консоле при входе в Crash mode вот такие сообщения

*** Break into CFE console ***

web info: Waiting for connection on socket 0.
CFE>

На попытку прошить, модем меня так же послал. Пробую прошить из консоли CFE через TFTP

CFE> f 192.168.1.3:fw
Loading 192.168.1.3:fw ...
Finished loading 1941371 bytes
Firmware model name error
Shold be [SZ_DSL-2500U]
*** command status = -1

в ответ

CFE> Firmware model name error
Shold be [SZ_DSL-2500U]
web info: Upload 1941371 bytes, invalid image format.

пробую стереть всё кроме, CFE

CFE> e a

Пробую зашить так

CFE> flashimage 192.168.1.3:fw

в ответ опять ругательство об несовместимости версий.

!!! После этого я сделал ошибку попытавшись сбросить модем. Пробую его переинициализировать, в качестве Board ID указываю точку
( '.' to clear the current value ) после этого модем ребутнулся. Power загорелся, а в терминале тишина. Х.з. наверно можно как-то
было его реанимировать и в том случае, но это не моя история !!!

Пришло время программировать флешку на программаторе, т.к. EJTAG-ов тут нет. Сразу оговорюсь, что первый раз я попробовал зашить
в модем RU_DSL-2500U_1.50_03042009_cfe_fs_kernel фирмварь взятый с FTP Dlink. Включаю, на консоле попрежнему тишина. Ну, а что
мы хотели, подобной инфы по тому как и что куда шить нет. Эта статья исправит положение !

Как я понял потом, фирмварь на прямую не шьётся. Алгоритм там примерно такой. Сначала прошивка заливается куда-то на модем,
CFE разбирает её заголовок ( Broadcom tag ) и уже потом шьёт её во флешку.

[ 3 ] Собираем SPIPGM программно-аппаратный комплекс ( аппаратная часть ). 
 
Итак флешка в этом модеме Spansion S25FL016AIF datasheet на неё тут. В чём разница между
S25FL016A и S25FL016AIF после чтения datasheet я так и не понял. Буквы IF по идеи как-то хорактирезует микросхему, но по datasheet
"Ordering Information" такое сочетание не возможно. Действительность говорит, что возможно всё =)

Сайт Spansion об S25FL016AIF не знает, а в гугле они только продаются на китайских сайтах. Наверно китайский reference disign =)
Одно ясно, они 100% совместимые.

Схему я взял отсюда и не много преобразовал согласно нашему datasheet.
Проводки от разъёма DB25 до модема, рекомендуют делать не длиннее 10 см. Резисторов на 150 Ом у меня не было, но были на 145 Ом.
Теперь по поводу схемы. Я отпаял ( отогнул ) только 1,2,5,6  ножки и подпаял к ним выводы SPIPRG адаптера. Контакт LPT 18-й ( GND ) подпаял
к контакту GND JP2 на обратной стороне печатной платы. Сделано это с той целью что бы не отпаивать лишние ножки итак хрупкой микрухи.

Так как отгибал я ножки по второму разу ( первый раз туда был зашит обычный фирмварь ) , увы в этот раз 2-я ножка не выдержала, а просто
отломалась вместе с частью дорожки платы.

Нужно быть очень аккуратным при их отгибание, ибо есть шанс сломать ножку или оторвать часть дорожки печатной платы.

Если уж так получилось, что ножка отломалась, можно взять витую пару UTP5 пачкордную ( отличается многожильностью жил ), и в качестве прводника
использовать один проводок из жилы.

С отломанной дорожкой дела обстоят сложнее, нужно будет искать куда припаяться. Соотвествующие места куда можно запаять какую ножку я
указал на снимки флешки, это ноги № 1, 2, 3, 4, 8 остальные можно найти с помощью тестера по аналогии.
Итак мы всё припаяли куда надо, теперь будем шить ! Берём иголку и нитку и шьём =)

[ 4 ] Собираем SPIPGM программно-аппаратный комплекс ( программная часть ). 

Программу для программатора можно взять отсюда либо тут,
а fullflash который мы будем заливать во флешку только отсюда.

При программирование модем должен быть включен, т.к. на ножки 3,7,8 должно подаваться 3.3в !

Настройки LPT в BIOS Setup на моей матери были дефолтные, на ней это режим SPP ( Standard Parallel Port ).
В Windows, в свойствах LPT стояло значение "Не использовать прерывание в любом случае"
У меня с такими настройками LPT всё прошилось хорошо.

На современных матерях, LPT в BIOS Setup установлен в режим ECP ( Extended Capabilities Port ) по дефолту. На некоторых ноутбуках например
режим работы LPT порта изменить в BIOS Setup нельзя вовсе !!! Существуют матери на которых LPT просто нет, умирает нынче LPT в моде USB.

Когда народ стал пробовать прошивать микруху на порту который находится в режиме ECP вылезли грабли. Вот такое сообщение выдаёт SPIPGM на
попытку идентифицировать микруху 

SPIPGMW.EXE /i

Status = ffh (SRP, RES, TB , BP2, BP1, BP0, WEL, BSY)
               1    1    1    1    1    1    1    1

Для правельной работы SPIPGM с LPT в режиме ECP. Необходимо проверить настройки в BIOS. А так же изменить параметр "Метод ресурсов фильтра"
на "Использовать любое прерывание, назначенное порту" в настройках Windows.
Так это или нетак сам я не проверял ( я шил с настройками, что на моей матери было в дефолте, а это SPP ) , но есть успешный случай решения таким
образом проблемы с работой SPIPGM. Какой режим LPT выбрать ? Ответ прост, тот с которым у вас заработает !

Все действия с программатором необходимо выполнять с правами администратора системы, иначе будет вот такой ерор. Из-за него я так же подумал,
что параметров запуска у программы нет =)

D:\Dlink\spipgm>SPIPGMW.EXE

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

ERROR: cannot open ServiceManager database.

Так можно посмотреть параметры запуска для программатора

D:\Dlink\spipgm>SPIPGMW.EXE

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SYNTAX: spipgm /i|r|d|e|p [filename] [address] [size] [/l=iobase] [/d=delay]
        /i - identify SPI FlashROM
        /r address size - read & display data block (0x prefix = hexa number)
        /d filename - dump entire FlashROM to file
        /p filename - program entire FlashROM from file (without erase)
        /e - erase entire FlashROM
        /u - unlock write protection bits (may depend on WP# level)
        /l= LPT port I/O base address (default is 378h - LPT1)
        /d= additional delay for SPI clock pulse width [usec] (default is 0)

LPT to SPI pin assignment (based on BSD AVR programmer):
pin  7 = D5 -> CS#
pin  8 = D6 -> SCK (CLK)
pin  9 = D7 -> MOSI (DIO)
pin 10 = ACK -> MISO (DO)
pin 18 = GND -> GND


1) Идентифицируем флешку ===> SPIPGMW.EXE /i

D:\Dlink\DSL-2500U_BRU_D\Programator\spipgm>SPIPGMW.EXE /i

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 010214h
Spansion S25FL016A (2MB)
Status = 00h (SRP, RES, TB , BP2, BP1, BP0, WEL, BSY)
               0    0    0    0    0    0    0    0

2) Делаем дамп ( того, что там сейчас зашито ), хотя это можно и не делать ===> SPIPGMW.EXE /d

D:\Dlink\DSL-2500U_BRU_D\Programator\spipgm>SPIPGMW.EXE /d old_fw.bin

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 010214h
Spansion S25FL016A (2MB)
Reading sector at: 001FF000h (100%)

3) Разблокируем флешку для записи ===> SPIPGMW.EXE /u
    
D:\Dlink\DSL-2500U_BRU_D\Programator\spipgm>SPIPGMW.EXE /u

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 010214h
Spansion S25FL016A (2MB)
Status = 02h, WE bit is enabled
Unlocking...
Status = 00h, device is unlocked now

4) Стираем флешку ! ===> SPIPGMW.EXE /e

D:\Dlink\DSL-2500U_BRU_D\Programator\spipgm>SPIPGMW.EXE /e

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 010214h
Spansion S25FL016A (2MB)
Status = 02h, WE bit is enabled
Please wait... done.

После этого если сделать дамп, то в нём будет всё забито FF. Таким образом можно проверить на сколько корректно всё стёрлось.

5) Запишим дамп, полученный с донора ===> SPIPGMW.EXE /p

D:\Dlink\DSL-2500U_BRU_D\Programator\spipgm>SPIPGMW.EXE /p s25fl016aif_dsl2500U_BRU_D_FullFlash.bin

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 010214h
Spansion S25FL016A (2MB)
Programming page at: 001FFF00h (100%)

6) Сделаем дамп того что мы туда записали, что бы проверить успешность записи ===> SPIPGMW.EXE /d

D:\Dlink\DSL-2500U_BRU_D\Programator\spipgm>SPIPGMW.EXE /d s25fl016aif_check.bin

SPI FlashROM Programmer 1.6 (C) 2008-2009 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 3.4.5 (mingw-vista special r3) at 22:49:21, Jan 21 2009
(Win9x/NT/2K/XP compatability)

SPI connected to LPT port at I/O base address: 378h, SCK pulse width: t+0us
FlashROM JEDEC ID, type: 010214h
Spansion S25FL016A (2MB)
Reading sector at: 001FF000h (100%)

Я сравнивал оригинальный s25fl016aif_dsl2500U_BRU_D_FullFlash.bin и тот что был получен после записи s25fl016a_check.bin с помощью утилитки
Hex Comparison довольно наглядная штука, но она шароварная ( 15 days or at most 20 uses ), для моих целей этого достаточно.

Если после загрузки обоих файлов в Hex Comparison есть где-то "зелёные байтики", это значит что-то записалось не правильно. Необходимо
повторно стереть флешеку, и записать её по новой.

После проделанных операций я запаял флешку обратно, подрубил консоль, включил кнопочку Power и вуаля, на терминал посыпались сообщения. Модем
корректно загрузился.

Через веб прошил на сегодняшний день последнюю версию фирмваря RU_DSL-2500U_BRU_D_1.50_03042009.zip , модем ребутнулся и корректно загрузился.

[ 5 ] Возвращаем параметры Board config. 

После оживления модема Board config имеет значения модема донора, а нам нужно что бы там были параметры нашего модема. Если этого не сделать, то
с точки зрения провайдера для DSLAM на Ethernet уровне это будут 2 идентичных модема.

CFE version 1.0.37-8.7 for BCM96338 (32bit,SP,BE)
Build Date: Fri Feb 20 11:52:27 CST 2009 (kevin@BS5)(Revision: 61)
Copyright (C) 2000-2006 Broadcom Corporation.

Boot Address 0xbfc00000

Initializing Arena.
Initializing Devices.
Serial flash device: name S25FL016A, id 0x0114, size 2048KB
Auto-negotiation timed-out
10 MB Half-Duplex (assumed)
CPU type 0x29010: 240MHz
Total memory: 8388608 bytes (8MB)

Total memory used by CFE:  0x80401000 - 0x80527930 (1206576)
Initialized Data:          0x8041D020 - 0x8041F160 (8512)
BSS Area:                  0x8041F160 - 0x80425930 (26576)
Local Heap:                0x80425930 - 0x80525930 (1048576)
Stack Area:                0x80525930 - 0x80527930 (8192)
Text (code) segment:       0x80401000 - 0x8041D014 (114708)
Boot area (physical):      0x00528000 - 0x00568000
Relocation Factor:         I:00000000 - D:00000000

Board IP address                  : 5.58.23.99:ff000000
Host IP address                   : 192.168.1.100
Gateway IP address                :
Run from flash/host (f/h)         : f
Default host run file name        : vmlinux
Default host flash file name      : bcm963xx_fs_kernel
Boot delay (0-9 seconds)          : 1
Board Id (0-12)                   : 96332CG
Number of MAC Addresses (1-32)    : 12
Base MAC Address                  : 00:1b:11:b4:fd:96
PSI Size (1-64) KBytes            : 24

*** Press any key to stop auto run (1 seconds) ***
Auto run second count down: 1
web info: Waiting for connection on socket 0.

Тут вот небольшой help по CFE для Dlink DSL-2500U/BRU/D H/W Ver. : D1

CFE> help
Available commands:

w                   Write the whole image start from beginning of the flash
e                   Erase [n]vram or [a]ll flash except bootrom
r                   Run program from flash image or from host depend on [f/h] flag
p                   Print boot line and board parameter info
c                   Change booline parameters
f                   Write image to the flash
i                   Erase persistent storage data
b                   Change board parameters
reset               Reset the board
flashimage          Flashes a compressed image after the bootloader.
help                Obtain help for CFE commands

For more information about a command, enter 'help command-name'
*** command status = 0

Последним действием необходимо восстановить MAC адрес нашего устройства т.к. вместе с дампом вшился MAC донора. Его мы берём с шильдика на
обратной стороне модема. Здесь же мы указываем, что в устройстве есть только 2 MAC-а.

CFE> b
Press:   to use current value
        '-' to go previous parameter
        '.' to clear the current value
        'x' to exit this command
96338SV          ------- 0
96338L-2M-8M     ------- 1
96338L-65-2M-8M  ------- 2
96338W           ------- 3
96338W-20P2      ------- 4
96338E4          ------- 5
96338E4-20P2     ------- 6
96332            ------- 7
96332CG          ------- 8
DSL-2500U        ------- 9
DSL-2520U        ------- 10
DSL-2540U        ------- 11
A96338GW         ------- 12
Board Id (0-12)                   :  8
Number of MAC Addresses (1-32)    :  12 2 <================== тут указал, что у нас всего 2 MAC !
Base MAC Address                  :  00:1b:11:b4:fd:96  00:1c:f0:09:f0:34 <================== тут указал MAC с шильдика !
PSI Size (1-64) KBytes            :  24

После этого даём командочку reset и у нас в итоге полностью оживлённый модем, который радостно моргает своими индикаторами =)

[ 6 ] Пара интересных вещей в этом модеме.

 http://modem_ip/engdebug.cmd - позволяет зеркалировать трафик с WAN порта на LAN.
 http://modem_ip/enginfo.cmd - различная информация по модему из /proc

© Fregl , Псков , ( e-mail : fregl собака inbox точка ру ) 23.03.2009 v 0.7
При публикации просьба указывать ссылку на первоисточник ! По поводу посылки пива обращаться в почту =)