找回密码
 注册

QQ登录

只需一步,快速开始

查看: 85324|回复: 65

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

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

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

下不了
发表于 2005-11-12 00:34:15 | 显示全部楼层

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

期待有新的结果公布
 楼主| 发表于 2005-11-11 21:46:25 | 显示全部楼层

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

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

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

谢谢,应该还有接4pin的方法
 楼主| 发表于 2005-11-12 10:55:52 | 显示全部楼层

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

能下啊,我网通、铁通的线路都试过……
你用的是啥线路?
不行的话用代理服务器试试。
发表于 2005-11-12 11:39:19 | 显示全部楼层

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

下了一半就不能下了,怎么回事呀.
 楼主| 发表于 2005-11-12 11:42:05 | 显示全部楼层

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

谁能提供一个稳定的FTP?我传上去吧。
发表于 2005-11-12 11:55:37 | 显示全部楼层

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

QQ共享呀.
 楼主| 发表于 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 Utility  v4.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, MA  02111-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 true  1
&#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_TRIPLEBYTE  0x00000180  //DMA transfer size TRIPLEBYTE
// --- For 2MB Flash Chips ---
&#35;define  CFE_START_2MB         0x1FC00000
&#35;define  CFE_LENGTH_2MB        0x40000
&#35;define  KERNEL_START_2MB      0x1FC40000
&#35;define  KERNEL_LENGTH_2MB     0x1B0000
&#35;define  NVRAM_START_2MB       0x1FDF0000
&#35;define  NVRAM_LENGTH_2MB      0x10000
&#35;define  WHOLEFLASH_START_2MB  0x1FC00000
&#35;define  WHOLEFLASH_LENGTH_2MB 0x200000
// --- For 4MB Flash Chips ---
&#35;define  CFE_START_4MB         0x1FC00000
&#35;define  CFE_LENGTH_4MB        0x40000
&#35;define  KERNEL_START_4MB      0x1FC40000
&#35;define  KERNEL_LENGTH_4MB     0x3B0000
&#35;define  NVRAM_START_4MB       0x1FFF0000
&#35;define  NVRAM_LENGTH_4MB      0x10000
&#35;define  WHOLEFLASH_START_4MB  0x1FC00000
&#35;define  WHOLEFLASH_LENGTH_4MB 0x400000
// --- For 8MB Flash Chips ---
&#35;define  CFE_START_8MB         0x1C000000
&#35;define  CFE_LENGTH_8MB        0x40000
&#35;define  KERNEL_START_8MB      0x1C040000
&#35;define  KERNEL_LENGTH_8MB     0x7A0000
&#35;define  NVRAM_START_8MB       0x1C7E0000
&#35;define  NVRAM_LENGTH_8MB      0x20000
&#35;define  WHOLEFLASH_START_8MB  0x1C000000
&#35;define  WHOLEFLASH_LENGTH_8MB 0x800000
&#35;define  size8K        0x2000
&#35;define  size16K       0x4000
&#35;define  size32K       0x8000
&#35;define  size64K       0x10000
&#35;define  size128K      0x20000
&#35;define  size2MB       0x200000
&#35;define  size4MB       0x400000
&#35;define  size8MB       0x800000
&#35;define  size16MB      0x1000000
&#35;define  CMD_TYPE_BSC  0x01
&#35;define  CMD_TYPE_SCS  0x02
&#35;define  CMD_TYPE_AMD  0x03
&#35;define  CMD_TYPE_SST  0x04

// --- 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);
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|宽带技术网 |网站地图

粤公网安备 44152102000001号

GMT+8, 2024-4-17 04:16 , Processed in 0.026599 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表