本次移植以cleanwrt大神的u-boot_mt7620-master.zip为蓝本,以SDK4300里的u-boot为实验代码。
感谢Manfeel、cleanwrt、Piotr Dymac、uip的作者Adam Dunkels。
源码随后上传至github。
/u-boot-mt7688
蓝本代码网址如下:
首先保证SDK4300的u_boot能正常编译通过,环境OK。
我的主机win7,virtualbox,Xubuntu14.04.1@32bit
1、将u-boot_mt7620-master中的httpd目录全部复制到u-boot-mt7688。(此目录中包含一个java工具,运行需要java环境,过后再说)
$cp -rf u-boot_mt7620-master/httpd/ u-boot-mt7688/
2、将u-boot_mt7620-master中net目录下的httpd.c httpd.h 复制到u-boot-mt7688/net/目录。
$ cp -rf u-boot_mt7620-master/net/httpd.c u-boot-mt7688/net/
$ cp -rf u-boot_mt7620-master/net/httpd.h u-boot-mt7688/net/
3、更改顶层Makefile,在194行增加+LIBS +=httpd/libhttpd.a
4、更改net目录下的Makefile,在30行增加httpd.o
5、编辑u-boot-mt7688/net/net.c源码,在78行增加以下头文件包含。
/* for web failsafe mod , added by mango 20150525 */
#include "httpd.h"
#include "../httpd/uipopt.h"
#include "../httpd/uip.h"
#include "../httpd/uip_arp.h"
改后如下:
102行增加如下全局变量定义以及函数声明:
-
/* for web failsafe mod , added by mango 20150525 */
-
unsigned char *webfailsafe_data_pointer = NULL;
-
int webfailsafe_is_running = 0;
-
int webfailsafe_ready_for_upgrade = 0;
-
int webfailsafe_upgrade_type = WEBFAILSAFE_UPGRADE_TYPE_FIRMWARE;
-
void NetReceiveHttpd( volatile uchar * inpkt, int len );
-
extern int do_reset( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[] );
1172行增加接收函数,以便在web failsafe模式使用uip协议栈接收处理网络数据:
-
if ( webfailsafe_is_running ) {
-
NetReceiveHttpd( inpkt, len );
-
return;
-
}
在文件末尾增加三个函数,从蓝本的net/net.c中将后面三个函数粘贴到此。以#define BUF ((struct uip_eth_hdr *)&uip_buf[0])开头的那段代码。
至此,net.c文件修改完毕。
6、编辑u-boot-mt7688/lib_mips/board.c源码,在1291行找到board_init_r函数:找到1950行的OperationSelect调用,在此函数前增加如下代码:
-
/*web failsafe*/
-
int counter = 1;
-
udelay(500000);
-
if ( counter > 0 ) {
-
printf( "\n\nWPS button was pressed for %d seconds\nHTTP server is starting for firmware update...\n\n", counter );
-
eth_initialize(gd->bd);
-
NetLoopHttpd();
-
} else {
-
printf( "\n\nCatution: WPS button wasn't pressed or not long enough!\nContinuing normal boot...\n\n" );
-
}
-
/*failsafe
先保证能启动web failsafe模式,也就是counter==1强制进入该模式(ctrl+c退出)。
7、修改u-boot-mt7688/lib_generic/string.c文件,关闭STRSTR的编译选项。
8、修改u-boot-mt7688/include/net.h,在340行增加如下代码:
在362行增加两个函数的声明:
9、修改u-boot-mt7688/include/configs/rt2880.h文件,在99,100行设置IP,由于默认IP不太顺眼,我设置为
CONFIG_SERVERIP 192.168.1.10
CONFIG_IPADDR 192.168.1.20
这一点还请自便。
在该文件末尾位置,增加对web failsafe一些必要的参数设置:
将以下代码加在497行:
/*
* Web Failsafe configuration
*/
//#define WEBFAILSAFE_UPLOAD_RAM_ADDRESS CFG_LOAD_ADDR
#define WEBFAILSAFE_UPLOAD_RAM_ADDRESS 0x81000000
// U-Boot partition size and offset
#define WEBFAILSAFE_UPLOAD_UBOOT_ADDRESS CFG_FLASH_BASE
#define WEBFAILSAFE_UPLOAD_UBOOT_SIZE_IN_BYTES ( 128 * 1024 )
#define UPDATE_SCRIPT_UBOOT_SIZE_IN_BYTES "0x20000"
// Firmware partition offset
#define WEBFAILSAFE_UPLOAD_KERNEL_ADDRESS CFG_KERN_ADDR
// ART partition size and offset
#define WEBFAILSAFE_UPLOAD_ART_ADDRESS CFG_FACTORY_ADDR
#define WEBFAILSAFE_UPLOAD_ART_SIZE_IN_BYTES ( 64 * 1024 )
// max. firmware size <= (FLASH_SIZE - WEBFAILSAFE_UPLOAD_LIMITED_AREA_IN_BYTES)
#define WEBFAILSAFE_UPLOAD_LIMITED_AREA_IN_BYTES ( 320 * 1024 )
// progress state info
#define WEBFAILSAFE_PROGRESS_START 0
#define WEBFAILSAFE_PROGRESS_TIMEOUT 1
#define WEBFAILSAFE_PROGRESS_UPLOAD_READY 2
#define WEBFAILSAFE_PROGRESS_UPGRADE_READY 3
#define WEBFAILSAFE_PROGRESS_UPGRADE_FAILED 4
// update type
#define WEBFAILSAFE_UPGRADE_TYPE_FIRMWARE 0
#define WEBFAILSAFE_UPGRADE_TYPE_UBOOT 1
#define WEBFAILSAFE_UPGRADE_TYPE_ART 2
10、回到u-boot-mt7688顶层make clean;make编译出错,提示找不到gpio.h。
无奈,底层LED控制和WPS按键读写都没写,暂时先将net/httpd.c文件中的LED相关都注视掉。再编译即可。
接下来编译都没问题,看到
此时可以看到已经生成了uboot.bin文件,该文件可以用spi flash下载器刷到flash中测试了。
此次移植,涉及到的所有需要更改的文件如下(其中httpd代表整个目录):
不足:暂时还未将LED控制与BUTTON读取部分搞定,先暂时做一个版本,等全部搞定后再推送一次最终版本。
uboot启动:
浏览器访问: