数码之家

 找回密码
 立即注册
搜索
查看: 3116|回复: 26

博通mips架构路由固件和cfe编译经验杂谈

[复制链接]
发表于 2023-4-20 11:28:57 | 显示全部楼层 |阅读模式
本帖最后由 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。

cfe编译界面


ttl输出界面


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函数中,增加以下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +25 收起 理由
changeek + 25 原創內容

查看全部打赏

发表于 2023-4-20 12:07:55 | 显示全部楼层
CFE是BCM的MIPS路由用的BootLoader,AR和MTK这些MIPS路由用的BootLoader是Uboot,所以撸主这个标题我感觉不是很严谨...
回复 支持 反对

使用道具 举报

发表于 2023-4-20 12:19:10 | 显示全部楼层
邪恶海盗 发表于 2023-4-20 12:07
CFE是BCM的MIPS路由用的BootLoader,AR和MTK这些MIPS路由用的BootLoader是Uboot,所以撸主这个标题我感觉不是 ...

网件R6400 R7000的CPU以前他们也经常用CFE来形容
回复 支持 反对

使用道具 举报

发表于 2023-4-20 14:51:48 | 显示全部楼层
支持楼主分享,标记学习一下谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 17:38:09 | 显示全部楼层
578087463 发表于 2023-4-20 12:19
网件R6400 R7000的CPU以前他们也经常用CFE来形容

下一篇将是博通arm路由cfe和固件适配,就是针对R6400,R7000这一类的
回复 支持 反对

使用道具 举报

发表于 2023-4-20 21:15:24 | 显示全部楼层
支持楼主分享,等楼主完稿后好好拜读一下。
回复 支持 反对

使用道具 举报

发表于 2023-4-21 20:44:44 | 显示全部楼层
本帖最后由 f7077447 于 2023-4-21 20:45 编辑

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

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

回复 支持 反对

使用道具 举报

发表于 2023-4-22 07:56:03 来自手机浏览器 | 显示全部楼层
不错不错,学习怎么编译
回复 支持 反对

使用道具 举报

发表于 2023-4-22 19:23:25 | 显示全部楼层
没文化,看不懂
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 09:09:26 | 显示全部楼层
本帖最后由 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次。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 09:12:15 | 显示全部楼层
帖子没法编辑了,哎,不能完善了
回复 支持 反对

使用道具 举报

发表于 2023-4-24 15:09:29 | 显示全部楼层
不明觉厉,收藏学习下
回复 支持 反对

使用道具 举报

发表于 2023-5-2 11:27:18 | 显示全部楼层
刷错uboot会变砖,并且有严格的机型限制,甚至差一个GPIO的电位都启动不了,开源仓库剔除uboot也是不得已的事情
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-3 11:29:36 | 显示全部楼层
wulishui 发表于 2023-5-2 11:27
刷错uboot会变砖,并且有严格的机型限制,甚至差一个GPIO的电位都启动不了,开源仓库剔除uboot也是不得已的 ...

对于不会的人来说,很难,对于开发者来说,简单
回复 支持 反对

使用道具 举报

发表于 2023-5-4 09:10:44 | 显示全部楼层
我有一个bcm4708 刷来刷去,就是无线信号弱
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-3 13:30 , Processed in 0.218401 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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