GrabDuck

Как я возвращал к жизни D-Link DSL-2640U rev. C2

:

История повествует о том как я провел лето на новогодних каникулах возвращал к жизни модем D-Link DSL-2640U с версией железа C2.

Принесли пациента еще за неделю до нового года, с симптомами «не работает после неудавшейся прошивки, во время которой вырубили свет». И правда, после включения в сеть на модеме не переставая горела лампочка «Internet», хотя ни ADSL, ни Ethernet подключены не были. Однако, Ethernet-порт, в который воткнут кабель, модем чувствовал, и мигал для каждого из 4-х портов соответствующей лампочкой.

Было найдено, что на модеме есть консоль (разъем J5), но после прочтения статьи о восстановлении похожего модема, было решено сразу принять крайние меры — перешить флэш напрямую, и отложить разбирательства с распайкой консоли.
Флэш в этом модеме стоит следующий: 25X32VSIG, 4Mb, для него нужен дамп, который я нигде найти не смог. Увидел только в комментариях одного очень полезного жж, что у человека есть дамп для моего модема с такой же ревизией. Написал ему и через пару дней он мне выслал дамп. Оставалось дело за малым — прошить.

Вообще, нижеописанное подробно изложено в вышеуказанной статье, здесь я просто расскажу о своих действиях.

Вначале собрал программатор для флэша по следующей схеме:

Схема программатора для SPI Flash

Собранный программатор (если можно таким громким словом назвать несколько проводков и 4 резистора) получился таким:

Внешний вид программатора для SPI Flash

Режим LPT порта в BIOS был выставлен в SPP.

Запустив программу, можно ознакомиться с ее параметрами и еще раз с распиновкой LPT-порта и SPI-флэша:

C:\SPIPGM\spipgmw

SPI FlashROM Programmer 1.8 (C) 2008-2010 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 4.4.0 at 04:33:55, Dec 22 2010
(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

Основные используемые параметры программы:

  • /i — определить тип флэша;
  • /d filename — сохранить дамп из флэша в файл;
  • /p filename — записать дамп во флэш из файла (без очистки);
  • /e — очистить флэш (то есть заполнить все байтами 0xFF);
  • /u — разблокировать защиту от записи.

Вначале не помешает определить тип флэша, а заодно и проверить программатор:

C:\SPIPGM>spipgmw /i

SPI FlashROM Programmer 1.8 (C) 2008-2010 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 4.4.0 at 04:33:55, Dec 22 2010
(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: EF3016h
Winbond W25X32 (4MB)
Status = 00h (SRP, RES, TB , BP2, BP1, BP0, WEL, BSY)
               0    0    0    0    0    0    0    0

Затем обязательно сделать дамп того, что на данный момент есть во флэше:

C:\SPIPGM>spipgmw /d old.bin

SPI FlashROM Programmer 1.8 (C) 2008-2010 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 4.4.0 at 04:33:55, Dec 22 2010
(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: EF3016h
Winbond W25X32 (4MB)
Reading sector at: 003FF000h (100%)

Далее залить во флэш правильный дамп:

C:\SPIPGM>spipgmw /p 2640u_bru_c2.bin

SPI FlashROM Programmer 1.8 (C) 2008-2010 by Martin Rehak; rayer@seznam.cz
Compiled by GCC 4.4.0 at 04:33:55, Dec 22 2010
(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: EF3016h
Winbond W25X32 (4MB)
Programming page at: 003FFF00h (100%)

Если флэш откажется прописываться, то можно попробовать разблокировать защиту от записи (/u) и очистить флэш (/e) перед прошивкой.

После этого я подумал, что после впаивания флэша на место, модем будет сразу работать. Но не тут-то было. Как потом прочитал (точнее потом только сообразил), ему еще нужно указать правильные параметры некоего «Board Id» и изменить MAC-адрес. Пришлось все-таки распаивать консоль. Вот для нее схема:

Схема распайки консоли на DSL-2640U

В модеме разъем консоли на плате обозначен J5, контакт GND подписан. Полная распиновка J5 (справа налево, как на фотке) такая: GND, Tx, Rx, VCC (+3.3V). Контакт VCC я не использовал, так как питание на MAX232 подавал со внешнего БП.

Подключение к консоли на DSL-2640U

Подключение к COM-порту

Программу-терминал я использовал «Terminal by Bray++ v1.9b». Скорость передачи 115 200, остальные параметры по умолчанию. При первой загрузке после прошивки флэша модем в консоли сразу попросил ввести Board Id:
Press:  
              
   
   
        
   
    
         
    
    
                to use current value

        '-' to go previous parameter

        '.' to clear the current value

        'x' to exit this command

96338W           ------- 0 
96338WS2         ------- 1 
96338W2          ------- 2 
96338E           ------- 3 
96338E4          ------- 4 
96332CG          ------- 5 
96338WS          ------- 6 
96338E_E7R       ------- 7 
96338W2_E7T      ------- 8 
96332CG_F4W      ------- 9 
96333AWG         ------- 10
96332AG          ------- 11
96332AG2         ------- 12
96333AWGS        ------- 13
96333AWG_F7S     ------- 14
96333AWGS_F4N    ------- 15

              
   
   
        
   

По незнанию ввел какое-то число, модем загрузился, но должным образом не заработал. При сбросе питания и повторной загрузке он уже не спрашивал Board Id, а продолжал грузиться с установленными параметрами. Нужно было менять Board Id, но где его менять, я сначала не нашел, только потом заметил, что при загрузке модем пишет:

*** Press any key to stop auto run (1 seconds) ***
Auto run second count down: 0
Вот в это время модем ждет 1 секунду, чтобы была возможность нажать любую клавишу. Угадывать этот интервал я не стал, потому, уже при выключенном модеме, удерживал пробел, а затем включал модем. После этого загружался CFE (Common Firmware Environment) и снова появлялась возможность выбрать Board Id, нажимая «b» и «Enter»:

Здесь появился вопрос, а какой все-таки Board Id выбирать? Варианты из предлагаемого списка были похожи на марку установленного контроллера BCM6333KFBG. Выбрал первый подходящий: «96333AWG ------- 10», указал количество MAC-адресов: «2», и непосредственно сами MAC'и (с корпуса модема), оба одинаковые (хотя может быть нужно было указывать 1 MAC, не проверял, делал по инструкции с вышеуказанного сайта). После чего модем увиделся по IP, был настроен и продолжил успешно работать.