wqnet 发表于 2005-11-11 13:10:07

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

这里有 Broadcom的 JTAG做法,以及在linux下用
http://spacetoad.com/tmp/hairydairymaid_debrickv22.zip
-=-=-=-=- 以下内容由 wqnet 在 2005年11月11日 02:32pm 时添加 -=-=-=-=-
Modem板上的12Pin接口就是JTAG
可以用来调试程序、写Flash。
一般没有焊接头,需要自己焊一个上去。
即使你的猫已经不能启动,不响应任何连接,只要硬件没坏,就可以用它写Flash。
但是它的写入速度太慢,一般不要用它写整个固件。可以先写入cfe的bootblock,然后用以太网口写,速度会快很多。

w4de 发表于 2005-11-12 01:43:02

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

下不了

小痛 发表于 2005-11-12 00:34:15

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

期待有新的结果公布

wqnet 发表于 2005-11-11 21:46:25

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

4Pin的是RS232的终端线,要求Flash内有能启动的系统。
这个可以刷没有任何系统的空Flash片,或刷错固件、刷过程中掉电等不能启动的猫。不过这个程序是刷路由器的,目前只支持BCM4712、BCM5352,不支持6335、6345这两个芯片,需要修改源码才能刷猫,正在研究中。
刷新工具选择顺序是这样的
首选telnet;不能用telnet的用4pin线;最后才用到这个。
如果这个也不好使的话,很不幸,你的猫硬件已经挂了……

flashcat 发表于 2005-11-11 21:31:33

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

谢谢,应该还有接4pin的方法

wqnet 发表于 2005-11-12 10:55:52

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

能下啊,我网通、铁通的线路都试过……
你用的是啥线路?
不行的话用代理服务器试试。

jiaoshi 发表于 2005-11-12 11:39:19

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

下了一半就不能下了,怎么回事呀.

wqnet 发表于 2005-11-12 11:42:05

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

谁能提供一个稳定的FTP?我传上去吧。

jiaoshi 发表于 2005-11-12 11:55:37

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

QQ共享呀.

wqnet 发表于 2005-11-12 15:59:19

Broadcom 万能刷猫工具! JTAG硬件+Linux源码

);
            i++;
          }
          if (strcmp(choice,"/noreset")==0)
             issue_reset = 0;
          else
          if (strcmp(choice,"/nobreak")==0)
             issue_break = 0;
          else
          if (strcmp(choice,"/noerase")==0)
             issue_erase = 0;
          else
          if (strcmp(choice,"/notimestamp")==0)
             issue_timestamp = 0;
          else
          if (strncmp(choice,"/fc:",4)==0)
             sscanf(choice,"/fc:%d", &selected_fc);
          else
          {
             show_usage();
             printf("\n*** ERROR - Invalid <switch> specified ***\n\n");
             exit(1);
          }
          j++;
       }
    }

    // Detect & Initialize
    chip_detect();
    // For Good Measure
    test_reset();
    // Find Starting "ctrl_reg" Value
    set_instr(INSTR_CONTROL);
    ctrl_reg = ReadData();
    // New Init Sequence
    if (issue_reset)ejtag_issue_reset();    // Reset Processor and Peripherals
    ejtag_dma_write(0xff300000,0);            // Clear DCR
    ejtag_dma_write(0xb8000080,0);            // Clear Watchdog
    if (issue_break)ejtag_jtagbrk();      // Put into EJTAG Debug Mode
    // Flash Chip Detection
    if (selected_fc != 0)
       sflash_config();
    else
       sflash_probe();

    if (flash_size == size2MB)
    {
       FLASH_MEMORY_START = CFE_START_2MB;
       if (run_option == 1 )run_backup("CFE.BIN",      CFE_START_2MB,         CFE_LENGTH_2MB);
       if (run_option == 2 )run_backup("NVRAM.BIN",      NVRAM_START_2MB,       NVRAM_LENGTH_2MB);
       if (run_option == 3 )run_backup("KERNEL.BIN",   KERNEL_START_2MB,      KERNEL_LENGTH_2MB);
       if (run_option == 4 )run_backup("WHOLEFLASH.BIN", WHOLEFLASH_START_2MB,WHOLEFLASH_LENGTH_2MB);
       if (run_option == 5 )run_erase("CFE.BIN",         CFE_START_2MB,         CFE_LENGTH_2MB);
       if (run_option == 6 )run_erase("NVRAM.BIN",       NVRAM_START_2MB,       NVRAM_LENGTH_2MB);
       if (run_option == 7 )run_erase("KERNEL.BIN",      KERNEL_START_2MB,      KERNEL_LENGTH_2MB);
       if (run_option == 8 )run_erase("WHOLEFLASH.BIN",WHOLEFLASH_START_2MB,WHOLEFLASH_LENGTH_2MB);
       if (run_option == 9 )run_flash("CFE.BIN",         CFE_START_2MB,         CFE_LENGTH_2MB);
       if (run_option == 10)run_flash("NVRAM.BIN",       NVRAM_START_2MB,       NVRAM_LENGTH_2MB);
       if (run_option == 11)run_flash("KERNEL.BIN",      KERNEL_START_2MB,      KERNEL_LENGTH_2MB);
       if (run_option == 12)run_flash("WHOLEFLASH.BIN",WHOLEFLASH_START_2MB,WHOLEFLASH_LENGTH_2MB);
    }
    if (flash_size == size4MB)
    {
       FLASH_MEMORY_START = CFE_START_4MB;
       if (run_option == 1 )run_backup("CFE.BIN",      CFE_START_4MB,         CFE_LENGTH_4MB);
       if (run_option == 2 )run_backup("NVRAM.BIN",      NVRAM_START_4MB,       NVRAM_LENGTH_4MB);
       if (run_option == 3 )run_backup("KERNEL.BIN",   KERNEL_START_4MB,      KERNEL_LENGTH_4MB);
       if (run_option == 4 )run_backup("WHOLEFLASH.BIN", WHOLEFLASH_START_4MB,WHOLEFLASH_LENGTH_4MB);
       if (run_option == 5 )run_erase("CFE.BIN",         CFE_START_4MB,         CFE_LENGTH_4MB);
       if (run_option == 6 )run_erase("NVRAM.BIN",       NVRAM_START_4MB,       NVRAM_LENGTH_4MB);
       if (run_option == 7 )run_erase("KERNEL.BIN",      KERNEL_START_4MB,      KERNEL_LENGTH_4MB);
       if (run_option == 8 )run_erase("WHOLEFLASH.BIN",WHOLEFLASH_START_4MB,WHOLEFLASH_LENGTH_4MB);
       if (run_option == 9 )run_flash("CFE.BIN",         CFE_START_4MB,         CFE_LENGTH_4MB);
       if (run_option == 10)run_flash("NVRAM.BIN",       NVRAM_START_4MB,       NVRAM_LENGTH_4MB);
       if (run_option == 11)run_flash("KERNEL.BIN",      KERNEL_START_4MB,      KERNEL_LENGTH_4MB);
       if (run_option == 12)run_flash("WHOLEFLASH.BIN",WHOLEFLASH_START_4MB,WHOLEFLASH_LENGTH_4MB);
    }
    if ((flash_size == size8MB) || (flash_size == size16MB))// Treat 16MB Flash Chip like it is an 8MB Flash Chip
    {
       FLASH_MEMORY_START = CFE_START_8MB;
       if (run_option == 1 )run_backup("CFE.BIN",      CFE_START_8MB,         CFE_LENGTH_8MB);
       if (run_option == 2 )run_backup("NVRAM.BIN",      NVRAM_START_8MB,       NVRAM_LENGTH_8MB);
       if (run_option == 3 )run_backup("KERNEL.BIN",   KERNEL_START_8MB,      KERNEL_LENGTH_8MB);
       if (run_option == 4 )run_backup("WHOLEFLASH.BIN", WHOLEFLASH_START_8MB,WHOLEFLASH_LENGTH_8MB);
       if (run_option == 5 )run_erase("CFE.BIN",         CFE_START_8MB,         CFE_LENGTH_8MB);
       if (run_option == 6 )run_erase("NVRAM.BIN",       NVRAM_START_8MB,       NVRAM_LENGTH_8MB);
       if (run_option == 7 )run_erase("KERNEL.BIN",      KERNEL_START_8MB,      KERNEL_LENGTH_8MB);
       if (run_option == 8 )run_erase("WHOLEFLASH.BIN",WHOLEFLASH_START_8MB,WHOLEFLASH_LENGTH_8MB);
       if (run_option == 9 )run_flash("CFE.BIN",         CFE_START_8MB,         CFE_LENGTH_8MB);
       if (run_option == 10)run_flash("NVRAM.BIN",       NVRAM_START_8MB,       NVRAM_LENGTH_8MB);
       if (run_option == 11)run_flash("KERNEL.BIN",      KERNEL_START_8MB,      KERNEL_LENGTH_8MB);
       if (run_option == 12)run_flash("WHOLEFLASH.BIN",WHOLEFLASH_START_8MB,WHOLEFLASH_LENGTH_8MB);
    }
    printf("\n\n *** REQUESTED OPERATION IS COMPLETE ***\n\n");
    chip_shutdown();
    return 0;
}
下面是源程序的.h文件
// **************************************************************************
//
//WRT54G.H - Header file for the WRT54G/GS EJTAG DeBrick Utilityv4.1
//
//Note:
//This program is for De-Bricking the WRT54G/GS routers
//
//New for v4.1 - software re-written to support 38 flash chips and
//               auto-detect flash chip & flash size & adjust
//               region info accordingly for reading/writing to the
//               flash chips.Also added support for compiling under
//               Windows, Linux, and FreeBSD.
//
// **************************************************************************
//Written by HairyDairyMaid (a.k.a. - lightbulb)
//hairydairymaid@yahoo.com
// **************************************************************************
//
//This program is copyright (C) 2004 HairyDairyMaid (a.k.a. Lightbulb)
//This program is free software; you can redistribute it and/or modify it
//under the terms of version 2 the GNU General Public License as published
//by the Free Software Foundation.
//This program is distributed in the hope that it will be useful, but WITHOUT
//ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//FITNESS FOR A PARTICULAR PURPOSE.See the GNU General Public License for
//more details.
//To view a copy of the license go to:
//http://www.fsf.org/copyleft/gpl.html
//To receive a copy of the GNU General Public License write the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA02111-1307, USA.
//
// **************************************************************************
&#35;include <stdio.h>
&#35;include <stdlib.h>
&#35;include <fcntl.h>
&#35;ifndef WINDOWS_VERSION
   &#35;include <unistd.h>
   &#35;include <sys/ioctl.h>
   &#35;ifdef __FreeBSD__
      &#35;include <dev/ppbus/ppi.h>
      &#35;include <dev/ppbus/ppbconf.h>
      &#35;define PPWDATA PPISDATA
      &#35;define PPRSTATUS PPIGSTATUS
   &#35;else
      &#35;include <linux/ppdev.h>
   &#35;endif
&#35;endif
&#35;define true1
&#35;define false 1
&#35;define RETRY_ATTEMPTS 16
// ------------------------------------------------------
// --- Choose only one cable specific section below
// ------------------------------------------------------
//
// --- Xilinx Type Cable ---
&#35;define TDI   0
&#35;define TCK   1
&#35;define TMS   2
&#35;define TDO   4
//
// --- Wiggler Type Cable ---
// &#35;define TDI      3
// &#35;define TCK      2
// &#35;define TMS      1
// &#35;define TDO      7
//
// ------------------------------------------------------
// --- Some BCM47XX Instructions ---
&#35;define INSTR_IDCODE    0x01
&#35;define INSTR_EXTEST    0x00
&#35;define INSTR_SAMPLE    0x02
&#35;define INSTR_PRELOAD   0x02
&#35;define INSTR_BYPASS    0xFF
&#35;define INSTR_CONTROL   0x0A
&#35;define INSTR_DATA      0x09
&#35;define INSTR_ADDRESS   0x08
// --- Some EJTAG Bit Masks ---
&#35;define TOF             (1 << 1 )
&#35;define BRKST         (1 << 3 )
&#35;define DRWN            (1 << 9 )
&#35;define DERR            (1 << 10)
&#35;define DSTRT         (1 << 11)
&#35;define SETDEV          (1 << 14)
&#35;define PROBEN          (1 << 15)
&#35;define DMAACC          (1 << 17)
&#35;define PRACC         (1 << 18)
&#35;define PRNW            (1 << 19)
&#35;define DLOCK         (1 << 5 )
&#35;define TIF             (1 << 2 )
&#35;define SYNC            (1 << 23)
&#35;define PRRST         (1 << 16)
&#35;define PERRST          (1 << 20)
&#35;define JTAGBRK         (1 << 12)
&#35;define DNM             (1 << 28)
&#35;define DMA_BYTE      0x00000000//DMA tranfser size BYTE
&#35;define DMA_HALFWORD    0x00000080//DMA transfer size HALFWORD
&#35;define DMA_WORD      0x00000100//DMA transfer size WORD
&#35;define DMA_TRIPLEBYTE0x00000180//DMA transfer size TRIPLEBYTE
// --- For 2MB Flash Chips ---
&#35;defineCFE_START_2MB         0x1FC00000
&#35;defineCFE_LENGTH_2MB      0x40000
&#35;defineKERNEL_START_2MB      0x1FC40000
&#35;defineKERNEL_LENGTH_2MB   0x1B0000
&#35;defineNVRAM_START_2MB       0x1FDF0000
&#35;defineNVRAM_LENGTH_2MB      0x10000
&#35;defineWHOLEFLASH_START_2MB0x1FC00000
&#35;defineWHOLEFLASH_LENGTH_2MB 0x200000
// --- For 4MB Flash Chips ---
&#35;defineCFE_START_4MB         0x1FC00000
&#35;defineCFE_LENGTH_4MB      0x40000
&#35;defineKERNEL_START_4MB      0x1FC40000
&#35;defineKERNEL_LENGTH_4MB   0x3B0000
&#35;defineNVRAM_START_4MB       0x1FFF0000
&#35;defineNVRAM_LENGTH_4MB      0x10000
&#35;defineWHOLEFLASH_START_4MB0x1FC00000
&#35;defineWHOLEFLASH_LENGTH_4MB 0x400000
// --- For 8MB Flash Chips ---
&#35;defineCFE_START_8MB         0x1C000000
&#35;defineCFE_LENGTH_8MB      0x40000
&#35;defineKERNEL_START_8MB      0x1C040000
&#35;defineKERNEL_LENGTH_8MB   0x7A0000
&#35;defineNVRAM_START_8MB       0x1C7E0000
&#35;defineNVRAM_LENGTH_8MB      0x20000
&#35;defineWHOLEFLASH_START_8MB0x1C000000
&#35;defineWHOLEFLASH_LENGTH_8MB 0x800000
&#35;definesize8K      0x2000
&#35;definesize16K       0x4000
&#35;definesize32K       0x8000
&#35;definesize64K       0x10000
&#35;definesize128K      0x20000
&#35;definesize2MB       0x200000
&#35;definesize4MB       0x400000
&#35;definesize8MB       0x800000
&#35;definesize16MB      0x1000000
&#35;defineCMD_TYPE_BSC0x01
&#35;defineCMD_TYPE_SCS0x02
&#35;defineCMD_TYPE_AMD0x03
&#35;defineCMD_TYPE_SST0x04

// --- Uhh, Just Because I Have To ---
static unsigned char clockout(void);
static unsigned int ReadData(void);
static unsigned int ReadWriteData(unsigned int in_data);
static unsigned int ejtag_dma_read(unsigned int addr);
static unsigned int ejtag_dma_read_h(unsigned int addr);
void ShowData(unsigned int value);
void WriteData(unsigned int in_data);
void capture_dr(void);
void capture_ir(void);
void chip_detect(void);
void chip_shutdown(void);
void clockin(int tms, int tdi);
void define_block(unsigned int block_count, unsigned int block_size);
void ejtag_dma_write(unsigned int addr, unsigned int data);
void ejtag_dma_write_h(unsigned int addr, unsigned int data);
void ejtag_issue_reset(void);
void ejtag_jtagbrk(void);
void identify_flash_part(void);
void lpt_closeport(void);
void lpt_openport(void);
void run_backup(char *filename, unsigned int start, unsigned int length);
void run_erase(char *filename, unsigned int start, unsigned int length);
void run_flash(char *filename, unsigned int start, unsigned int length);
void set_instr(int instr);
void sflash_config(void);
void sflash_erase_area(unsigned int start, unsigned int length);
void sflash_erase_block(unsigned int addr);
void sflash_probe(void);
void sflash_reset(void);
void sflash_write_word(unsigned int addr, unsigned int data);
void show_usage(void);
void test_reset(void);
页: [1] 2 3 4 5 6 7
查看完整版本: Broadcom 万能刷猫工具! JTAG硬件+Linux源码