数码之家

标题: 博通mips架构路由固件和cfe编译经验杂谈 [打印本页]

作者: afeng114    时间: 2023-4-20 11:28
标题: 博通mips架构路由固件和cfe编译经验杂谈
本帖最后由 afeng114 于 2023-4-21 23:44 编辑

曾经博通系列BCM4716,BCM4718,BCM5357/5358和BCM4706处理器的路由红极一时,也出现过很多脍炙人口的经典产品,如EA6500v1,R6300V1和RT-AC66U等。在wifi6已经逐渐普及的今天,这些mips架构的路由已经功成身退,曾经的荣耀也在一夜之间黯然失色。如何让这些功勋老将发挥余热,是一个沉重的话题,今天,笔者将带领大家,利用业余时间,体验一把玩路由玩到心跳的感觉。

*****第一篇*****
cfe
1、概念
CFE,全称为Common Firmware Environment,引导内核启动的程序。它是BroadCom公司专用的bootloader。其开发者为Mitch Lichtenberg,就如同u-boot是启动内核的引导程序一样。CFE支持基本的设备访问,其设计理念是满足引导程序所具有的基本功能,如:Flash设备等存储设备的访问、基本的UI接口。
相比U-Boot,CFE开放性小资料少,很多GPL中都把这部分源代码删除了,笔者主要玩博通系列路由,经常自己编译固件和刷机测试,因此非常想适配一个类似于不死uboot,界面简单直观、打开浏览器上传固件就可以完成刷机的cfe。寻遍github,功夫不负有心人,终于在华硕提供的源代码中,找到了完整的cfe源码,mips的源码在asuswrt/release/src-rt-6.x/cfe文件夹下。
2、从源码编译
安装虚拟机,然后安装32位版本的ubuntu 16.04,然后安装软件包:
sudo apt install libncurses5 libncurses5-dev m4 bison gawk flex libstdc++6-4.6-dev g++-4.6 gengetopt \
git git-core gitk zlib1g-dev autoconf autopoint gettext libtool shtool autogen mtd-utils \
intltool sharutils docbook-xsl-* libstdc++5 texinfo dos2unix tofrodos xsltproc u-boot-tools \
device-tree-compiler python qemu gperf liblzo2-dev uuid-dev build-essential lzma-dev liblzma-dev \
lzma binutils-dev patch cmake intltool libglib2.0-dev gtk-doc-tools
然后clone华硕提供的源代码到本地,配置环境:
将tools/brcm拷贝到/opt下面:
cd /opt
cp -r asuswrt/tools/brcm .
导出路径:

export PATH=$PATH:/opt/brcm/K26/hndtools-mipsel-linux-uclibc-4.2.3/bin
export PATH=$PATH:~/asuswrt/release/src/ctools && cd ~/asuswrt/release/src-rt-6.x/cfe/build/broadcom/bcm947xx

适配自己路由的cfe,首先需要获取自己路由的gpio值,以EA6500V1为例,首先修改gpio定义:
#define PWR_LED_GPIO    (1 << 1) | (1 << 2)     // GPIO 1,2
#define RST_BTN_GPIO    (1 << 3)                        // GPIO 3
#define WPS_BTN_GPIO    (1 << 4)                        // GPIO 4
在asuswrt/release/src-rt-6.x/cfe/cfe/arch/common/board/bcm947xx/src/ui_bcm947xx.c中,适配gpio以后,就可以通过修改makefile,设定RESCUE_MODE := 1,这样就开启救援模式,按住reset通电路由,就可以进入救援模式,文件路径位于asuswrt/release/src-rt-6.x/cfe/build/broadcom/bcm947xx/Makefile。
如果需要同时支持spi flash和nand flash闪存,则需要分别设置:
CFG_SFLASH := 1
CFG_NFLASH := 1
当然,源码本来就是为RT-AC66U适配的,因此,默认同时支持spi flash和nand flash。

假如你的路由只支持spi flash,那需要修改三处代码:
(1)在makefile中修改设置CFG_NFLASH := 0
(2)在ui_bcm947xx.c文件中修改函数ui_cmd_go,将以下两个函数分别修改strcpy(trx_name, "nflash1.trx");改为strcpy(trx_name, "flash1.trx");
strcpy(os_name, "nflash0.os");改为strcpy(os_name, "flash0.os");

(3)在asuswrt/release/src-rt-6.x/cfe/cfe/ui/ui_flash.c文件中修改函数ui_cmd_flash,将语句strcpy(flashdev, "nflash1.boot");改为strcpy(flashdev, "flash1.boot");
(4)将asuswrt/release/src-rt-6.x/cfe/build/broadcom/bcm947xx/compressed/rt-ac66u_nvram.txt里面的内容替换成ea6500v1的nvram参数
然后就可以make,即可生成具有华硕风格的自适配ea6500v1 cfe。
[attach]1803691[/attach]
cfe编译界面

[attach]1803664[/attach]
ttl输出界面

[attach]1803665[/attach]
cfe miniweb界面

*****第二篇*****
固件
1、华硕

2、tomato

3、dd

未完,待续......






补充内容 (2023-4-23 09:06):
一些细节:
如果要在启动时显示spi flash信息和容量,在asuswrt//release/src-rt-6.x/cfe/cfe/arch/common/board/bcm947xx/src/bcm947xx_devs.c文件的flash_init函数中,增加以下
作者: 邪恶海盗    时间: 2023-4-20 12:07
CFE是BCM的MIPS路由用的BootLoader,AR和MTK这些MIPS路由用的BootLoader是Uboot,所以撸主这个标题我感觉不是很严谨...
作者: 578087463    时间: 2023-4-20 12:19
邪恶海盗 发表于 2023-4-20 12:07
CFE是BCM的MIPS路由用的BootLoader,AR和MTK这些MIPS路由用的BootLoader是Uboot,所以撸主这个标题我感觉不是 ...

网件R6400 R7000的CPU以前他们也经常用CFE来形容
作者: wslq    时间: 2023-4-20 14:51
支持楼主分享,标记学习一下谢谢
作者: afeng114    时间: 2023-4-20 17:38
578087463 发表于 2023-4-20 12:19
网件R6400 R7000的CPU以前他们也经常用CFE来形容

下一篇将是博通arm路由cfe和固件适配,就是针对R6400,R7000这一类的
作者: love-digit    时间: 2023-4-20 21:15
支持楼主分享,等楼主完稿后好好拜读一下。
作者: 臭老九    时间: 2023-4-21 14:17
加油 加油
作者: f7077447    时间: 2023-4-21 20:44
本帖最后由 f7077447 于 2023-4-21 20:45 编辑

想到回去玩CFE。。有CFE编辑器,,

要玩AMR的CFE,,,BCM6755市场上有很多


作者: yingguang    时间: 2023-4-22 07:56
不错不错,学习怎么编译
作者: 臭老九    时间: 2023-4-22 14:15

加油 加油 2
作者: dtzxl    时间: 2023-4-22 19:23
没文化,看不懂
作者: afeng114    时间: 2023-4-23 09:09
本帖最后由 afeng114 于 2023-4-23 14:39 编辑

一些细节:
A、如果要在启动时显示spi flash信息和容量,在asuswrt//release/src-rt-6.x/cfe/cfe/arch/common/board/bcm947xx/src/bcm947xx_devs.c文件的flash_init函数中,在
#if (CFG_FLASH || CFG_SFLASH)
        flash_memory_size_config(sih, (void *)&fprobe);
#endif /* (CFG_FLASH || CFG_SFLASH) */
之后增加以下内容:
#ifdef CFG_SFLASH
        if (sfl_info)
        {
                switch (sfl_info->type) {
                        case SFLASH_ST:
            case QSPIFLASH_ST:
                                printf("Found an ST compatible serial flash with %d %dKB blocks; total size %dMB\n",
                                        sfl_info->numblocks, sfl_info->blocksize / 1024,
                                        sfl_info->size / (1024 * 1024));
                                break;
                        case SFLASH_AT:
            case QSPIFLASH_AT:
                                printf("Found an AT compatible serial flash with %d %dKB blocks; total size %dMB\n",
                                        sfl_info->numblocks, sfl_info->blocksize / 1024,
                                        sfl_info->size / (1024 * 1024));
                                break;
                        default:
                                printf("Found an unknown type serial flash with %d %dKB blocks; total size %dMB\n",
                                        sfl_info->numblocks, sfl_info->blocksize / 1024,
                                        sfl_info->size / (1024 * 1024));
                                break;
                }
        }
#endif /* CFG_SFLASH */

B、如果要在miniweb增加自己的信息,可以修改asuswrt/release/src-rt-6.x/cfe/cfe/net/net_http.c中的函数httpd_appcall,比如在其中增加版本号等:
"<br>cfe v1.2, Release By afeng11, 2023.\r\n"
不过要记得把if 0和else部分的内容注释掉。


C、如果要让路由刚通电的时候,电源灯闪烁,那么需要修改asuswrt/release/src-rt-6.x/cfe/cfe/arch/mips/board/bcm947xx/src/bcm947xx_machdep.c中的board_pinmux_init函数/* Before CPU/DDR check, let power led light on */
uint i;
for (i=0; i<3; i++)
{
    LEDON();
    OSL_DELAY(150*1000);/单位为毫秒,这里是150毫秒
    LEDOFF();
    OSL_DELAY(150*1000);//单位为毫秒,这里是150毫秒
}
然后在文件头部添加,两个外部函数:
extern void LEDON(void);
extern void LEDOFF(void);
这样就实现了开启路由时,电源指示灯灯闪烁3次。

作者: afeng114    时间: 2023-4-23 09:12
帖子没法编辑了,哎,不能完善了
作者: tonyk    时间: 2023-4-24 15:09
不明觉厉,收藏学习下
作者: 臭老九    时间: 2023-4-26 16:32


加油 加油 3
作者: 臭老九    时间: 2023-4-27 15:50



加油 加油 4
作者: 臭老九    时间: 2023-5-2 08:40
加油 加油 5
作者: wulishui    时间: 2023-5-2 11:27
刷错uboot会变砖,并且有严格的机型限制,甚至差一个GPIO的电位都启动不了,开源仓库剔除uboot也是不得已的事情
作者: afeng114    时间: 2023-5-3 11:29
wulishui 发表于 2023-5-2 11:27
刷错uboot会变砖,并且有严格的机型限制,甚至差一个GPIO的电位都启动不了,开源仓库剔除uboot也是不得已的 ...

对于不会的人来说,很难,对于开发者来说,简单
作者: 清风飘扬12    时间: 2023-5-4 09:10
我有一个bcm4708 刷来刷去,就是无线信号弱
作者: afeng114    时间: 2023-5-4 13:08
清风飘扬12 发表于 2023-5-4 09:10
我有一个bcm4708 刷来刷去,就是无线信号弱

你的是什么型号?信号弱可以分为硬件和软件,如果功放烧了或者不带功放,信号弱,此外有无天线。软件可能是你的nvram参数不对。
作者: 玛德陛下    时间: 2023-5-4 22:43
真是好多英文
作者: 1311267126    时间: 2023-5-5 12:14
感谢分享!LZ辛苦了!
作者: 被蛤蟆揍了一顿    时间: 2023-5-22 09:57
加油!!
作者: eeff11    时间: 2023-5-23 10:32
本帖最后由 eeff11 于 2023-5-23 10:36 编辑

谢谢楼主的经验之谈,可以再完善下。

期待第二篇,可以用d-link dir-885举例,编译CFE在 Nor flash,编译梅林在nand,如何救砖等等完善,还有再加上天邑6201A那个如何改变编译Aimesh 2.0,感觉可以出一本小教材,就是那个没有详细说的,肯定火遍全网,甚至可以出版教材,成为一代传奇,留下历史地位。
作者: hoeny22222    时间: 2023-5-23 20:51
楼主,我的恩兔ND-1就等你开发了,支持你。
作者: 被蛤蟆揍了一顿    时间: 2023-8-28 00:01
加油 加油 加油




欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4